我正在尝试计算两个图像之间的对应关系,并且我实际上对对应点的数量感兴趣,而不是对应关系本身,因此我可以起诉它以获得最佳匹配图像。这是我的以下代码:
#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;
}
我已从link1和link2获取了我的代码。我所有的图像都是320X240。我拍了一张测试图像并尝试逐个在图像数据库上运行它。但每次我这样做,我的比赛大小总是 163 。请注意,测试图像中的关键点也是 163 。我试图找到测试图像的最佳匹配,但我不知道为什么会发生这种情况。所有与数据库匹配的对应关系都会得到 163 的结果。
这些是我的疑问和疑惑,请帮助我。 : -
道歉,如果问题非常简陋,但你的帮助很多。
答案 0 :(得分:1)
FlannBasedMatcher.match()
方法没有按照您的想法执行;它将返回每个关键点的最佳匹配。因此,您总会有163场比赛,因为总会有最佳比赛,即使比赛不是很好。
匹配特征时通常会发生的情况是,阈值随后应用于描述符距离;例如,如果任何匹配的距离大于阈值t
,则拒绝它们。在阈值处理之后, good 的数量通常用于测量图像之间的相似性。我想这是你期望获得的数字。
您的代码基本上构成了教程here的第一部分。如果您阅读本教程,您将看到我所描述的内容,根据距离对匹配进行阈值处理。