【OpenCV基础】第二十五课:模板匹配

模板匹配,cv::matchTemplate

Posted by x-jeff on October 21, 2021

本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.模板匹配

模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。

模板图像在待检测的图像上,从左到右,从上到下进行遍历,并计算模板与待检测图像重叠部分的匹配度。

OpenCV提供了六种计算模板匹配程度的方式:

👉TM_SQDIFF=0(值越小,匹配度越高):

\[R(x,y)= \sum _{x',y'} (T(x',y')-I(x+x',y+y'))^2\]

$T$为模板图像,$I$为待检测图像,$x’=[0,…,w-1];y’=[0,…,h-1]$,其中,$w,h$为模板的宽和高(下同)。

with mask:

\[R(x,y)= \sum _{x',y'} \left( (T(x',y')-I(x+x',y+y')) \cdot M(x',y') \right)^2\]

M为mask(下同)。

👉TM_SQDIFF_NORMED=1TM_SQDIFF的归一化):

\[R(x,y)= \frac{\sum_{x',y'} (T(x',y')-I(x+x',y+y'))^2}{\sqrt{\sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}}\]

with mask:

\[R(x,y)= \frac{\sum _{x',y'} \left( (T(x',y')-I(x+x',y+y')) \cdot M(x',y') \right)^2}{\sqrt{\sum_{x',y'} \left( T(x',y') \cdot M(x',y') \right)^2 \cdot \sum_{x',y'} \left( I(x+x',y+y') \cdot M(x',y') \right)^2}}\]

👉TM_CCORR=2(值越大,匹配度越高):

\[R(x,y)= \sum _{x',y'} (T(x',y') \cdot I(x+x',y+y'))\]

with mask:

\[R(x,y)= \sum _{x',y'} (T(x',y') \cdot I(x+x',y+y') \cdot M(x',y')^2)\]

👉TM_CCORR_NORMED=3TM_CCORR的归一化):

\[R(x,y)= \frac{\sum_{x',y'} (T(x',y') \cdot I(x+x',y+y'))}{\sqrt{\sum_{x',y'}T(x',y')^2 \cdot \sum_{x',y'} I(x+x',y+y')^2}}\]

with mask:

\[R(x,y)= \frac{\sum_{x',y'} (T(x',y') \cdot I(x+x',y+y') \cdot M(x',y')^2)}{\sqrt{\sum_{x',y'} \left( T(x',y') \cdot M(x',y') \right)^2 \cdot \sum_{x',y'} \left( I(x+x',y+y') \cdot M(x',y') \right)^2}}\]

👉TM_CCOEFF=4(值越大,匹配度越高):

\[R(x,y)= \sum _{x',y'} (T'(x',y') \cdot I'(x+x',y+y'))\]

其中:

\[T'(x',y')=T(x',y') - 1/(w \cdot h) \cdot \sum _{x'',y''} T(x'',y'')\] \[I'(x+x',y+y')=I(x+x',y+y') - 1/(w \cdot h)\cdot \sum _{x'',y''} I(x+x'',y+y'')\]

with mask:

\[T'(x',y')=M(x',y') \cdot \left( T(x',y') - \frac{1}{\sum _{x'',y''} M(x'',y'')} \cdot \sum _{x'',y''} (T(x'',y'') \cdot M(x'',y'')) \right)\] \[I'(x+x',y+y')=M(x',y') \cdot \left( I(x+x',y+y') - \frac{1}{\sum _{x'',y''} M(x'',y'')} \cdot \sum _{x'',y''} (I(x+x'',y+y'') \cdot M(x'',y'')) \right)\]

👉TM_CCOEFF_NORMED=5TM_CCOEFF的归一化):

\[R(x,y)= \frac{ \sum_{x',y'} (T'(x',y') \cdot I'(x+x',y+y')) }{\sqrt{\sum_{x',y'}T'(x',y')^2 \cdot \sum_{x',y'} I'(x+x',y+y')^2}}\]

2.相关API

1
2
3
4
5
6
7
void matchTemplate( 
	InputArray image, 
	InputArray templ,
	OutputArray result, 
	int method, 
	InputArray mask = noArray() 
);

参数解释:

  1. InputArray image:待检测图像。必须为8位或32位浮点型图像。
  2. InputArray templ:模板图像。大小不应超过待检测图像,和待检测图像类型相同。
  3. OutputArray result:匹配的结果。必须是单通道32位浮点型图像。如果待检测图像的大小为$W\times H$,模板的大小为$w\times h$,则result的大小为$(W-w+1) \times (H-h+1)$。例如模板在待检测图像的左上角时,计算得到的相似度值会填到result的(0,0)位置,剩余的以此类推,模板在待检测图像的右下角时,计算得到的相似度值会填到result的$((W-w+1) , (H-h+1))$位置。
  4. int method:模板匹配程度的计算方式。详见第1部分。
  5. InputArray mask:和模板大小一样。通道数可以为1,或者和模板通道数一样。mask其实就是起到对模板加权的作用。

3.代码地址

  1. 模板匹配