opencv——模板匹配

来源:互联网 发布:网络道德规范的主体是 编辑:程序博客网 时间:2024/05/17 08:22
<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;">模板匹配是通过在输入图像上滑动模板图像块对实际的图像块和输入图像进行匹配,<span style="color: rgb(255, 0, 0);">应用场景:比如要在一堆图像中寻找指定人脸,就可以利用此算法在图像中找到此人脸的最佳匹配,确定相似度。</span>并且可以利用函数cvMinMaxLoc()找到最佳匹配的位置。对于特定的应用来说,如视频中应用自动部分检测或跟踪(视频中的车牌识别),可以试试所有这些方法,找到最合适的method,这里要考虑算法的性能。</p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;">-----------------------------------------------------------------------------------------------</p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"></p><h3 style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px;">MatchTemplate</h3><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;">比较模板和重叠的图像区域</p><pre style="white-space: pre-wrap; word-wrap: break-word; font-size: 14px; line-height: 26px; background-color: rgb(255, 255, 255);">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 之间求和): 


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


#include <opencv2\opencv.hpp>#include <stdio.h>int main(int argc,char arg[]){//读取源图像IplImage *s = cvLoadImage("2.jpg");IplImage *src = cvCreateImage(cvGetSize(s),8,1);    //读取模板图像IplImage *temp = cvLoadImage("6.jpg");IplImage *temp1 = cvCreateImage(cvGetSize(temp),8,1);   //分别转换源图像和模板图像cvCvtColor(s,src,CV_RGB2GRAY);cvCvtColor(temp,temp1,CV_RGB2GRAY);  // 创建图像数组IplImage *ftmp[6];int i;int iwidth = src->width-temp1->width+1;int iheight = src->height-temp1->height+1;for ( i = 0 ;i<6;++i){//令图像数组的图像大小为源图像的大小-模板图像ftmp[i] = cvCreateImage(cvSize(iwidth,iheight),32,1);//模板匹配,//分别将各种方式的匹配结果放入数组中cvMatchTemplate(src,temp1,ftmp[i],i);//cvNormalize的使用使结果具有一致性,//CV_MINMAX标志告诉函数对浮点图像进行平移和缩放,使得所有返回结果都在0到1之间cvNormalize(ftmp[i],ftmp[i],1,0,CV_MINMAX);}//显示结果cvNamedWindow("Template",0);cvShowImage("Template",temp1);cvNamedWindow("Image",0);cvShowImage("Image",src);cvNamedWindow("1",0);cvShowImage("1",ftmp[0]);cvNamedWindow("2",0);cvShowImage("2",ftmp[1]);cvNamedWindow("3",0);cvShowImage("3",ftmp[2]);cvNamedWindow("4",0);cvShowImage("4",ftmp[3]);cvNamedWindow("5",0);cvShowImage("5",ftmp[4]);cvNamedWindow("6",0);cvShowImage("6",ftmp[5]);cvWaitKey(0);//释放图像和消除窗口cvReleaseImage(&temp1);cvDestroyWindow("Template");cvReleaseImage(&src);cvDestroyWindow("Image");cvReleaseImage(&ftmp[0]);cvDestroyWindow("1");cvReleaseImage(&ftmp[1]);cvDestroyWindow("2");cvReleaseImage(&ftmp[2]);cvDestroyWindow("3");cvReleaseImage(&ftmp[3]);cvDestroyWindow("4");cvReleaseImage(&ftmp[4]);cvDestroyWindow("5");cvReleaseImage(&ftmp[5]);cvDestroyWindow("6");return 0;}

0 0