0

经过几个小时的研究,我仍然找不到匹配关键点所属的“火车”图像的索引。我的意思是

FeatureDetector surfDetector = FeatureDetector.create(FeatureDetector.FAST);

MatOfKeyPoint vector = new MatOfKeyPoint();

surfDetector.detect( mImg, vector );

DescriptorExtractor siftDescriptor =DescriptorExtractor.create(DescriptorExtractor.BRIEF);

Mat descriptors=new Mat();

siftDescriptor.compute(mImg, vector, descriptors);

DescriptorMatcher matcherBruteForce=DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_SL2);

List<MatOfDMatch> matches = new ArrayList<MatOfDMatch>(); 

matcherBruteForce.match(descriptors, descriptors, matches, 2);

我只是以相同的图像为例。在此之后,如何找到匹配的关键点所属的“火车”图像的索引?

4

2 回答 2

2

我认为你遗漏了一些东西:可能,你试图找到一个特定的对象,然后你试图在几个图像的集合中找到与你正在寻找的对象的关键点“最佳匹配”的图像为了。只需查看您提供的示例代码,您就可以提取未知图像的所有 SIFT/SURF 关键点,并在对象关键点和当前图像之间应用匹配器。您需要的是某种指标,可以告诉您图像之间的匹配程度。最简单的方法是计算匹配关键点的数量。然后,您只需要记住您的集合中的哪个图像导致了最大数量的匹配关键点。匹配关键点的数量可能不是最好的指标,

顺便说一句,您的代码非常混乱:您声明了一个名为 surfDetector 的特征检测器,但实例化了一个“FAST”检测器。您声明了一个名为 siftDescriptor 的特征提取器,但实例化了一个“BRIEF”提取器。我建议您在存在时保留相同的检测器和提取器,例如 SURF 检测器/提取器。

于 2012-09-18T12:42:36.820 回答
1

我想这就是您要查找的内容,只需根据您的情况调整变量名称即可:

//scene = query; object = train

Point point1 = keypoints_scene.get( matches.get(i).queryIdx ).pt;

Point point2  = keypoints_object.get( matches.get(i).trainIdx ).pt ;

要找到最佳匹配,请执行以下操作,每个匹配都有一个名为距离的参数。距离最小的那个是最好的匹配。因此,您遍历所有匹配项的列表并找到距离最小的匹配项...

float min_dist = Float.MAX_VALUE;
int min_position = 0;
for( int i=0; i<matches.size(); i++) {
   if( matches.get(i).distance < min_dist ) {
      min_dist = matches.get(i).distance;
      min_position = i;
   }                    
}

Point best_point_scene   = keypoints_scene.get( matches.get(min_position).queryIdx ).pt;
Point best_point_object  = keypoints_object.get( matches.get(min_position).trainIdx ).pt ;
于 2012-09-18T10:34:16.300 回答