OpenCV 如何高效的比较两个二值图像

     假设有图源图像(下图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;
}

猜你喜欢

转载自blog.csdn.net/qq_30460949/article/details/89417971
今日推荐