图像与轮廓的相似度匹配

1 普通局

2 中心距:平移不变性

3 归一化中心距:缩放不变性

4 hu矩:旋转不变性


iplImage* img=cvload("xxxxx");

//计算普通局和中心距

CvMoments moment;

cvMoments(img,&moment,2);//第三个参数:>0  0/1组成图像


//计算hu矩

CVHuMoments humoment;

cvGetHuMoments(&moment,&humoment);



图像1---》hu矩

图像2---》hu矩

通过比较 图像1和2 的hu矩 --- 值越小 相似度就越大。

// contourMatch.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
#include "cvaux.h"



//www.opencvchina.com

int main(int argc, char* argv[])
{


	//产生一幅图像
	IplImage* src;
	src = cvCreateImage(cvSize(10,10),8,1);
	
	//图像初始值清零
	cvZero(src);

	//图像的前面5行5列赋值为255
	for(int yy=0;yy<5;yy++)
	{
		for(int xx=0;xx<5;xx++)
		{
			cvSetReal2D(src,yy,xx,255);
		}
	}

	double m00,m10,m01;

	//定义矩变量
	CvMoments moment;

	//计算原始矩和中心矩
	cvMoments(src,&moment,2);

	m00 = cvGetSpatialMoment(&moment,0,0);
	m10 = cvGetSpatialMoment(&moment,1,0);
	m01 = cvGetSpatialMoment(&moment,0,1);

	//计算质心坐标
	float x = (float)(m10/m00);
	float y = (float)(m01/m00);

	//定义hu矩变量
	CvHuMoments humoment;

	//计算hu矩
	cvGetHuMoments(&moment,&humoment);

	return 0;
}



OPencv 比较hu矩的函数(已经封装的上述的运算)

CvSeq* contours1=通过函数获取img的轮廓 指针。

CvSeq* contours1=通过函数获取img的轮廓 指针。

double result=cvMatchShapes(contours1,contours2,1);//第三个参数 为比较的方式。 输出比较的相似度浮点值。


#pragma comment(lib,"cxcore.lib")
#pragma comment(lib,"cv.lib")
#pragma comment(lib,"highgui.lib")
#pragma comment(lib,"ml.lib")
#pragma comment(lib,"cvcam.lib")
#pragma comment(lib,"cvaux.lib")


#include 
#include 

#include 
#include 
#include 

using namespace std;

CvSeq* getImageContous(IplImage* srcin)
{ 
	IplImage*src;
	src=cvCreateImage(cvGetSize(srcin),8,1);
	cvCopy(srcin,src);

	CvMemStorage* mem=cvCreateMemStorage(0);
	CvSeq* seq;

	if (!mem)
	{
		printf("mem is null");
	}

	cvThreshold(src,src,200,255,CV_THRESH_BINARY);// 二值化
	cvFindContours(src,mem,&seq,sizeof(CvContour),CV_RETR_CCOMP);

	cvReleaseImage(&src);

	return seq;

}

int main()
{

	IplImage* src1=cvLoadImage("img//contour.jpg",CV_LOAD_IMAGE_GRAYSCALE);
	CvSeq* contours1=getImageContous(src1);

	IplImage* src2=cvLoadImage("img//carno//2.bmp",CV_LOAD_IMAGE_GRAYSCALE);
	CvSeq* contours2=getImageContous(src2);


	double result=cvMatchShapes(contours1,contours2,1);
	printf("%f \n",result);

	

	cvWaitKey(0);
	//release

	cvReleaseImage(&src1);
	cvReleaseImage(&src2);


	return 0;
}





你可能感兴趣的:(图像与轮廓的相似度匹配)