我正在尝试计算2张图像之间的对应关系,实际上我对对应点的数量感兴趣,而不是对对应关系本身感兴趣,以便我可以起诉以获得最佳匹配图像。这是我的以下代码:

     #include<iostream>
     #include<vector>
     #include<string>
     #include "cv.h"
     #include "highgui.h"
     #include "opencv2/imgproc/imgproc.hpp"
     #include "opencv2/highgui/highgui.hpp"
     #include "opencv2/legacy/legacy.hpp"
     #include "opencv2/objdetect/objdetect.hpp"
     #include "opencv2/nonfree/nonfree.hpp"
     #include "opencv2/nonfree/features2d.hpp"
     #include<stdio.h>

     using namespace cv;
     using namespace std;

     int main(int argc, char **argv)
     {
       Mat A = imread("/home/itachi/iTaggproj/frame6.jpg",CV_LOAD_IMAGE_COLOR);
       Mat src = imread("/home/itachi/iTaggproj/dataformatch/frame0.jpg",CV_LOAD_IMAGE_COLOR);

       SiftFeatureDetector detector( 0.05, 5.0 );
           SiftDescriptorExtractor extractor( 3.0 );

       vector<KeyPoint>keypoints1,keypoints2;
           detector.detect( A, keypoints1 );
           detector.detect( src, keypoints2 );

       int key1 = keypoints1.size();
           int key2 = keypoints2.size();
           printf("Keypoint1=%d \nKeypoint2=%d", key1, key2);

       // Feature descriptor computation
       Mat descriptor1,descriptor2;
       extractor.compute( A, keypoints1, descriptor1 );
       extractor.compute( src, keypoints2, descriptor2 );

       //match points to get correspondence
 //        BFMatcher matcher(NORM_L2);
       FlannBasedMatcher matcher;
       vector<DMatch>matches;
       matcher.match( descriptor1, descriptor2, matches );
       cout<<endl<<matches.size()<<endl;

       return 0;
     }

我已经从link1link2获得了代码。我所有的图像都是320X240。我拍摄了一张测试图像,并尝试在图像数据库中一个接一个地运行它。但是每次我匹配时,我的匹配大小始终为 163 。请注意,测试图像中的关键点也是 163 。我正在尝试找到测试图像的最佳匹配,但是我不知道为什么会发生这种情况。与数据库的所有对应关系匹配结果为 163

这些是我的疑问和疑问,请帮助我。 :-
  • 如果上面使用的方法不正确,如何获取匹配数?

  • 如果问题很初级,但您的帮助非常感谢,我们深表歉意。

    最佳答案

    FlannBasedMatcher.match()方法不会执行您认为的操作;它将为每个关键点返回最佳匹配。这样,您将始终有163个匹配项,因为即使不是一个很好的匹配项,也总是会有一个最佳匹配项。

    匹配特征时通常发生的是将阈值应用于描述符距离。因此,例如,如果任何匹配项的距离大于阈值t,则将其拒绝。阈值后,良好匹配的数量通常用于衡量图像之间的相似度。我认为这是您期望得到的数字。

    您的代码基本上构成了here教程的第一部分。如果您阅读了该教程,您将确切地看到我所描述的内容,其中根据匹配距离将匹配阈值定为阈值。

    关于c++ - Opencv 2.4.6 ubuntu中的Sift实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19652812/

    10-11 22:42