模板匹配是通过在输入图像上滑动模板图像块对实际的图像块和输入图像进行匹配,应用场景:比如要在一堆图像中寻找指定人脸,就可以利用此算法在图像中找到此人脸的最佳匹配,确定相似度。并且可以利用函数cvMinMaxLoc()找到最佳匹配的位置。对于特定的应用来说,如视频中应用自动部分检测或跟踪(视频中的车牌识别),可以试试所有这些方法,找到最合适的method,这里要考虑算法的性能。
-----------------------------------------------------------------------------------------------
比较模板和重叠的图像区域
void cvMatchTemplate( const CvArr* image, const CvArr* templ, CvArr* result, int method );
函数 cvMatchTemplate 与函数 cvCalcBackProjectPatch 类似。它滑动过整个图像 image, 用指定方法比较 templ 与图像尺寸为 w×h 的重叠区域,并且将比较结果存到 result 中。 下面是不同的比较方法,可以使用其中的一种 (I 表示图像,T - 模板, R - 结果. 模板与图像重叠区域 x'=0..w-1, y'=0..h-1 之间求和):
-----------------------------------------------------------------------------------------------
/*code*/
#include <highgui.h> #include <cxcore.h> #include <stdio.h> #include <cv.h> int main(int argc, char** argv) { IplImage* src, *temp, *ftmp[6]; int i; if( argc == 3 ) { //读入模板图像 if( ( temp = cvLoadImage( argv[1], 1 ) ) == 0 ) { printf( "Error on reading template %s\n", argv[1] ); return -1; } //读入源图像 if( ( src = cvLoadImage( argv[2], 1 ) ) == 0 ) { printf( "Error on reading template %s\n", argv[2] ); //return -1; } int patchx = temp -> width; //图像宽 int patchy = temp -> height; int iwidth = src -> width - patchx + 1; int iheight = src -> height - patchy + 1; for( i = 0; i < 6; ++i ) { ftmp[i] = cvCreateImage( cvSize( iwidth, iheight ), 32, 1 ); //创建显示图像,32位 } //开始匹配 for( i = 0; i < 6; ++i ) { cvMatchTemplate( src, temp, ftmp[i], i ); //通过最后一个参数method来区分不同的匹配方法 cvNormalize( ftmp[i], ftmp[i], 1, 0, CV_MINMAX ); //图像归一化 } //显示 cvNamedWindow( "Template", 0 ); cvShowImage( "Template", temp ); cvNamedWindow( "Image", 0 ); cvShowImage( "Image", src ); cvNamedWindow( "SQDIFF", 0 ); cvShowImage( "SQDIFF", ftmp[0] ); cvNamedWindow( "SQDIFF_NORMED", 0 ); cvShowImage( "SQDIFF_NORMED", ftmp[1] ); cvNamedWindow( "CCORR", 0 ); cvShowImage( "CCORR", ftmp[2] ); cvNamedWindow( "CCORR_NORMED", 0 ); cvShowImage( "CCORR_NORMED", ftmp[3] ); cvNamedWindow( "CCOEFF", 0 ); cvShowImage( "CCOEFF", ftmp[4] ); cvNamedWindow( "CCOEFF_NORMED", 0 ); cvShowImage( "CCOEFF_NORMED", ftmp[5] ); cvWaitKey(0); } else ; return 0; }
-----------------------------------------------------------------------------------------------
/*result*/
source imagetemplate face image
the result image of six method