以下是引用片段:
#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);
}
|