我无法使用此功能。基本上我正在做特征检测并与引用图像匹配。我想将匹配的特征叠加在我的输入图像之上。这是我的代码:
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 匹配
转换为 MatOfKeypoint
对象。此外,我什至不确定 MatOfDMatch 是否是这样工作的——它内部是否有一些与描述符对应的关联性?
很抱歉到处都是,我在 Android 上使用 OpenCV 真的很难。那里的 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
对象。
A:你不需要这样做,因为drawMatches
函数接收输入图像和模板图像的MatOfKeypoint
。然后,当您传递 MatOfDMatch
时,它会在匹配的接收到的 kypoint 之间绘制匹配项。
问:我什至不确定 MatOfDMatch
是否就是这样工作的 - 它内部是否有一些与描述符对应的关联性?
A: 是的。如果您执行 matches.toList(0).queryIdx
和 matches.toList(0).trainIdx
您将获得 inputImage
的索引s 关键点,与 templateImage
的第一个匹配关键点匹配。
关于java - 安卓 OpenCV : drawing matches with feature2d,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16207993/