OpenCV,功能与教程中的代码匹配

时间:2013-01-29 18:20:13

标签: c++ opencv

我从OpenCV教程页面复制了Feature Matching with FLANN的代码,并进行了以下更改:

  • 我使用了SIFT功能,而不是SURF;
  • 我修改了“良好匹配”的检查。而不是

    if( matches[i].distance < 2*min_dist )
    

我用过

    if( matches[i].distance <= 2*min_dist )

否则在将图像与自身进行比较时,我会得到零匹配。

  • 绘制关键点时修改的参数:

    drawMatches( img1, k1, img2, k2,
                     good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
                     vector<char>(), DrawMatchesFlags::DEFAULT);
    

我从INRIA-Holidays dataset的爱尔兰文件夹中的所有图片中提取了SIFT。然后我将每个图像与其他图像进行比较并绘制匹配。

然而,我在过去使用的任何其他SIFT / Matcher实现中都没有遇到过一个奇怪的问题:

  • 我匹配的图像的匹配很好。除了一些关键点之外,每个关键点都映射到自身。见上图。 Image matched against itselft
  • 当我将I与另一个图像J(J不等于I)匹配时,许多点被映射到同一个图像上。下面是一些例子。 Matches Matches Matches

是否有人使用过OpenCV教程中的相同代码并可以报告我的不同体验?

1 个答案:

答案 0 :(得分:1)

签出matcher_simple.cpp示例。它使用了一个似乎运行良好的强力匹配器。这是代码:

// detecting keypoints
SurfFeatureDetector detector(400);
vector<KeyPoint> keypoints1, keypoints2;
detector.detect(img1, keypoints1);
detector.detect(img2, keypoints2);

// computing descriptors
SurfDescriptorExtractor extractor;
Mat descriptors1, descriptors2;
extractor.compute(img1, keypoints1, descriptors1);
extractor.compute(img2, keypoints2, descriptors2);

// matching descriptors
BFMatcher matcher(NORM_L2);
vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);

// drawing the results
namedWindow("matches", 1);
Mat img_matches;
drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
imshow("matches", img_matches);
waitKey(0);