opencv计算两个轮廓之间hu矩相似程度,MatchShapes
https://blog.csdn.net/jiake_yang/article/details/52589063
【OpenCV3.3】通过透视变换矫正变形图像 https://blog.csdn.net/rrrfff/article/details/77340641
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;
}
opencv计算两个轮廓之间hu矩相似程度,MatchShapes的更多相关文章
- IOS 计算两个经纬度之间的距离
IOS 计算两个经纬度之间的距离 一 丶 -(double)distanceBetweenOrderBy:(double) lat1 :(double) lat2 :(double) lng1 :(d ...
- java中计算两个日期之间天数的程序设计。
//用java编写出一个以下方法计算两个日期之间天数的程序设计. import java.util.regex.Matcher; import java.util.regex.Pattern; pub ...
- java计算两个日期之间相隔的天数
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...
- PHP 计算两个时间戳之间相差的时间
//功能:计算两个时间戳之间相差的日时分秒 //$begin_time 开始时间戳 //$end_time 结束时间戳 function timediff($begin_time,$end_time) ...
- 高德地图 API 计算两个城市之间的距离
1. 目前在项目中,遇到一个需求不会做,就是要计算两个城市之间的距离,而这两个城市的输入是可变的,如果要使用数据库来先存储两地之间的距离,调用的时候再来调用,那么存数据的时候,要哭的,因为光是省级区域 ...
- java计算两个日期之间相隔的月份(向下取整)
最近需求里面有个需要计算两个日期之间相隔的月份,写起来还挺繁琐,需要将各种情况都要考虑到,写了一个作为以后自己的工具吧. //获取哪一天 public static int getDay(Date d ...
- 计算两个NSDate之间,相隔多少秒数
计算两个NSDate之间,相隔多少秒数 //两个时间间隔秒数 - (NSInteger)intervalSecondsWithSmallDate:(NSDate*)smallDate bigDate: ...
- PHP计算两个时间戳之间间隔时分秒
/功能:计算两个时间戳之间相差的日时分秒//$begin_time 开始时间戳//$end_time 结束时间戳function timediff($begin_time,$end_time){ if ...
- JS计算两个日期之间的天数
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
随机推荐
- LeetCode - Subarray sum equals k
Given an array of integers and an integer k, you need to find the total number of continuous subarra ...
- rmq区间最值
时间复杂度O(NlogN)+O(Q) int a[N]; int dpmax[N][20],dpmin[N][20]; void first(int n) { mm(dpmax,0); mm(dpmi ...
- vue前后分离---数据模拟
最近为在做CRM的前期工作,忙里偷闲写了个关于数据模拟方面的东西 主要是现在博客中满天都再说前后分离,但是还没有几个实际操作的---让许多新手{-_-} 方法一: 启动一个express静态服务器-- ...
- Python学习之旅(十三)
Python基础知识(12):函数(Ⅲ) 高阶函数 1.map map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterat ...
- [Luogu P1886]滑动窗口--单调队列入门
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- itoa()、atoi()、任意进制转换
头文件:<stdlib.h> itoa --功能:将任意类型的数字转换为字符串.在<stdlib.h>中与之有相反功能的函数是atoi. atoi----功 能: 将字符串转换 ...
- java 编写函数将字符串的首尾空格删除。
String 类有个方法去除字符串首位空格: str.trim(); 查看源代码: public String trim() { int len = value.length; ; char[] va ...
- UUID、GUID、SID、SUSID
1. UUID: (Universally Unique Identifier) 通用唯一标识符, 是一个标识符标准用于软件架构,由开放软件基金会(OSF)作为分布式计算环境(DCE)的一部分而制作的 ...
- Java之事务的基本应用
基本介绍 事务是数据一致性最基本的保证,也就是说一个事务中的操作要么都成功,要么都失败,不允许部分成功.我们常说的事务就是jdbc事务,当然Java中还有其他事务,并且在使用jdbc事务有很多注意点, ...
- C++——创建类的时候用new与不用new 的区别(转)
C++在创建对象的时候可以采用两种方式:(例如类名为Test) Test test 或者 Test* pTest = new Test(). 这两种方法都可以实例化一个对象,但是这两种 ...