您的位置:首页 > 运维架构

OpenCV 中的 cvMatchTemplate() 的使用举例

2013-09-04 20:19 519 查看

OpenCV中的cvMatchTemplate()的使用举例

jackyhwei发布于2010-11-1516:53 点击:1809次 

来自:CSDN博客
在学习OpenCV,很辛苦才找到相关的例子,在这里共享给大家,这里是在加入到我的程序中提取出来的

TAG: OpenCV  cvMatchTemplate  cvMatchShapes  
 

在学习OpenCV,很辛苦才找到相关的例子,在这里共享给大家,这里是在加入到我的程序中提取出来的:

voidCFollowDlg::MatchTemplate(CStringpath){ 

//doublea=0.; 

  IplImage*imgSrc=cvLoadImage(path); 

IplImage*imgTemp=cvLoadImage("C:\\t.bmp"); 

CvSizesizeSrc=cvGetSize(imgSrc); 

CvSizesizeTemp=cvGetSize(imgTemp); 

CvSizesizeResult=cvSize(sizeSrc.width-sizeTemp.width+1,sizeSrc.height-sizeTemp.height+1); 

IplImage*imgResult=cvCreateImage(sizeResult,IPL_DEPTH_32F,1); 

  cvMatchTemplate(imgSrc,imgTemp,imgResult,CV_TM_CCORR_NORMED); 

//  a=cvMatchShapes(imgSrc,imgTemp,CV_CONTOURS_MATCH_I3); 

  floatdMax=0.; 

CvPointpoint=cvPoint(0,0);

//if(!a)MessageBox("NotSuccessful!",MB_OK);

for(intcx=0;cx



 for(intcy=0;cy

 { 

  floatfTemp=CV_IMAGE_ELEM(imgResult,float,cy,cx); 

  if(dMax<fTemp)//找到最接近的位置 

  { 

   dMax=fTemp; 

   point=cvPoint(cx,cy);//记录位置 

  } 

 } 



CvPointpoint2=cvPoint(point.x+sizeTemp.width,point.y+sizeTemp.height);//对角位置 

cvRectangle(imgSrc,point,point2,cvScalar(255)); 

cvNamedWindow("Test",CV_WINDOW_AUTOSIZE); 

cvShowImage("Test",imgSrc); 

  /*  for(;;) 

   { 

       intk=cvWaitKey(5); 

       if(k==27)break; 

   } 

*/

}

voidCFollowDlg::OnButton4() 



//TODO:Addyourcontrolnotificationhandlercodehere 

CStringpath; 

CFileDialogdlg(TRUE); 

if(dlg.DoModal()==IDOK) 

 path=dlg.GetPathName(); 

MatchTemplate(path); 

}

希望对大家有所帮助!

关于cvMatchTemplate()的说明文档:

原型:
voidcvMatchTemplate(constCvArr*image,constCvArr*templ,
CvArr*result,intmethod);

image欲搜索的图像。它应该是单通道、8-比特或32-比特浮点数图像templ搜索模板,不能大于输入图像,且与输入图像具有一样的数据类型result比较结果的映射图像。单通道、32-比特浮点数.如果图像是W×H而templ是w×h,则result一定是(W-w+1)×(H-h+1).method指定匹配方法:函数cvMatchTemplate与函数c
4000
vCalcBackProjectPatch类似。它滑动过整个图像image,用指定方法比较templ与图像尺寸为w×h的重叠区域,并且将比较结果存到result中。函数完成比较后,通过使用cvMinMaxLoc找全局最小值CV_TM_SQDIFF*)或者最大值(CV_TM_CCORR*andCV_TM_CCOEFF*)。


 

cvMatchShapes()应用举例:

例子摘自http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=1736

 

intcvMatchShapes_test()



IplImage*mode=cvLoadImage("D:\\lena.jpg",1);

IplImage*test=cvLoadImage("D:\\test3.bmp",1);

IplImage*bw_mode=cvCreateImage(cvGetSize(mode),mode->depth,1);

IplImage*bw_test=cvCreateImage(cvGetSize(test),mode->depth,1);

IplImage*canny_mode=cvCreateImage(cvGetSize(mode),mode->depth,1);

IplImage*canny_test=cvCreateImage(cvGetSize(test),mode->depth,1);

CvMemStorage*mode_mems=cvCreateMemStorage();

CvSeq*mode_seqs;

CvMemStorage*test_mems=cvCreateMemStorage();

CvSeq*test_seqs;

cvCvtColor(mode,bw_mode,CV_RGB2GRAY);

cvCvtColor(test,bw_test,CV_RGB2GRAY);

//modelcontours
//cvCanny(bw_mode,canny_mode,50,60);

cvFindContours(bw_mode,mode_mems,

&mode_seqs,sizeof(CvContour),CV_RETR_TREE);

//testcontours
//cvCanny(bw_test,canny_test,50,60);

cvFindContours(bw_test,test_mems,

&test_seqs,sizeof(CvContour),CV_RETR_TREE);

doublematching=cvMatchShapes(test_seqs,mode_seqs,3);

printf("%f",matching);

cvReleaseImage(&mode);//

cvReleaseImage(&test);

cvReleaseImage(&bw_mode);//

cvReleaseImage(&bw_test);

cvReleaseImage(&canny_mode);//

cvReleaseImage(&canny_test);

//ÊÍ·ÅÄÚ´æ 

return1;

}

 

关于cvMatchShapes()的说明文档:

MatchShapes

比较两个形状
doublecvMatchShapes(constvoid*object1,constvoid*object2,
intmethod,doubleparameter=0);

object1第一个轮廓或灰度图像object2第二个轮廓或灰度图像method比较方法,其中之一CV_CONTOUR_MATCH_I1,CV_CONTOURS_MATCH_I2orCV_CONTOURS_MATCH_I3.parameter比较方法的参数(目前不用).
函数cvMatchShapes比较两个形状。三个实现方法全部使用Hu矩(见cvGetHuMoments)
(longlongago2000)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  csdn博客