9

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

我的图像不是固定分辨率,所以我将其放大到标准的 800x600。现在,当我的源图像分辨率很差时说 300x300,结果很普通。我在模板参数中使用 method=CV_TM_CCOEFF_NORMED 并且即使是准确匹配的分数也很低(在 0 到 1.0 的范围内低至 0.4),这让我很难自信地说出徽标是否存在。我对此有两个问题:

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

2 - 任何替代方法!:)

让我知道是否有任何不清楚的地方!

编辑(附加信息):正如评论中所讨论的,我附上了我当前的匹配技术,即缩放模板匹配。请注意,所附图像纯粹用于测试目的,并不是我正在使用的实际图像集(无法发布,因为图像是专有的)源图像来自youtube的屏幕截图 徽标图像从维基百科得到 输出图像使用模板匹配红色块表示最高分的最佳匹配

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

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

4

1 回答 1

3

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

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

OpenCV Python 高斯模糊

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

绘制直方图

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

比较直方图

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

Mat OriginalImage = imread("source.jpg", 0);
Rect RegionOfInterest = Rect(150, 150, 250, 250);
Mat ROIImage = OriginalImage(RegionOfInterest);

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

于 2013-03-12T16:40:48.770 回答