Java 如何找到“的索引”;“火车”;Android中匹配的关键点所属的图像

Java 如何找到“的索引”;“火车”;Android中匹配的关键点所属的图像,java,android,image-processing,opencv,image-recognition,Java,Android,Image Processing,Opencv,Image Recognition,经过几个小时的研究,我仍然找不到匹配关键点所属的“火车”图像的索引。我的意思是 FeatureDetector surfDetector = FeatureDetector.create(FeatureDetector.FAST); MatOfKeyPoint vector = new MatOfKeyPoint(); surfDetector.detect( mImg, vector ); DescriptorExtractor siftDescriptor =DescriptorExt

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

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);
FeatureDetector surfDetector=FeatureDetector.create(FeatureDetector.FAST);
MatOfKeyPoint矢量=新的MatOfKeyPoint();
surfDetector.detect(mImg,矢量);
descriptor rextractor siftDescriptor=descriptor rextractor.create(descriptor rextractor.BRIEF);
Mat描述符=新Mat();
计算(mImg、向量、描述符);
DescriptorMatcher matcherBruteForce=DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_SL2);
列表匹配项=新的ArrayList();
matcherBruteForce.match(描述符,描述符,匹配,2);

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

我猜这就是您要寻找的,只需根据您的情况调整变量名称:

//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 ;
float min_dist=float.MAX_值;
int min_位置=0;

对于(int i=0;i我想这就是您要寻找的,只需根据您的情况调整变量名即可:

//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 ;
float min_dist=float.MAX_值;
int min_位置=0;

对于(int i=0;i我认为您缺少了一些东西:可能,您试图在多个图像的集合中找到一个特定的对象,并试图找到“最佳匹配”的图像使用您要查找的对象的关键点。只需查看您提供的示例代码,就可以提取未知图像的所有SIFT/SURF关键点,并在对象关键点和当前图像之间应用匹配器。您需要的是某种度量,告诉您图像之间的匹配有多好。最简单的度量是计算匹配关键点的数量。然后,你只需要记住你收集的图像中的哪个图像导致了匹配关键点的最大数量。匹配关键点的数量可能不是最好的度量标准,你应该查阅大量关于使用SIFT和相关方法进行目标检测的文献,以找到一个最合适的方法适合你的目的


顺便说一下,您的代码相当混乱:您声明了一个名为surfDetector的功能检测器,但实例化了一个“快速”检测器。您声明了一个名为siftDescriptor的功能提取器,但实例化了一个“简短”检测器提取器。我建议您保留相同的检测器和提取器(当它们存在时),例如冲浪检测器/提取器。

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


顺便说一下,您的代码相当混乱:您声明了一个名为surfDetector的功能检测器,但实例化了一个“快速”检测器。您声明了一个名为siftDescriptor的功能提取器,但实例化了一个“简短”检测器提取器。我建议您保留相同的检测器和提取器(如果存在),例如冲浪检测器/提取器。

您没有单一的训练图像(mImg)?Remi,因为这只是一个例子,所以我使用与训练图像相同的图像,这是上面的示例。因为我对图像处理非常陌生,你能解释一下如何找到匹配关键点所属的“训练”图像的索引吗?你没有单一的训练图像(mImg)?Remi,因为这只是一个示例,所以我使用与训练图像相同的图像,这是上面的示例描述符。由于我对图像处理非常陌生,您能否向我解释如何找到匹配关键点所属的“训练”图像的索引?Rui Maeques,谢谢您的信息,但我只想找到“训练”的索引匹配的关键点所属的图像。我的意思是我想找到与查询图像最匹配的列车图像索引。因此,我可以使用最小距离的匹配来定义图像与参考图像之间的匹配程度吗?这是另一个问题,您应该查找stackoverflow以获得答案。我认为它有b伊恩回答。你能给我提供链接吗?谢谢你的信息,但我只想找到“火车”的索引匹配的关键点所属的图像。我的意思是我想找到与查询图像最匹配的列车图像索引。因此,我可以使用最小距离的匹配来定义图像与参考图像之间的匹配程度吗?这是另一个问题,您应该查找stackoverflow以获得答案。我认为它有been回答。你能给我提供链接吗?Thanksremi,SURF和SIFT已经移动到非自由模块,但我不知道如何安装。你能给我解释一下吗?谢谢。remi,SURF和SIFT已经移动到非自由模块,但我不知道如何安装