2013-10-29 43 views
0

我正试图计算2张图片之间的对应关系,而实际上我对通信点的数量感兴趣,而不是通信本身,这样我就可以起诉它以获得最佳匹配图像。这是我下面的代码:在Opencv 2.4.6中筛选实现ubuntu

 #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。我拍了一张测试图像,并试图逐个将图像数据库运行。但每次我做,我的匹配大小总是。请注意,测试图像中的关键点也是。我试图找到测试图像的最佳匹配,但我没有明白为什么会发生这种情况。所有与数据库匹配的信函都给出了的结果。

这些是我的问题和疑问,请帮助我。 : -

  1. 如果以上使用的方法错误,我如何获得匹配数?

道歉,如果问题是非常基本的,但你的帮助是非常appreicated。

+0

我理解你的问题了吗?你在问为什么你有163场比赛。 - >所以我认为这是因为你的关键点的数量。你有163个关键点,并且匹配器试图在另一张图片中寻找关键点,并且如果他能找到他将会接受的关键点。所以你的比赛数量取决于你的关键点数量。如果你有163个关键点,你会得到163个关键点。如果你总是拥有相同的测试图像,你将会得到相同数量的匹配,因为他会找到相同的关键点(希望;))。 – retinotop

+0

@retinotop是的,我注意到了。但是dexcriptors的函数匹配不适用于这种方式吗?所有的163都不可能总是进行比赛。这意味着,这种匹配的实现在Opencv中是错误的 –

回答

1

FlannBasedMatcher.match()方法不会做你认为的事情;它将返回最佳匹配关键点。因此,您总是会有163场比赛,因为总会有一场比赛,即使比赛不是很好。

当匹配特征时,通常会发生什么情况:阈值然后应用于描述符距离;例如,如果任何匹配的距离大于阈值t,则它们将被拒绝。经过阈值处理后,匹配的数目通常用于衡量图像之间的相似度。我认为这是你期望得到的数字。

您的代码基本上构成了教程here的第一部分。如果您阅读本教程,您将看到我所描述的内容,根据距离对比赛进行阈值限制。