From 94f72ae876434aa8b911776863b24dc6973375fb Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Fri, 21 Oct 2011 08:40:10 +0000 Subject: [PATCH] Stitching: added grid option to OrbFeaturesFinder --- .../opencv2/stitching/detail/matchers.hpp | 3 +- modules/stitching/src/matchers.cpp | 36 +++++++++++++++++-- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/modules/stitching/include/opencv2/stitching/detail/matchers.hpp b/modules/stitching/include/opencv2/stitching/detail/matchers.hpp index 665de737cb..674b4a519f 100644 --- a/modules/stitching/include/opencv2/stitching/detail/matchers.hpp +++ b/modules/stitching/include/opencv2/stitching/detail/matchers.hpp @@ -92,12 +92,13 @@ private: class CV_EXPORTS OrbFeaturesFinder : public FeaturesFinder { public: - OrbFeaturesFinder(size_t n_features = 1500, const ORB::CommonParams & detector_params = ORB::CommonParams(1.3, 5)); + OrbFeaturesFinder(Size _grid_size = Size(4,4), size_t n_features = 1500, const ORB::CommonParams & detector_params = ORB::CommonParams(1.3, 5)); private: void find(const Mat &image, ImageFeatures &features); Ptr orb; + Size grid_size; }; diff --git a/modules/stitching/src/matchers.cpp b/modules/stitching/src/matchers.cpp index b1a2f84a45..ec6eac5bcd 100644 --- a/modules/stitching/src/matchers.cpp +++ b/modules/stitching/src/matchers.cpp @@ -337,9 +337,10 @@ void SurfFeaturesFinder::find(const Mat &image, ImageFeatures &features) } } -OrbFeaturesFinder::OrbFeaturesFinder(size_t n_features, const ORB::CommonParams & detector_params) +OrbFeaturesFinder::OrbFeaturesFinder(Size _grid_size, size_t n_features, const ORB::CommonParams & detector_params) { - orb = new ORB(n_features, detector_params); + grid_size = _grid_size; + orb = new ORB(n_features * (99 + grid_size.area())/100/grid_size.area(), detector_params); } void OrbFeaturesFinder::find(const Mat &image, ImageFeatures &features) @@ -348,7 +349,36 @@ void OrbFeaturesFinder::find(const Mat &image, ImageFeatures &features) CV_Assert(image.type() == CV_8UC3); cvtColor(image, gray_image, CV_BGR2GRAY); - (*orb)(gray_image, Mat(), features.keypoints, features.descriptors); + if (grid_size.area() == 1) + (*orb)(gray_image, Mat(), features.keypoints, features.descriptors); + else + { + features.keypoints.clear(); + features.descriptors.release(); + + std::vector points; + Mat descriptors; + + for (int r = 0; r < grid_size.height; ++r) + for (int c = 0; c < grid_size.width; ++c) + { + int xl = c * gray_image.cols / grid_size.width; + int yl = r * gray_image.rows / grid_size.height; + int xr = (c+1) * gray_image.cols / grid_size.width; + int yr = (r+1) * gray_image.rows / grid_size.height; + + (*orb)(gray_image(Range(yl, yr), Range(xl, xr)), Mat(), points, descriptors); + + features.keypoints.reserve(features.keypoints.size() + points.size()); + for (std::vector::iterator kp = points.begin(); kp != points.end(); ++kp) + { + kp->pt.x += xl; + kp->pt.y += yl; + features.keypoints.push_back(*kp); + } + features.descriptors.push_back(descriptors); + } + } } #ifndef ANDROID