Android OpenCV:绘图与feature2d匹配

JDS*_*JDS 5 java android opencv

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

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;
}
Run Code Online (Sandbox Code Playgroud)

这是Features2d.drawMatches,这是特别的问题.根据我得到的Android错误,一些维度没有排队.说实话,我甚至不确定如何drawMatches在Android上运行,因为在任何地方都没有文档.

我想要做的是在inputImage上绘制匹配项.我已经Feature2d.drawKeypoints开始工作,但我不确定如何转换MatOfDMatch matchesMatOfKeypoint对象.此外,我甚至不确定MatOfDMatch是如何工作的 - 它是否与描述符对应的内部有一些关联性?

对不起,到处都是,我很难在Android上使用OpenCV.那里的C++文档很好,但Android材料的方式却很少.谢谢你的帮助!

and*_*riy 6

我注意到的第一件事是你将图像从一个颜色空间转换为另一个颜色空间.这让人感到困惑.如果要在灰度图像上绘制匹配项,则无需执行此图像转换.另外,你正在检测RGB图像上的关键点,然后从原始图像中提取描述符(我可以看到它是灰度)

如果图像属于同一类型,我建议您检查功能内部.只需在日志inputImage对象中打印,看看它们是类型CV_8UC3还是等效.基本上你的代码应该是这样的:

Mat imageOut = inputImage.clone();
Features2d.drawMatches(inputImage, keypoints, templateImage, templateKeypoints, matches, imageOut);
Highgui.imwrite("result_match.jpeg", imageOut); 
Run Code Online (Sandbox Code Playgroud)

回答你的另一个问题:

问:我不确定如何将MatOfDMatch匹配转换为MatOfKeypoint对象.答:您不需要这样做,因为drawMatches功能接收MatOfKeypoint输入图像和模板图像.然后当你传递MatOfDMatch它时,在匹配的接收的kypoints之间绘制匹配.

问:此外我甚至不确定这是否如何MatOfDMatch工作 - 它是否与描述符对应的内部有一些关联性?答:是的.如果你这样做matches.toList(0).queryIdx,matches.toList(0).trainIdx你将得到inputImage's关键点的索引,它与templateImage第一场比赛的关键点匹配.

  • 是的,我想是这样.转换匹配和关键点以列出`List <DMatch> matches_list = matches.toList(); List <KeyPoint> kp_list = keypoints.toList();`然后遍历列表`kp_list.get(matches_list.get(i). queryIdx)`并找到匹配关键点的最小和最大X和Y,以便遇到两个定义矩形的点.然后定义一个矩形`Rect roi = new Rect(new Point(minX,minY),new Point(maxX,maxY))`然后只做`Mat imageFinal = new Mat(inputImage,roi);`它只会裁剪匹配区域 (2认同)