我无法使用此功能。基本上我正在进行特征检测并与参考图像匹配。我想在输入图像上叠加匹配的要素。这是我的代码:
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;
}
这是Features2d.drawMatches,特别是问题。根据我得到的Android错误,一些维度没有排队。说实话,我甚至不确定drawMatches
应该如何在Android上运行,因为在任何地方都没有文档。
我希望能够做的是在inputImage上绘制匹配项。我已经Feature2d.drawKeypoints
工作,但我不确定如何将MatOfDMatch matches
转换为MatOfKeypoint
对象。此外,我甚至不确定MatOfDMatch是如何工作的 - 它是否与描述符对应的内部有一些关联性?
很抱歉,到处都是,我很难在Android上使用OpenCV。那里的C ++文档很好,但Android材料的方式却很少。谢谢你的帮助!
答案 0 :(得分:6)
我注意到的第一件事是你将图像从一个色彩空间转换为另一个色彩空间。这让人感到困惑。如果要在灰度图像上绘制匹配项,则无需执行此图像转换。 另外,你正在检测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
时,它会在匹配的接收点之间进行匹配。
问:我甚至不确定MatOfDMatch
是如何工作的 - 它是否与描述符对应的内部有一些关联性?
答:是的。如果您执行matches.toList(0).queryIdx
和matches.toList(0).trainIdx
,您将获得inputImage
的关键点索引,该关键点与第一场比赛的templateImage
关键点匹配。