Added matching mask into pairwise matcher from stitching module
authorAlexey Spizhevoy <no@email>
Mon, 26 Sep 2011 09:24:45 +0000 (09:24 +0000)
committerAlexey Spizhevoy <no@email>
Mon, 26 Sep 2011 09:24:45 +0000 (09:24 +0000)
modules/stitching/include/opencv2/stitching/detail/matchers.hpp
modules/stitching/include/opencv2/stitching/stitcher.hpp
modules/stitching/src/matchers.cpp
modules/stitching/src/stitcher.cpp

index 1a71de5..0dbd14f 100644 (file)
@@ -133,7 +133,9 @@ public:
 \r
     void operator ()(const ImageFeatures &features1, const ImageFeatures &features2, \r
                      MatchesInfo& matches_info) { match(features1, features2, matches_info); }\r
-    void operator ()(const std::vector<ImageFeatures> &features, std::vector<MatchesInfo> &pairwise_matches);\r
+\r
+    void operator ()(const std::vector<ImageFeatures> &features, std::vector<MatchesInfo> &pairwise_matches, \r
+                     const cv::Mat &mask = cv::Mat());\r
 \r
     bool isThreadSafe() const { return is_thread_safe_; }\r
 \r
index 1616b3d..775c0cd 100644 (file)
@@ -95,6 +95,13 @@ public:
     void setFeaturesMatcher(Ptr<detail::FeaturesMatcher> features_matcher)
         { features_matcher_ = features_matcher; }
 
+    const cv::Mat& matchingMask() const { return matching_mask_; }
+    void setMatchingMask(const cv::Mat &mask)
+    { 
+        CV_Assert(mask.type() == CV_8U && mask.cols == mask.rows);
+        matching_mask_ = mask.clone(); 
+    }
+
     Ptr<detail::BundleAdjusterBase> bundleAdjuster() { return bundle_adjuster_; }
     const Ptr<detail::BundleAdjusterBase> bundleAdjuster() const { return bundle_adjuster_; }
     void setBundleAdjuster(Ptr<detail::BundleAdjusterBase> bundle_adjuster)
@@ -130,6 +137,7 @@ private:
     double conf_thresh_;
     Ptr<detail::FeaturesFinder> features_finder_;
     Ptr<detail::FeaturesMatcher> features_matcher_;
+    cv::Mat matching_mask_;
     Ptr<detail::BundleAdjusterBase> bundle_adjuster_;
     bool do_wave_correct_;
     detail::WaveCorrectKind wave_correct_kind_;
index 187423f..5875342 100644 (file)
@@ -45,6 +45,7 @@
 using namespace std;\r
 using namespace cv;\r
 using namespace cv::detail;\r
+\r
 #ifndef ANDROID\r
 using namespace cv::gpu;\r
 #endif\r
@@ -340,14 +341,20 @@ const MatchesInfo& MatchesInfo::operator =(const MatchesInfo &other)
 \r
 //////////////////////////////////////////////////////////////////////////////\r
 \r
-void FeaturesMatcher::operator ()(const vector<ImageFeatures> &features, vector<MatchesInfo> &pairwise_matches)\r
+void FeaturesMatcher::operator ()(const vector<ImageFeatures> &features, vector<MatchesInfo> &pairwise_matches,\r
+                                  const Mat &mask)\r
 {\r
     const int num_images = static_cast<int>(features.size());\r
 \r
+    CV_Assert(mask.empty() || (mask.type() == CV_8U && mask.cols == num_images && mask.rows));\r
+    Mat_<uchar> mask_(mask);\r
+    if (mask_.empty())\r
+        mask_ = Mat::ones(num_images, num_images, CV_8U);\r
+\r
     vector<pair<int,int> > near_pairs;\r
     for (int i = 0; i < num_images - 1; ++i)\r
         for (int j = i + 1; j < num_images; ++j)\r
-            if (features[i].keypoints.size() > 0 && features[j].keypoints.size() > 0)\r
+            if (features[i].keypoints.size() > 0 && features[j].keypoints.size() > 0 && mask_(i, j))\r
                 near_pairs.push_back(make_pair(i, j));\r
 \r
     pairwise_matches.resize(num_images * num_images);\r
index cefbacb..1fbfe4c 100644 (file)
@@ -165,7 +165,7 @@ Stitcher::Status Stitcher::matchImages()
 
     LOG("Pairwise matching");
     t = getTickCount();
-    (*features_matcher_)(features_, pairwise_matches_);
+    (*features_matcher_)(features_, pairwise_matches_, matching_mask_);
     features_matcher_->collectGarbage();
     LOGLN("Pairwise matching, time: " << ((getTickCount() - t) / getTickFrequency()) << " sec");