00/1组成图像 //计算。图像与轮廓的相似度匹配。" />

图像与轮廓的相似度匹配

1 普通局
2 中心距:平移不变性
3 归一化中心距:缩放不变性
4 hu矩:旋转不变性


iplImage* img=cvload("xxxxx");
//计算普通局和中心距
CvMoments moment;
cvMoments(img,&moment,2); //第三个参数:>00/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.comint main(int argc, char* argv[]) { //产生一幅图像 IplImage* src; src = https://www.it610.com/article/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=https://www.it610.com/article/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; }



【图像与轮廓的相似度匹配】

    推荐阅读