5

我无法让这个功能工作。基本上我正在做特征检测并与参考图像匹配。我想在我的输入图像上覆盖匹配的特征。这是我的代码:

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 matchesMatOfKeypoint对象。此外,我什至不确定 MatOfDMatch 是否是这样工作的——它内部是否有一些与描述符相对应的关联性?

很抱歉到处都是,我很难将 OpenCV 与 Android 一起使用。那里的 C++ 文档很好,但是 Android 材料的方式很少。谢谢你的帮助!

4

1 回答 1

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对象。A:你不需要这样做,因为drawMatches函数接收MatOfKeypoint输入图像和模板图像。然后,当您通过MatOfDMatch它时,它会在匹配的接收到的 kypoint 之间绘制匹配。

问:我什至不确定这是否是这样MatOfDMatch工作的——它内部不是有一些与描述符相对应的关联性吗?答:是的。如果您愿意matches.toList(0).queryIdxmatches.toList(0).trainIdx您将获得inputImage' 关键点的索引,该索引与第一个匹配的templateImage' 关键点匹配。

于 2013-04-25T22:15:27.080 回答