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



