本文为原创文章,未经本人允许,禁止转载。转载请注明出处。
1.模板匹配
模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。
模板图像在待检测的图像上,从左到右,从上到下进行遍历,并计算模板与待检测图像重叠部分的匹配度。
OpenCV提供了六种计算模板匹配程度的方式:
👉TM_SQDIFF=0
(值越小,匹配度越高):
$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=1
(TM_SQDIFF
的归一化):
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
(值越大,匹配度越高):
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=3
(TM_CCORR
的归一化):
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
(值越大,匹配度越高):
其中:
\[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=5
(TM_CCOEFF
的归一化):
2.相关API
1
2
3
4
5
6
7
void matchTemplate(
InputArray image,
InputArray templ,
OutputArray result,
int method,
InputArray mask = noArray()
);
参数解释:
InputArray image
:待检测图像。必须为8位或32位浮点型图像。InputArray templ
:模板图像。大小不应超过待检测图像,和待检测图像类型相同。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))$位置。int method
:模板匹配程度的计算方式。详见第1部分。InputArray mask
:和模板大小一样。通道数可以为1,或者和模板通道数一样。mask其实就是起到对模板加权的作用。