我无法使用此功能。基本上,我正在进行特征检测并与引用图像进行匹配。我想将匹配的功能叠加在输入图像的顶部。这是我的代码:
public Mat startProcessing(Mat inputImage) {
Imgproc.cvtColor(inputImage, rgb, Imgproc.COLOR_GRAY2RGB);
myFeatures.detect(rgb, keypoints);
descriptorExtractor.compute(inputImage, keypoints, imageDescriptors);
descriptorMatcher.match(templateDescriptors, imageDescriptors, matches);
Features2d.drawMatches(rgb, keypoints, templateImage, templateKeypoints, matches, rgb);
Imgproc.cvtColor(rgb, outputImage, Imgproc.COLOR_RGB2RGBA);
return outputImage;
}
这是Feature2d.drawMatches,特别是这个问题。根据我收到的Android错误,某些尺寸没有对齐。说实话,我什至不知道
drawMatches
在Android上应该如何工作,因为任何地方都没有文档。我想要做的是在inputImage顶部绘制匹配项。我已经开始使用
Feature2d.drawKeypoints
了,但是我不确定如何将MatOfDMatch matches
转换为MatOfKeypoint
对象。另外,我什至不确定MatOfDMatch是否是这样工作的-它内部没有与描述符相对应的关联性吗?抱歉,到处都是,我在使用OpenCV和Android时遇到了很大的困难。那里的C++文档很好,但是Android资料很少。谢谢你的帮助!
最佳答案
我注意到的第一件事是您正在将图像从一种颜色空间转换为另一种颜色空间。这有点令人困惑。如果要在灰度图像上绘制匹配,则无需执行此图像转换。
另一件事,您正在检测RGB图像上的关键点,然后从原始图像中提取描述符(如我所见,它是灰度的)
另外,我建议您检查函数内部是否具有相同类型的图像。只需在日志inputImage
对象中打印,然后查看两者是否均为CV_8UC3
类型或等效类型即可。基本上,您的代码应如下所示:
Mat imageOut = inputImage.clone();
Features2d.drawMatches(inputImage, keypoints, templateImage, templateKeypoints, matches, imageOut);
Highgui.imwrite("result_match.jpeg", imageOut);
回答另一个您的问题:
问:我不确定如何将
MatOfDMatch
匹配项转换为MatOfKeypoint
对象。答:您不需要这样做,因为
drawMatches
函数会接收输入图像以及模板图像的MatOfKeypoint
。然后,当您传递MatOfDMatch
时,它将在匹配的接收到的kypoint之间绘制匹配项。问:我也不知道
MatOfDMatch
是否是这样工作的-它内部是否具有与描述符相对应的关联性?A:是的。如果要执行
matches.toList(0).queryIdx
和matches.toList(0).trainIdx
,您将获得inputImage
的关键点的索引,该索引与第一个匹配项的templateImage
的关键点相匹配。关于java - Android OpenCV : drawing matches with feature2d,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16207993/