2013-04-25 90 views
5

我无法使此功能正常工作。基本上我正在做功能检测和匹配的参考图像。我想在我的输入图像上叠加匹配的功能。这里是我的代码:Android OpenCV:与feature2d绘图匹配

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 matches转换为MatOfKeypoint对象。另外我甚至不确定这是MatOfDMatch的工作原理 - 它是否与描述符中的关联性相关?

对不起,我在使用OpenCV与Android非常困难。那里的C++文档很好,但是Android材料的用处不大。谢谢你的帮助!

回答

6

我注意到的第一件事是您将图像从一个颜色空间转换为另一个颜色空间。这有点令人困惑。如果您想在灰度图像上绘制匹配图像,则不需要执行此图像转换。 其他的事情,你正在检测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时,它会在匹配的接收kypoints之间绘制匹配。

问:另外我甚至不确定MatOfDMatch是如何工作的 - 它是否具有与描述符相对应的一些关联性? A:是的。如果你会做matches.toList(0).queryIdxmatches.toList(0).trainIdx你会得到inputImage的关键点索引,这与templateImage的第一场比赛的关键点相匹配。

+0

感谢迄今。我开始使用imageOut = inputImage.clone(),这可以让drawMatches工作。然而,我想要返回这个imageOut作为用户在相机上看到的,但尺寸稍有不同 - 它是704 * 480,而不是我的相机分辨率为640 * 480。鉴于我的模板图像的宽度为64,看起来像drawMatches将它们放在一起。我可以在输入图像的匹配区域上显示矩形或其他东西吗? – JDS 2013-04-25 22:59:33

+2

是的,我认为是。变换匹配和关键点以列出'列表 matches_list = matches.toList();列表 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);'它只会裁剪匹配的区域 – andriy 2013-04-25 23:10:21