目标跟踪之模板匹配

       模板匹配TemplateMatching是在图像中寻找目标的方法之一。基本原理就是在一副图像中寻找和模板图像patch最相似的区域。

       在opencv中有对应的函数可以调用:

void matchTemplate(const Mat& image,const Mat& templ,Mat& result,int method);

        该函数的功能为,在输入原图像image中滑动框,寻找各个位置与模板图像templ的相似度,并将结果保存在结果矩阵result中,该矩阵的每一个点的亮度表示与模板temple的匹配程度,然后可以通过函数minMaxLocal定位矩阵result中的最大值(该函数也可以确定最小值)。问题:通过什么区评价两个图像相似呢?这个评价准则就是参数method,它可以有一下值(匹配的方法):

CV_TM_SQDIFF 平方差匹配法,最好的匹配为0,值越大匹配越差;

CV_TM_SQDIFF_NORMED 归一化平方差匹配法;

CV_TM_CCORR 相关匹配法,采用乘法操作,数值越大表明匹配越好;

CV_TM_CCORR_NORMED 归一化相关匹配法;

CV_TM_CCOEFF 相关系数匹配法,最好的匹配为1,-1表示最差的匹配;

CV_TM_CCOEFF_NORMED 归一化相关系数匹配法;

前两种方法为值越小表示越匹配,后四种方法值越大越匹配。

 

其中:

CV_TM_SQDIFF为:Sumof Squared Difference(SSD)差值的平方和:

R(x,y)=sum(T(x',y')-I(x+x',y+y'))^2|(x',y')

 

CV_TM_CCORR为:Cross Correlation 互相关:

R(x,y)=sum(T(x',y')*I(x+x',y+y'))|(x',y')

 

      其实把SSD可以看成是欧式距离的平方,把SSD展开,可以得到:

R(x,y)=sum(T^2(x',y')-2T(x',y')*I(x+x',y+y')+I^2(x+x',y+y')

 

       可以看到,上面公式第一项(模板图像T的能量)是一个常数,第三项(图像I局部的能量)也可以近似一个常数,那么可以看到,剩下的第二项就是和cross correlation一样的,也就是互相关项。而SSD是数值越大,相似度越小,cross correlation是数值越大,相似度越大。

 

       另外,为了适应目标的变化,就需要随时更新我们要跟踪的目标,换句话说,在跟踪t帧的时候,也就是在第t帧寻找目标的时候,是与t-1帧中我们找到的目标来进行比较的。这样目标的外观变化就会及时更新。这个就是在线跟踪的方法了。但是会有跟踪漂移的问题~

 

 

 

 

 

 

猜你喜欢

转载自1043693084-qq-com.iteye.com/blog/2266070