小编典典

Android OpenCV:绘图与feature2d匹配

java

我无法使用此功能。基本上,我正在进行特征检测并与参考图像进行匹配。我想将匹配的功能叠加在输入图像的顶部。这是我的代码:

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 matchesMatOfKeypoint对象。另外,我什至不确定MatOfDMatch的工作方式-它内部是否与描述符相对应,具有某种关联性?

抱歉,到处都是,我很难在Android上使用OpenCV。那里的C ++文档很好,但是Android资料很少。谢谢你的帮助!


阅读 216

收藏
2020-11-19

共1个答案

小编典典

我注意到的第一件事是您正在将图像从一种颜色空间转换为另一种颜色空间。这有点令人困惑。如果要在灰度图像上绘制匹配,则无需执行此图像转换。另一件事,您正在检测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).queryIdxmatches.toList(0).trainIdx您将获得inputImage的关键点的索引,该索引与templateImage第一次匹配的的关键点相匹配。

2020-11-19