您的位置:首页 > 其它

第七章 - 直方图与匹配 - 模板匹配(cvMatchTemplate)

2011-10-28 16:18 387 查看
模板匹配是通过在输入图像上滑动模板图像块对实际的图像块和输入图像进行匹配,应用场景:比如要在一堆图像中寻找指定人脸,就可以利用此算法在图像中找到此人脸的最佳匹配,确定相似度。并且可以利用函数cvMinMaxLoc()找到最佳匹配的位置。对于特定的应用来说,如视频中应用自动部分检测或跟踪(视频中的车牌识别),可以试试所有这些方法,找到最合适的method,这里要考虑算法的性能。

-----------------------------------------------------------------------------------------------

MatchTemplate

比较模板和重叠的图像区域

void cvMatchTemplate( const CvArr* image, const CvArr* templ,
CvArr* result, int method );

image 欲搜索的图像。它应该是单通道、8-比特或32-比特 浮点数图像 templ 搜索模板,不能大于输入图像,且与输入图像具有一样的数据类型 result 比较结果的映射图像。单通道、32-比特浮点数. 如果图像是 W×H 而 templ 是 w×h ,则 result 一定是 (W-w+1)×(H-h+1).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 image



template face image



the result image of six method

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: