OpenCV匹配模板

Aja*_*air 9 python opencv image-processing

我试图将我的徽标(模板)与一些图像相匹配.我的图像都是自然色的,我正在使用的方法是使用openCV中的cvMatchTemplate()并在源图像上运行模板(徽标).我将模板缩放到多个级别以找到最佳匹配.请注意,我只是在图像上找到数字印记的徽标,而不是场景中存在的徽标.例如:从这张图片中检测天空运动http://i56.tinypic.com/2v3j3wx.jpg(该图像纯粹用于表示和清晰我的任务,而不是我正在使用的图像

我的图像没有固定的分辨率,因此我将其缩放到标准的800x600.现在当我的源图像分辨率很差时说300x300,结果非常普通.我在模板参数中使用方法= CV_TM_CCOEFF_NORMED,即使是精确匹配的分数也很低(在0到1.0的范围内低至0.4),这使我很难自信地说明徽标是否存在.我有两个问题:

1 - 在opencv模板匹配中,它如何处理彩色图像.我试图从文档中理解,我的推论是它分别计算每个频道的得分,并且最好采取.如果是这样的话我不会更好地考虑所有三个渠道以获得更好的结果

2 - 任何替代方法!! :)

如果有任何事情不清楚,请告诉我!

编辑(附加信息):正如评论中所讨论的,我附加了我目前的匹配技术,即缩放模板匹配.请注意附加的图像纯粹是出于测试目的而不是我正在使用的实际图像集(不能发布,因为图像是proprieotry)源图像从youtube拍摄的屏幕截图 形象标识 来自维基百科 使用模板匹配输出图像 指示最佳匹配的红色块与最高分

尽管模板匹配,但此处获得的分数对于此最佳匹配为0.59.虽然相对来说它是一场比赛的好成绩,但仍然不够好,我无法确定所需的标志是否存在.在我的测试图像中,当屏幕上的徽标是透明的时,它仍会检测到徽标,但得分为0.3-0.4.使用SURF/SIFT可以获得更好的结果吗?

编辑(尝试使用SURF)我试图在opencv官方文档(minHessian = 2000)中运行一个SURF代码作为示例.这里链接 是输出.我不确定如何解释它(2,3点似乎在预期的边界内.这被认为是好的吗?还有什么进一步的建议吗? 在此输入图像描述 谢谢

Mat*_*ack 3

在执行模板匹配之前,您是否尝试在源图像上使用高斯模糊?这可能会给你更准确的结果,因为我认为源图像的质量导致了更差的匹配

OpenCV 文档中高斯模糊的链接:

OpenCV Python 高斯模糊

或者,您可以尝试对区域模板匹配建议进行直方图比较技术,以进一步确认返回的模板匹配相关性(即使很小)也是正确的值:

绘制直方图

绘制直方图是可选的,它可能对您自己的应用程序有用

比较直方图

^ 此方法计算图像(源和模板)的直方图以及它们之间的相关性...但是,您不需要整个源的直方图,只是模板匹配认为最佳相关性的位置,或其他一些位置在图像中,因此您想要获取感兴趣区域 (ROI) 的直方图,请参阅以下 C++ 代码:

Mat OriginalImage = imread("source.jpg", 0);
Rect RegionOfInterest = Rect(150, 150, 250, 250);
Mat ROIImage = OriginalImage(RegionOfInterest);
Run Code Online (Sandbox Code Playgroud)

这使您可以计算感兴趣区域的直方图。您应该获得模板的直方图和模板匹配认为您的模板位于源中的区域的直方图,并将它们进行比较以确认或反驳模板匹配输出