第七章 - 直方图与匹配 - 模板匹配(cvMatchTemplate)
2011-10-28 16:18
387 查看
模板匹配是通过在输入图像上滑动模板图像块对实际的图像块和输入图像进行匹配,应用场景:比如要在一堆图像中寻找指定人脸,就可以利用此算法在图像中找到此人脸的最佳匹配,确定相似度。并且可以利用函数cvMinMaxLoc()找到最佳匹配的位置。对于特定的应用来说,如视频中应用自动部分检测或跟踪(视频中的车牌识别),可以试试所有这些方法,找到最合适的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*/
-----------------------------------------------------------------------------------------------
/*result*/
source image
template face image
the result image of six 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
相关文章推荐
- 【OpenCV3】模板匹配——cv::matchTemplate()详解
- 模板匹配 cvMatchTemplate
- OpenCV中的模板匹配函数:cvMatchTemplate
- opencv 模板匹配(cvMatchTemplate)
- opencv 模板匹配(cvMatchTemplate)
- opencv中cvMatchTemplate模板匹配
- cvMatchTemplate() 模板匹配
- Opencv使用cv::matchTemplate进行模板匹配
- opencv关于模板匹配cvMatchTemplate的运用
- 模板匹配(Match Template)
- 模板匹配(Match Template)
- 使用Opencv中matchTemplate模板匹配方法跟踪移动目标
- Atitti 模板匹配 List<java.awt.Point> matchTemplate(
- opencv 模板匹配matchTemplate研究之二
- 使用Opencv中matchTemplate模板匹配方法跟踪移动目标
- OpenCV matchTemplate模板匹配
- opencv 模板匹配matchTemplate研究之一
- opencv学习(三十八)之图像模板匹配matchTemplate()
- EmguCV Image类中的函数(四)使用MatchTemplate函数进行模板匹配
- 模板匹配(Match Template)