以下是引用片段: #include <cv.h> #include <highgui.h> IplImage* src=NULL; IplImage* tmp=NULL; void L_TemplateMatch(IplImage* src,IplImage* tmp) { int w,h; CvRect rect; IplImage* result=NULL; IplImage* srcGray=NULL; IplImage* tmpGray=NULL; double min_val; double max_val; CvPoint min_loc; CvPoint max_loc; CvPoint pt1; CvPoint pt2; w=src->width-tmp->width; h=src->height-tmp->height; result=cvCreateImage(cvSize(w+1,h+1),IPL_DEPTH_32F,1); //必须为32位浮点型,IPL_DEPTH_32F srcGray=cvCreateImage(cvGetSize(src),8,1); tmpGray=cvCreateImage(cvGetSize(tmp),8,1); cvCvtColor(src,srcGray,CV_BGR2GRAY); cvCvtColor(tmp,tmpGray,CV_BGR2GRAY); cvMatchTemplate(srcGray,tmpGray,result,CV_TM_CCORR_NORMED); //CV_TM_SQDIFF CV_TM_SQDIFF_NORMED CV_TM_CCORR (这三种Method的匹配效果不佳) //CV_TM_CCORR_NORMED CV_TM_CCOEFF CV_TM_CCOEFF_NORMED (这三种Method的匹配效果完美) cvMinMaxLoc(result,&min_val,&max_val,&min_loc,&max_loc,NULL); rect=cvRect(max_loc.x,max_loc.y,tmp->width,tmp->height); pt1=cvPoint(rect.x,rect.y); pt2=cvPoint(rect.x+rect.width,rect.y+rect.height); cvRectangle( src,pt1, pt2, cvScalar(255,0,0),1, 8, 0 ); cvReleaseImage(&srcGray); cvReleaseImage(&tmpGray); cvReleaseImage(&result); } void main() { cvNamedWindow("matchResult",1); src=cvLoadImage("1.jpg",1); tmp=cvLoadImage("2.jpg",1); L_TemplateMatch(src,tmp); cvShowImage("matchResult",src); cvWaitKey(0); cvDestroyWindow("matchResult"); cvReleaseImage(&src); cvReleaseImage(&tmp); } |