OpenCV“坐标特定”匹配模板

时间:2018-05-08 02:41:05

标签: opencv matchtemplate

我有一个图像,我需要尽快检测对象。我也知道我只需要检测离中心最近的物体。

AFAIK Opencv的MatchTemplate有点像这样(伪代码):

for(x in width):
    for(y in height):
        value = calcSimilarity(inputImage, searchedImage, x, y)
        matched[x][y] = value

之后,我必须遍历生成的图像并找到离中心最近的点,这完全是浪费。

所以我想知道我是否可以这样做:

coordsGen = new CoordsGen() // a class that generates specific coords for me
while(!coordsGen.stop):
    x, y = coordsGen.next()
    value = calcSimilarity(inputImage, searchedImage, x, y)
    if(value > treshold)
        return x, y

基本上我需要的是calcSimilarity函数。这样我就可以大大优化这个过程。

1 个答案:

答案 0 :(得分:0)

一般来说,模板匹配的相似性评分方法有很多选择。*

OpenCV有3种可用的模板匹配模式:

  • 方差之和(欧几里德距离)
  • 互相关
  • Pearson相关系数

在OpenCV中,这三者中的每一个都有标准化/缩放版本:

  • 归一化的平方差之和
  • 归一化互相关
  • 归一化Pearson相关系数

您可以看到OpenCV docs under TemplateMatchModes中使用的实际公式,尽管这些公式与您在上述方法中随处可见的通用公式一致。

您可以自行编码匹配模板,而不是使用OpenCV。但请注意,OpenCV针对这些操作进行了优化,并且通常在模板匹配方面非常快速。 OpenCV使用DFT执行其中一些计算以减少计算负荷。例如,请参阅:

您也可以使用OpenCV的minMaxLoc()来查找最小/最大值,而不是循环自己。此外,您没有指定如何访问您的值,但并非所有查找方法都与其他方法一样快。请参阅How to scan images以查看最快的Mat访问操作。剧透:原始指针。

优化所需的主要加速功能是提前终止功能。但是,我认为通过自己编码可以实现更快的时间,除非模板通常所用的原始图像的子集明显更小。

如果图像非常大,减少搜索时间的更好方法是使用金字塔分辨率方法。基本上,模板和搜索图像是你的图像的1/2,其中1/2,其中的1/2,依此类推。然后,您可以在小的1/16或任何大小的图像上开始模板匹配,并找到模板的大致位置。然后,对于下一个图像大小,您也会这样做,但是您只搜索模板在之前比例的位置周围的一小部分。然后,每当您将图像尺寸增大到更接近原始尺寸时,您只需要寻找几个像素的小差异来更准确地确定位置。一般位置首先使用最小的缩放图像找到,与原始图像大小相比,只需要花费一小部分时间查找,然后您只需通过按比例放大来优化它。

*请注意,OpenCV不包含您可能在其他地方看到的其他模板匹配方法。特别是,OpenCV具有平方差的和,但没有绝对距离之和方法。相位差也用作相似性度量,但在OpenCV中不存在。无论哪种方式,互相关和方差的总和在图像处理中都非常常见,除非你有一个特殊的图像域,否则应该可以正常工作。