opencv计算两个轮廓之间hu矩相似程度,MatchShapes

OPENCV提供了输入图像直接进行hu矩匹配的函数,返回的是两个图像或轮廓之间hu矩的相似度:

double cvMatchShapes(const void*object1,const void*object2,int method,doubleparameter=0);

计算两个轮廓之间hu矩相似程度:

#include <iostream>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
using namespace std;

CvSeq *getImageContours(CvArr *src)
{
	cvThreshold(src, src, 100, 255, CV_THRESH_BINARY);
	CvMemStorage * storage = cvCreateMemStorage(0);
	CvSeq * contours;
	cvFindContours(src, storage, &contours);
	return contours;
}
int main()
{
	IplImage *src1 = cvLoadImage("", 0);
	CvSeq *contours1 = getImageContours(src1);  // 得到src1的轮廓
	IplImage *src2 = cvLoadImage("", 0);
	CvSeq *contours2 = getImageContours(src2);
	double result = cvMatchShapes(contours1, contours2, 1);   // 根据输入的图像或轮廓来计算它们的hu矩的相似度
	cout << result << endl;
	cvReleaseMemStorage(&contours1->storage);
	cvReleaseMemStorage(&contours1->storage);
	cvReleaseImage(&src1);
	cvReleaseImage(&src2);
	return 0;
}

给出了10副图片2.jpg  3.jpg.....11.jpg

其中2.jpg和11.jpg非常相似,我们代码是要实现的在3~11.jgp找到与2.jpg最相似的图片。

代码:

#include <iostream>
#include <string>
#include <sstream>
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
using namespace std;

int main()
{
	IplImage *srcColor = cvLoadImage("E:\\study_opencv_video\\lesson15_3\\2.jpg", 1);
	IplImage *src = cvCreateImage(cvGetSize(srcColor), 8, 1);
	cvCvtColor(srcColor, src, CV_BGR2GRAY);
	if(!src)
	{
		cout << "No Image Load" << endl;
	}
	int i;
	stringstream ss;
	string path;
	string str;
	IplImage *dst = NULL, *dstColor;
	char c[256];
	double result, maxResult= 1000 * 256 *256;
	IplImage *resultMap = NULL;
	for (i = 3; i < 12; i ++)
	{
		path = "E:\\study_opencv_video\\lesson15_3\\";
		ss.clear();
		ss << i;
		ss >> str;
		str += ".jpg";
		path += str;
		ss.clear();
		ss << path;
		ss >> c;
		dstColor = cvLoadImage(c,1);       //读取图片
		dst = cvCreateImage(cvGetSize(dstColor), 8, 1);
		cvCvtColor(dstColor, dst, CV_BGR2GRAY);
		result = cvMatchShapes(src, dst, 1);
		if(maxResult > result)         //求最大相似
		{
			resultMap = cvCreateImage(cvGetSize(dstColor), 8, 3);
			maxResult = result;
			cvCopy(dstColor, resultMap);
		}
	}
	cvNamedWindow("srcColor", 0);
	cvNamedWindow("resultMap",0);
	cvShowImage("resultMap", resultMap);
	cvShowImage("srcColor", srcColor);
	cvWaitKey(0);
	cvReleaseImage(&src);
	cvReleaseImage(&srcColor);
	cvReleaseImage(&dst);
	cvReleaseImage(&dstColor);
	cvReleaseImage(&resultMap);
	cvDestroyWindow("srcColor");
	cvDestroyWindow("resultMap");
	return 0;
}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值