Merge pull request #22505 from asmorkalov:as/matcher_score_thresh

pull/22542/head
Alexander Alekhin 2 years ago
commit 1646a21197
  1. 7
      modules/stitching/include/opencv2/stitching/detail/matchers.hpp
  2. 12
      modules/stitching/src/matchers.cpp

@ -180,19 +180,22 @@ public:
estimation used in the inliers classification step estimation used in the inliers classification step
@param num_matches_thresh2 Minimum number of matches required for the 2D projective transform @param num_matches_thresh2 Minimum number of matches required for the 2D projective transform
re-estimation on inliers re-estimation on inliers
@param matches_confindece_thresh Matching confidence threshold to take the match into account.
The threshold was determined experimentally and set to 3 by default.
*/ */
CV_WRAP BestOf2NearestMatcher(bool try_use_gpu = false, float match_conf = 0.3f, int num_matches_thresh1 = 6, CV_WRAP BestOf2NearestMatcher(bool try_use_gpu = false, float match_conf = 0.3f, int num_matches_thresh1 = 6,
int num_matches_thresh2 = 6); int num_matches_thresh2 = 6, double matches_confindece_thresh = 3.);
CV_WRAP void collectGarbage() CV_OVERRIDE; CV_WRAP void collectGarbage() CV_OVERRIDE;
CV_WRAP static Ptr<BestOf2NearestMatcher> create(bool try_use_gpu = false, float match_conf = 0.3f, int num_matches_thresh1 = 6, CV_WRAP static Ptr<BestOf2NearestMatcher> create(bool try_use_gpu = false, float match_conf = 0.3f, int num_matches_thresh1 = 6,
int num_matches_thresh2 = 6); int num_matches_thresh2 = 6, double matches_confindece_thresh = 3.);
protected: protected:
void match(const ImageFeatures &features1, const ImageFeatures &features2, MatchesInfo &matches_info) CV_OVERRIDE; void match(const ImageFeatures &features1, const ImageFeatures &features2, MatchesInfo &matches_info) CV_OVERRIDE;
int num_matches_thresh1_; int num_matches_thresh1_;
int num_matches_thresh2_; int num_matches_thresh2_;
double matches_confindece_thresh_;
Ptr<FeaturesMatcher> impl_; Ptr<FeaturesMatcher> impl_;
}; };

@ -365,7 +365,7 @@ void FeaturesMatcher::operator ()(const std::vector<ImageFeatures> &features, st
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
BestOf2NearestMatcher::BestOf2NearestMatcher(bool try_use_gpu, float match_conf, int num_matches_thresh1, int num_matches_thresh2) BestOf2NearestMatcher::BestOf2NearestMatcher(bool try_use_gpu, float match_conf, int num_matches_thresh1, int num_matches_thresh2, double matches_confindece_thresh)
{ {
CV_UNUSED(try_use_gpu); CV_UNUSED(try_use_gpu);
@ -383,11 +383,13 @@ BestOf2NearestMatcher::BestOf2NearestMatcher(bool try_use_gpu, float match_conf,
is_thread_safe_ = impl_->isThreadSafe(); is_thread_safe_ = impl_->isThreadSafe();
num_matches_thresh1_ = num_matches_thresh1; num_matches_thresh1_ = num_matches_thresh1;
num_matches_thresh2_ = num_matches_thresh2; num_matches_thresh2_ = num_matches_thresh2;
matches_confindece_thresh_ = matches_confindece_thresh;
} }
Ptr<BestOf2NearestMatcher> BestOf2NearestMatcher::create(bool try_use_gpu, float match_conf, int num_matches_thresh1, int num_matches_thresh2) Ptr<BestOf2NearestMatcher> BestOf2NearestMatcher::create(bool try_use_gpu, float match_conf, int num_matches_thresh1, int num_matches_thresh2,
double matches_confindece_thresh)
{ {
return makePtr<BestOf2NearestMatcher>(try_use_gpu, match_conf, num_matches_thresh1, num_matches_thresh2); return makePtr<BestOf2NearestMatcher>(try_use_gpu, match_conf, num_matches_thresh1, num_matches_thresh2, matches_confindece_thresh);
} }
@ -437,8 +439,8 @@ void BestOf2NearestMatcher::match(const ImageFeatures &features1, const ImageFea
matches_info.confidence = matches_info.num_inliers / (8 + 0.3 * matches_info.matches.size()); matches_info.confidence = matches_info.num_inliers / (8 + 0.3 * matches_info.matches.size());
// Set zero confidence to remove matches between too close images, as they don't provide // Set zero confidence to remove matches between too close images, as they don't provide
// additional information anyway. The threshold was set experimentally. // additional information anyway.
matches_info.confidence = matches_info.confidence > 3. ? 0. : matches_info.confidence; matches_info.confidence = matches_info.confidence > matches_confindece_thresh_ ? 0. : matches_info.confidence;
// Check if we should try to refine motion // Check if we should try to refine motion
if (matches_info.num_inliers < num_matches_thresh2_) if (matches_info.num_inliers < num_matches_thresh2_)

Loading…
Cancel
Save