From ee413b8026a2dbe1ed7449bd381584680738f75b Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Mon, 3 Oct 2011 08:44:28 +0000 Subject: [PATCH] Avoid duplicated surf extraction step when same parameters are used for detection and descriptors calculation --- .../opencv2/stitching/detail/matchers.hpp | 3 ++- modules/stitching/src/matchers.cpp | 24 +++++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/modules/stitching/include/opencv2/stitching/detail/matchers.hpp b/modules/stitching/include/opencv2/stitching/detail/matchers.hpp index a25ad3e6f9..70769d5865 100644 --- a/modules/stitching/include/opencv2/stitching/detail/matchers.hpp +++ b/modules/stitching/include/opencv2/stitching/detail/matchers.hpp @@ -79,13 +79,14 @@ class CV_EXPORTS SurfFeaturesFinder : public FeaturesFinder { public: SurfFeaturesFinder(double hess_thresh = 300., int num_octaves = 3, int num_layers = 4, - int num_octaves_descr = 4, int num_layers_descr = 2); + int num_octaves_descr = /*4*/3, int num_layers_descr = /*2*/4); private: void find(const Mat &image, ImageFeatures &features); Ptr detector_; Ptr extractor_; + Ptr surf; }; diff --git a/modules/stitching/src/matchers.cpp b/modules/stitching/src/matchers.cpp index a720c6a630..cbe8b4dae8 100644 --- a/modules/stitching/src/matchers.cpp +++ b/modules/stitching/src/matchers.cpp @@ -293,8 +293,15 @@ void FeaturesFinder::operator ()(const Mat &image, ImageFeatures &features, cons SurfFeaturesFinder::SurfFeaturesFinder(double hess_thresh, int num_octaves, int num_layers, int num_octaves_descr, int num_layers_descr) { - detector_ = new SurfFeatureDetector(hess_thresh, num_octaves, num_layers); - extractor_ = new SurfDescriptorExtractor(num_octaves_descr, num_layers_descr); + if (num_octaves_descr == num_octaves && num_layers_descr == num_layers) + { + surf = new SURF(hess_thresh, num_octaves, num_layers); + } + else + { + detector_ = new SurfFeatureDetector(hess_thresh, num_octaves, num_layers); + extractor_ = new SurfDescriptorExtractor(num_octaves_descr, num_layers_descr); + } } @@ -303,8 +310,17 @@ void SurfFeaturesFinder::find(const Mat &image, ImageFeatures &features) Mat gray_image; CV_Assert(image.depth() == CV_8U); cvtColor(image, gray_image, CV_BGR2GRAY); - detector_->detect(gray_image, features.keypoints); - extractor_->compute(gray_image, features.keypoints, features.descriptors); + if (surf == 0) + { + detector_->detect(gray_image, features.keypoints); + extractor_->compute(gray_image, features.keypoints, features.descriptors); + } + else + { + vector descriptors; + (*surf)(gray_image, Mat(), features.keypoints, descriptors); + features.descriptors = Mat(descriptors, true).reshape(1, (int)features.keypoints.size()); + } } -- GitLab