OpenCV 中的 cvMatchTemplate() 的使用举例

OpenCV 中的 cvMatchTemplate() 的使用举例

jackyhwei 发布于 2010-11-15 16:53 点击:1809次 
来自:优快云博客
在学习OpenCV,很辛苦才找到相关的例子,在这里共享给大家,这里是在加入到我的程序中提取出来的
TAG:  OpenCV   cvMatchTemplate   cvMatchShapes  
 

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

void CFollowDlg::MatchTemplate(CString path){ 
//double a=0.; 
   IplImage* imgSrc = cvLoadImage(path); 
IplImage* imgTemp = cvLoadImage("C:\\t.bmp"); 
CvSize sizeSrc = cvGetSize(imgSrc); 
CvSize sizeTemp = cvGetSize(imgTemp); 
CvSize sizeResult = 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); 
   float dMax = 0.; 
CvPoint point = cvPoint(0,0);

//if(!a) MessageBox("Not Successful!",MB_OK);

for (int cx=0 ; cx

  for (int cy=0 ; cy
  { 
   float fTemp = CV_IMAGE_ELEM(imgResult,float,cy,cx); 
   if (dMax < fTemp) //找到最接近的位置 
   { 
    dMax = fTemp; 
    point = cvPoint(cx,cy); //记录位置 
   } 
  } 

CvPoint point2 = cvPoint(point.x+sizeTemp.width,point.y+sizeTemp.height); //对角位置 
cvRectangle(imgSrc,point,point2,cvScalar(255)); 
cvNamedWindow( "Test", CV_WINDOW_AUTOSIZE ); 
cvShowImage("Test",imgSrc); 
   /*   for(;;) 
    { 
        int k = cvWaitKey(5); 
        if( k == 27 ) break; 
    } 
*/

}

void CFollowDlg::OnButton4() 

// TODO: Add your control notification handler code here 
CString path; 
CFileDialog dlg(TRUE); 
if(dlg.DoModal()==IDOK) 
  path=dlg.GetPathName(); 
MatchTemplate(path); 
}

希望对大家有所帮助!

关于cvMatchTemplate()的说明文档:

原型:

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 中。
函数完成比较后,通过使用cvMinMaxLoc找全局最小值CV_TM_SQDIFF*) 或者最大值 (CV_TM_CCORR* and CV_TM_CCOEFF*)。
 

 

cvMatchShapes()应用举例:

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

 

int cvMatchShapes_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);

//model contours
//cvCanny(bw_mode,canny_mode,50,60);
cvFindContours( bw_mode, mode_mems,
&mode_seqs,sizeof(CvContour),CV_RETR_TREE);

//test contours
//cvCanny(bw_test,canny_test,50,60);
cvFindContours( bw_test, test_mems,
&test_seqs,sizeof(CvContour),CV_RETR_TREE);

double matching=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 );
//ÊÍ·ÅÄÚ´æ 
return 1;
}

 

关于cvMatchShapes()的说明文档:


MatchShapes

比较两个形状

double cvMatchShapes( const void* object1, const void* object2,
int method, double parameter=0 );
object1
第一个轮廓或灰度图像
object2
第二个轮廓或灰度图像
method
比较方法,其中之一 CV_CONTOUR_MATCH_I1, CV_CONTOURS_MATCH_I2 or CV_CONTOURS_MATCH_I3.
parameter
比较方法的参数 (目前不用).

函数 cvMatchShapes 比较两个形状。 三个实现方法全部使用 Hu 矩 (见 cvGetHuMoments)

(longlongago2000)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值