在 Opencv 2.4.6 ubuntu 中筛选实现

Sift implementation in Opencv 2.4.6 ubuntu

本文关键字:筛选 实现 ubuntu Opencv      更新时间:2023-10-16

我正在尝试计算 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;
     }

我从链接 1 和链接 2 中获取了我的代码。我所有的图像都是320X240。我拿了一个测试图像,并尝试在图像数据库上逐个运行它。但每次我这样做,我的比赛大小总是163。请注意,测试图像中的关键点也是 163。我正在尝试为测试图像找到最佳匹配项,但我不知道为什么会发生这种情况。与数据库的所有对应匹配都给出 163 的结果。

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

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

抱歉,如果问题非常简陋,但您的帮助非常感激。

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

匹配特征时通常发生的情况是,然后将阈值应用于描述符距离;例如,如果任何匹配的距离大于阈值t,则它们将被拒绝。 阈值化后的良好匹配数通常用于衡量图像之间的相似性。 我认为这是您期望获得的数字。

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