double cvMatchShapes(
const void* object1,
const void* object2,
int method,
double parameter = 0
);
第一個參數是待匹配的物體1,第二個是待匹配的物體2
第三個參數method可以有CV_CONTOURS_MATCH_I1,CV_CONTOURS_MATCH_I2,CV_CONTOURS_MATCH_I3
三種輸入,這其實就是三種不同的判定物體相似的方法,匹配的返回值也是不一樣的其返回值分別通過下面的公式計算得出
# include "cv.h"
# include "highgui.h"
# include <iostream>
using namespace std;
int main()
{
IplImage *mode = cvLoadImage("D:\\picture\\jz.jpg", 1);
IplImage *test = cvLoadImage("D:\\picture\\stuff.jpg", 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( canny_mode, mode_mems,
&mode_seqs,sizeof(CvContour),CV_RETR_TREE);
//test contours
cvCanny(bw_test,canny_test,50,60);
cvFindContours( canny_test, test_mems,
&test_seqs,sizeof(CvContour),CV_RETR_TREE);
double matching=cvMatchShapes( test_seqs, mode_seqs, CV_CONTOURS_MATCH_I1,0);
cout << matching << endl;
system("pause");
//釋放內存
}
{
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;
}