<a target="_blank" href="http://coyee.com/article/10215-opencv-template-matching"></a>
在这篇教程中你将学会:
模板匹配是一项在给定的图片中查找模板图片的技术。.
上面的图片通过滑动匹配一个 tm_ccorr_normed 并得到 r 结果。最高匹配值显示为最佳匹配。如你所见,红色线条标识出来的是最高值,因此该位置(矩形)就是匹配的结果。
通过模板图片的滑动,这意味着模板图片每次滑动一个像素(从左到右,从上到下)。每个不同的位置上,都会计算出一个数值来表示匹配度。
r 阵列中最高值(或者最低值,这取决于匹配方法的类型).
6 种方法:
method=cv_tm_sqdiff
method=cv_tm_sqdiff_normed
method=cv_tm_ccorr
method=cv_tm_ccorr_normed
method=cv_tm_ccoeff
where
method=cv_tm_ccoeff_normed
本程序主要功能:
加载图片以及要匹配的模板图片
使用 opencv 的 matchtemplate 函数执行匹配过程,并使用 6 种方法进行试验
对匹配输出进行规划化处理
定位匹配度最高的位置
在最高匹配的区域绘制矩形框
详细代码:
定义全局变量,注入图像、模板、结果阵列等等:
加载原图和模板图:
创建窗体来显示结果:
创建 trackbar 给匹配方法使用,当有变化时候回调 matchingmethod 方法.
等待用户键入任何键以退出程序.
检查回调函数,首先对原图做了个拷贝:
下一步创建结果阵列用来存储匹配结果,观察结果阵列的大小
执行模板匹配函数:
参数包含输入图片、模板图片,结果存放阵列以及匹配方法
对结果进行规范化:
使用 minmaxloc 在结果阵列中定位最大和最小的匹配度
该函数需要以下参数:
result: 源数组
&minval 和 &maxval: 用来存储结果中的最小和最大匹配度
&minloc and &maxloc: 数组中的最小和最大匹配对应的位置点.
mat(): 可选的掩码值
对前两个方法 ( cv_sqdiff 和 cv_sqdiff_normed ) 来说最低值表示最佳匹配。而其他的方法则是值越高匹配度越高。因此我们在 matchloc 变量中保存相应的值:
显示原图以及结果阵列,并在最高匹配的位置绘制矩形::
测试程序的原图:
测试程序的模板图:
生成下列的结果图(前面使用的是标准方法: sqdiff, ccorr 和 ccoeff, 下面是经过规范化后的版本). 前三个图里,第一个图最黑表示最佳匹配,第2、3个图则是最亮为最佳匹配。
正确的匹配结果如下图所示 (黑色方框为匹配区域)。需要注意的是 ccorr 和 ccdeff 给出了错误的匹配,但是这些错误的匹配经过规范化后结果就正确了。这是因为我们使用了最高匹配而不是可能的高匹配。