模板匹配

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

opencv学习_11(模板匹配(包括单模板和多模板))分类:Opencv学习笔记2013-11-0821:167663人阅读评论(6)收藏举报模板匹配源码opencv模板匹配——在一幅图像中匹配与模板相似的单个或者多个目标(1)目标匹配函数:cvMatchTemplate(constCvArr*image,constCvArr*templ,CvArr*result,intmethod);Image待搜索图像Templ模板图像Result匹配结果用来存放通过以下方法计算出滑动窗口与模板的相似值Method计算匹配程度的方法关于匹配方法,使用不同的方法产生的结果的意义可能不太一样,有些返回的值越大表示匹配程度越好,而有些方法返回的值越小表示匹配程度越好关于参数method:CV_TM_SQDIFF平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。CV_TM_CCORR相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。CV_TM_CCOEFF相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。CV_TM_SQDIFF_NORMED归一化平方差匹配法CV_TM_CCORR_NORMED归一化相关匹配法CV_TM_CCOEFF_NORMED归一化相关系数匹配法(2):接着就是要找最值以及最值对应的坐标cvMinMaxLoc()寻找一个矩阵中最大最小值以及相应的坐标cvMinMaxLoc(constCvArr*arr,double*min_val,double*max_val,CvPoint*min_locCV_DEFAULT(NULL),CvPoint*max_locCV_DEFAULT(NULL),constCvArr*maskCV_DEFAULT(NULL));单目标匹配结果:代码:[cpp]viewplaincopyprint?1.#includeiostream2.#includecv.h3.#includecxcore.h4.#includehighgui.h5.usingnamespacestd;6.intmain()7.{8.IplImage*src=cvLoadImage(E:\\study_opencv_video\\lesson16_1\\images\\src.jpg,0);9.IplImage*srcResult=cvLoadImage(E:\\study_opencv_video\\lesson16_1\\images\\src.jpg,3);//用来显示10.IplImage*templat=cvLoadImage(E:\\study_opencv_video\\lesson16_1\\images\\template.png,0);11.IplImage*result;12.if(!src||!templat)13.{14.cout打开图像失败endl;15.return0;16.}17.intsrcW,srcH,templatW,templatH,resultH,resultW;18.srcW=src-width;19.srcH=src-height;20.templatW=templat-width;21.templatH=templat-height;22.if(srcWtemplatW||srcHtemplatH)23.{24.cout模板不能比原图像小endl;25.return0;26.}27.resultW=srcW-templatW+1;28.resultH=srcH-templatH+1;29.result=cvCreateImage(cvSize(resultW,resultH),32,1);30.cvMatchTemplate(src,templat,result,CV_TM_SQDIFF);31.doubleminValue,maxValue;32.CvPointminLoc,maxLoc;33.cvMinMaxLoc(result,&minValue,&maxValue,&minLoc,&maxLoc);34.cvRectangle(srcResult,minLoc,cvPoint(minLoc.x+templatW,minLoc.y+templatH),cvScalar(0,0,255));35.cvNamedWindow(srcResult,0);36.cvNamedWindow(templat,0);37.cvShowImage(srcResult,srcResult);38.cvShowImage(templat,templat);39.cvWaitKey(0);40.cvReleaseImage(&result);41.cvReleaseImage(&templat);42.cvReleaseImage(&srcResult);43.cvReleaseImage(&src);44.return0;45.}(3)多目标匹配:结果:代码:[cpp]viewplaincopyprint?1.#includeiostream2.#includecv.h3.#includecxcore.h4.#includehighgui.h5.usingnamespacestd;6.7.CvPointgetNextMinLoc(IplImage*result,CvPointminLoc,intmaxVaule,inttemplatW,inttemplatH)8.{9.10.//先将第一个最小值点附近两倍模板宽度和高度的都设置为最大值防止产生干扰11.intstartX=minLoc.x-templatW;12.intstartY=minLoc.y-templatH;13.intendX=minLoc.x+templatW;14.intendY=minLoc.y+templatH;15.if(startX0||startY0)16.{17.startX=0;18.startY=0;19.}20.if(endXresult-width-1||endYresult-height-1)21.{22.endX=result-width-1;23.endY=result-height-1;24.}25.inty,x;26.for(y=startY;yendY;y++)27.{28.for(x=startX;xendX;x++)29.{30.cvSetReal2D(result,y,x,maxVaule);31.}32.}33.//然后得到下一个最小值并且返回34.doublenew_minVaule,new_maxValue;35.CvPointnew_minLoc,new_maxLoc;36.cvMinMaxLoc(result,&new_minVaule,&new_maxValue,&new_minLoc,&new_maxLoc);37.returnnew_minLoc;38.39.}40.intmain()41.{42.IplImage*src=cvLoadImage(E:\\study_opencv_video\\lesson16_1\\images\\src.jpg,0);43.IplImage*srcResult=cvLoadImage(E:\\study_opencv_video\\lesson16_1\\images\\src.jpg,3);//用来显示44.IplImage*templat=cvLoadImage(E:\\study_opencv_video\\lesson16_1\\images\\template.png,0);45.IplImage*result;//用来存放结果46.if(!src||!templat)47.{48.cout打开图片失败endl;49.return0;50.}51.intsrcW,srcH,templatW,templatH,resultH,resultW;52.srcW=src-width;53.srcH=src-height;54.templatW=templat-width;55.templatH=templat-height;56.if(srcWtemplatW||srcHtemplatH)57.{58.cout模板不能比原图小endl;59.return0;60.}61.resultW=srcW-templatW+1;62.resultH=srcH-templatH+1;63.result=cvCreateImage(cvSize(resultW,resultH),32,1);//匹配方法计算的结果最小值为float64.cvMatchTemplate(src,templat,result,CV_TM_SQDIFF);65.doubleminValue,maxValue;66.CvPointminLoc,maxLoc;67.cvMinMaxLoc(result,&minValue,&maxValue,&minLoc,&maxLoc);68.cvRectangle(srcResult,minLoc,cvPoint(minLoc.x+templatW,minLoc.y+templatH),cvScalar(0,0,255));69.CvPointnew_minLoc;70.71.//计算下一个最小值72.new_minLoc=getNextMinLoc(result,minLoc,maxValue,templatW,templatH);73.cvRectangle(srcResult,new_minLoc,cvPoint(new_minLoc.x+templatW,new_minLoc.y+templatH),cvScalar(0,0,255));74.//再下一个75.new_minLoc=getNextMinLoc(result,new_minLoc,maxValue,templatW,templatH);76.cvRectangle(srcResult,new_minLoc,cvPoint(new_minLoc.x+templatW,new_minLoc.y+templatH),cvScalar(0,0,255));77.cvNamedWindow(srcResult,0);78.cvNamedWindow(templat,0);79.cvShowImage(srcResult,srcResult);80.cvShowImage(templat,templat);81.cvWaitKey(0);82.cvReleaseImage(&result);83.cvReleaseImage(&templat);84.cvReleaseImage(&srcResult);85.cvReleaseImage(&src);86.return0;87.}作者:小村长出处:欢迎转载或分享,但请务必声明文章出处。(新浪微博:小村长zack,欢迎交流!)OpenCV学习笔记(十三)——模板匹配分类:OpenCV2011-11-0711:0419123人阅读评论(7)收藏举报imagematrixpatch工作寻找一幅图像的匹配的模板,可以在一段视频里寻找出我们感兴趣的东西,比如条形码的识别就可能需要这样类似的一个工作提取出条形码区域(当然这样的方法并不鲁棒)。而OpenCV已经为我们集成好了相关的功能。函数为matchTemplate。所谓模板匹配就是在一幅图像中寻找和模板图像(patch)最相似的区域。该函数的功能为,在输入源图像Sourceimage(I)中滑动框,寻找各个位置与模板图像Templateimage(T)的相似度,并将结果保存在结果矩阵

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功