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

模板匹配是通过在输入图像上滑动模板图像块对实际的图像块和输入图像进行匹配,应用场景:比如要在一堆图像中寻找指定人脸,就可以利用此算法在图像中找到此人脸的最佳匹配,确定相似度。并且可以利用函数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 之间求和): 

第七章 - 直方图与匹配 - 模板匹配(cvMatchTemplate)_第1张图片

第七章 - 直方图与匹配 - 模板匹配(cvMatchTemplate)_第2张图片

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

/*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

第七章 - 直方图与匹配 - 模板匹配(cvMatchTemplate)_第3张图片

template face image

第七章 - 直方图与匹配 - 模板匹配(cvMatchTemplate)_第4张图片

the result image of six method

第七章 - 直方图与匹配 - 模板匹配(cvMatchTemplate)_第5张图片



你可能感兴趣的:(算法,image)