图像与轮廓的相似度匹配
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;
}
【图像与轮廓的相似度匹配】
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- Docker应用:容器间通信与Mariadb数据库主从复制
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量
- 第326天
- Shell-Bash变量与运算符
- 逻辑回归的理解与python示例
- Guava|Guava RateLimiter与限流算法
- Java|Java OpenCV图像处理之SIFT角点检测详解
- 我和你之前距离
- CGI,FastCGI,PHP-CGI与PHP-FPM