假设有图源图像(下图0),另外有10幅图像image1,image2...image10都是二值化图像,要实现是:从image1,image2...image10 找出与源图像最相似的那张图像。
double getSimilarity(IplImage* src1,IplImage* src2)
{
//查找轮廓
CvMemStorage* mem1,*mem2;
mem1 = cvCreateMemStorage();
mem2 = cvCreateMemStorage();
CvSeq* contours1,*contours2;
cvFindContours(src1,mem1,&contours1,sizeof(CvContour),CV_RETR_LIST);
cvFindContours(src2,mem2,&contours2,sizeof(CvContour),CV_RETR_LIST);
double match = cvMatchShapes(contours1,contours2,3);
cvClearMemStorage(mem1);
cvClearMemStorage(mem2);
return match;
}
int main(int argc, char* argv[])
{
IplImage* src1 = cvLoadImage("images/6.png",0);
//IplImage* src2 = cvLoadImage("images/1.png",0);
//反色
cvThreshold(src1,src1,100,255,CV_THRESH_BINARY_INV);
for(int i=0;i<10;i++)
{
char filename[256];
sprintf(filename , "images/%d.png",i);
IplImage* src2 = cvLoadImage(filename,0);
cvThreshold(src2,src2,100,255,CV_THRESH_BINARY_INV);
double similarity = 0;
similarity = getSimilarity(src1,src2);
printf("文件名是 %s , 匹配结果 %f\n" , filename,similarity);
cvReleaseImage(&src2);
}
printf("结果说明 匹配结果中 值越小的 越与源图像相似\n");
cvNamedWindow("src1");
cvShowImage("src1",src1);
cvWaitKey(0);
cvReleaseImage(&src1);
return 0;
}