OpenCV BFMatcher - 忽略误报

时间:2015-02-20 03:53:11

标签: opencv computer-vision sift brute-force

有人可以描述一个忽略BFMatcher误报的好程序吗?

enter image description here

我在场景中定义要查找的图像,使用SiftFeatureDetector,SiftDescriptorExtractor,然后使用BFMatcher。在搜索正确的标记时,我发现匹配没有问题,但我想让我的代码对于误报更加健壮。

//Detect keypoints using ORB Detector
SiftFeatureDetector detector;
vector<KeyPoint> keypoints1, keypoints2; 
detector.detect(im1, keypoints1);
detector.detect(im2, keypoints2);

//Draw keypoints on images
Mat display1, display2;
drawKeypoints(im1, keypoints1, display1, Scalar(0,0,255));
drawKeypoints(im2, keypoints2, display2, Scalar(0,0,255));

//Extract descriptors
SiftDescriptorExtractor extractor;
Mat descriptors1, descriptors2;
extractor.compute( im1, keypoints1, descriptors1 );
extractor.compute( im2, keypoints2, descriptors2 );

BFMatcher matcher(NORM_L1, true);
vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);

我试图通过跳过过滤掉误报:

if (matches.size() < 50) {
     //false positive - skip
} else {
     //perform actions
}

但这根本不健全。我想我看过一些关于使用半径匹配器的人的文章,但我找不到使用半径匹配Brute Force的良好描述。我检查了文档:http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_descriptor_matchers.html,但是我非常清楚我如何确定这个应用程序的min_dist / max_dist是什么?

对于你们中的一些人,我确信这是一个非常简单的答案 - 非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

你需要过滤匹配的距离。 请注意距离取决于您在BFMatcher中选择的标准。

这是openCV样本的例子:

double min_dist = 100;
for( int i = 0; i < descriptors_object.rows; i++ )
   { double dist = matches[i].distance;
        if( dist < min_dist ) min_dist = dist;
   }

 /** Keep only "good" matches (i.e. whose distance is less than 3*min_dist ) **/
  std::vector< DMatch > good_matches;
  for( int i = 0; i < descriptors_object.rows; i++ )
  { if( matches[i].distance < 3*min_dist )
     { good_matches.push_back( matches[i]); }
  }