From e99b090871be695628437579cf77ca3f78579108 Mon Sep 17 00:00:00 2001 From: Alexey Spizhevoy Date: Mon, 26 Sep 2011 13:17:06 +0000 Subject: [PATCH] Fixed bug in ROI based features finder (stitching) --- modules/stitching/src/matchers.cpp | 18 ++++---- modules/stitching/test/test_main.cpp | 3 ++ modules/stitching/test/test_matchers.cpp | 73 ++++++++++++++++++++++++++++++++ modules/stitching/test/test_precomp.cpp | 1 + modules/stitching/test/test_precomp.hpp | 11 +++++ 5 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 modules/stitching/test/test_main.cpp create mode 100644 modules/stitching/test/test_matchers.cpp create mode 100644 modules/stitching/test/test_precomp.cpp create mode 100644 modules/stitching/test/test_precomp.hpp diff --git a/modules/stitching/src/matchers.cpp b/modules/stitching/src/matchers.cpp index 57a5970..4211d84 100644 --- a/modules/stitching/src/matchers.cpp +++ b/modules/stitching/src/matchers.cpp @@ -257,35 +257,37 @@ void FeaturesFinder::operator ()(const Mat &image, ImageFeatures &features) // TODO add tests for this function void FeaturesFinder::operator ()(const Mat &image, ImageFeatures &features, const vector &rois) { - vector roi_features; + vector roi_features(rois.size()); size_t total_kps_count = 0; - int total_descriptors_width = 0; + int total_descriptors_height = 0; for (size_t i = 0; i < rois.size(); ++i) { find(image(rois[i]), roi_features[i]); total_kps_count += roi_features[i].keypoints.size(); - total_descriptors_width += roi_features[i].descriptors.cols; + total_descriptors_height += roi_features[i].descriptors.rows; } features.img_size = image.size(); features.keypoints.resize(total_kps_count); - features.descriptors.create(1, total_descriptors_width, roi_features[0].descriptors.type()); + features.descriptors.create(total_descriptors_height, + roi_features[0].descriptors.cols, + roi_features[0].descriptors.type()); int kp_idx = 0; int descr_offset = 0; for (size_t i = 0; i < rois.size(); ++i) { - for (size_t j = 0; j < features.keypoints.size(); ++j, ++kp_idx) + for (size_t j = 0; j < roi_features[i].keypoints.size(); ++j, ++kp_idx) { features.keypoints[kp_idx] = roi_features[i].keypoints[j]; features.keypoints[kp_idx].pt.x += (float)rois[i].x; features.keypoints[kp_idx].pt.y += (float)rois[i].y; } - Mat subdescr = features.descriptors.colRange( - descr_offset, descr_offset + roi_features[i].descriptors.cols); + Mat subdescr = features.descriptors.rowRange( + descr_offset, descr_offset + roi_features[i].descriptors.rows); roi_features[i].descriptors.copyTo(subdescr); - descr_offset += roi_features[i].descriptors.cols; + descr_offset += roi_features[i].descriptors.rows; } } diff --git a/modules/stitching/test/test_main.cpp b/modules/stitching/test/test_main.cpp new file mode 100644 index 0000000..284b643 --- /dev/null +++ b/modules/stitching/test/test_main.cpp @@ -0,0 +1,3 @@ +#include "test_precomp.hpp" + +CV_TEST_MAIN("cv") diff --git a/modules/stitching/test/test_matchers.cpp b/modules/stitching/test/test_matchers.cpp new file mode 100644 index 0000000..424756f --- /dev/null +++ b/modules/stitching/test/test_matchers.cpp @@ -0,0 +1,73 @@ +/*M/////////////////////////////////////////////////////////////////////////////////////// +// +// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// +// By downloading, copying, installing or using the software you agree to this license. +// If you do not agree to this license, do not download, install, +// copy or use the software. +// +// +// Intel License Agreement +// For Open Source Computer Vision Library +// +// Copyright (C) 2000, Intel Corporation, all rights reserved. +// Third party copyrights are property of their respective owners. +// +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// * The name of Intel Corporation may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + +#include "test_precomp.hpp" + +using namespace cv; +using namespace std; + +TEST(SurfFeaturesFinder, CanFindInROIs) +{ + Ptr finder = new detail::SurfFeaturesFinder(); + Mat img = imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/lena.jpg"); + + vector rois; + rois.push_back(Rect(0, 0, img.cols / 2, img.rows / 2)); + rois.push_back(Rect(img.cols / 2, img.rows / 2, img.cols - img.cols / 2, img.rows - img.rows / 2)); + detail::ImageFeatures roi_features; + (*finder)(img, roi_features, rois); + + int tl_rect_count = 0, br_rect_count = 0, bad_count = 0; + for (size_t i = 0; i < roi_features.keypoints.size(); ++i) + { + Point2f pt = roi_features.keypoints[i].pt; + if (pt.x >= rois[0].x && pt.y >= rois[0].y && pt.x <= rois[0].br().x && pt.y <= rois[0].br().y) + tl_rect_count++; + else if (pt.x >= rois[1].x && pt.y >= rois[1].y && pt.x <= rois[1].br().x && pt.y <= rois[1].br().y) + br_rect_count++; + else + bad_count++; + } + + ASSERT_GT(tl_rect_count, 0); + ASSERT_GT(br_rect_count, 0); + ASSERT_EQ(bad_count, 0); +} \ No newline at end of file diff --git a/modules/stitching/test/test_precomp.cpp b/modules/stitching/test/test_precomp.cpp new file mode 100644 index 0000000..14a070e --- /dev/null +++ b/modules/stitching/test/test_precomp.cpp @@ -0,0 +1 @@ +#include "test_precomp.hpp" \ No newline at end of file diff --git a/modules/stitching/test/test_precomp.hpp b/modules/stitching/test/test_precomp.hpp new file mode 100644 index 0000000..13f1c79 --- /dev/null +++ b/modules/stitching/test/test_precomp.hpp @@ -0,0 +1,11 @@ +#ifndef __OPENCV_TEST_PRECOMP_HPP__ +#define __OPENCV_TEST_PRECOMP_HPP__ + +#include +#include +#include +#include +#include +#include + +#endif -- 2.7.4