\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
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)
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_;
using namespace std;\r
using namespace cv;\r
using namespace cv::detail;\r
+\r
#ifndef ANDROID\r
using namespace cv::gpu;\r
#endif\r
\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
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");