天天看点

OpenCV 模板匹配 OpenCV 模板匹配

<a target="_blank" href="http://coyee.com/article/10215-opencv-template-matching"></a>

在这篇教程中你将学会:

模板匹配是一项在给定的图片中查找模板图片的技术。.

OpenCV 模板匹配 OpenCV 模板匹配
OpenCV 模板匹配 OpenCV 模板匹配

上面的图片通过滑动匹配一个 tm_ccorr_normed 并得到 r 结果。最高匹配值显示为最佳匹配。如你所见,红色线条标识出来的是最高值,因此该位置(矩形)就是匹配的结果。

通过模板图片的滑动,这意味着模板图片每次滑动一个像素(从左到右,从上到下)。每个不同的位置上,都会计算出一个数值来表示匹配度。

OpenCV 模板匹配 OpenCV 模板匹配

r 阵列中最高值(或者最低值,这取决于匹配方法的类型).

6 种方法:

method=cv_tm_sqdiff

OpenCV 模板匹配 OpenCV 模板匹配

method=cv_tm_sqdiff_normed

OpenCV 模板匹配 OpenCV 模板匹配

method=cv_tm_ccorr

OpenCV 模板匹配 OpenCV 模板匹配

method=cv_tm_ccorr_normed

OpenCV 模板匹配 OpenCV 模板匹配

method=cv_tm_ccoeff

OpenCV 模板匹配 OpenCV 模板匹配

where

OpenCV 模板匹配 OpenCV 模板匹配

method=cv_tm_ccoeff_normed

OpenCV 模板匹配 OpenCV 模板匹配

本程序主要功能:

加载图片以及要匹配的模板图片

使用 opencv 的 matchtemplate 函数执行匹配过程,并使用 6 种方法进行试验

对匹配输出进行规划化处理

定位匹配度最高的位置

在最高匹配的区域绘制矩形框

详细代码:

定义全局变量,注入图像、模板、结果阵列等等:

加载原图和模板图:

创建窗体来显示结果:

创建 trackbar 给匹配方法使用,当有变化时候回调 matchingmethod 方法.

等待用户键入任何键以退出程序.

检查回调函数,首先对原图做了个拷贝:

下一步创建结果阵列用来存储匹配结果,观察结果阵列的大小

执行模板匹配函数:

参数包含输入图片、模板图片,结果存放阵列以及匹配方法

对结果进行规范化:

使用 minmaxloc 在结果阵列中定位最大和最小的匹配度

该函数需要以下参数:

result: 源数组

&amp;minval 和 &amp;maxval: 用来存储结果中的最小和最大匹配度

&amp;minloc and &amp;maxloc: 数组中的最小和最大匹配对应的位置点.

mat(): 可选的掩码值

对前两个方法 ( cv_sqdiff 和 cv_sqdiff_normed ) 来说最低值表示最佳匹配。而其他的方法则是值越高匹配度越高。因此我们在 matchloc 变量中保存相应的值:

显示原图以及结果阵列,并在最高匹配的位置绘制矩形::

测试程序的原图:

OpenCV 模板匹配 OpenCV 模板匹配

测试程序的模板图:

OpenCV 模板匹配 OpenCV 模板匹配

生成下列的结果图(前面使用的是标准方法: sqdiff, ccorr 和 ccoeff, 下面是经过规范化后的版本). 前三个图里,第一个图最黑表示最佳匹配,第2、3个图则是最亮为最佳匹配。

OpenCV 模板匹配 OpenCV 模板匹配
OpenCV 模板匹配 OpenCV 模板匹配
OpenCV 模板匹配 OpenCV 模板匹配
OpenCV 模板匹配 OpenCV 模板匹配
OpenCV 模板匹配 OpenCV 模板匹配
OpenCV 模板匹配 OpenCV 模板匹配

正确的匹配结果如下图所示 (黑色方框为匹配区域)。需要注意的是 ccorr 和 ccdeff 给出了错误的匹配,但是这些错误的匹配经过规范化后结果就正确了。这是因为我们使用了最高匹配而不是可能的高匹配。

OpenCV 模板匹配 OpenCV 模板匹配

继续阅读