我无法让这个功能工作。基本上我正在做特征检测并与参考图像进行匹配。我想将匹配的特征叠加在输入图像的顶部。这是我的代码:
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 上应该如何工作,因为没有任何文档。
我想要做的就是在输入图像的顶部绘制匹配项。我已经让
Feature2d.drawKeypoints
开始工作,但我不确定如何将 MatOfDMatch matches
转换为 MatOfKeypoint
对象。另外,我什至不确定 MatOfDMatch 是否是这样工作的 - 它内部是否有一些与描述符对应的关联性?
我在 Android 上使用 OpenCV 时遇到了困难。那里的 C++ 文档很好,但 Android 材料却很少。
我注意到的第一件事是您正在将图像从一种颜色空间转换为另一种颜色空间。有点令人困惑。如果您想在灰度图像上绘制匹配,则无需执行此图像转换。 另外,您正在检测 RGB 图像上的关键点,然后从原始图像中提取描述符(我可以看到它是灰度)
我还建议您检查函数内部图像是否属于同一类型。只需打印 log
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
是否是这样工作的 - 它内部是否有一些与描述符相对应的关联性?
答:是的,有。如果您执行matches.toList(0).queryIdx
和matches.toList(0).trainIdx
,您将获得inputImage
关键点的索引,该索引与第一场比赛中templateImage
的关键点相匹配。