直方图 陆基移动距离 cvCalcEMD2 基于BGR

和基于HSV的陆基移动距离相对比,这个为三维直方图

程序:

结论:

和基于HSV的路基距离相比,效果没有HSV好

代码:

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <iostream>
CvHistogram* histogram(IplImage* src,int BSize,int GSize,int RSize) //返回归一化的histogram
{
IplImage* SrcB=cvCreateImage(cvGetSize(src),8,1);
IplImage* SrcG=cvCreateImage(cvGetSize(src),8,1);
IplImage* SrcR=cvCreateImage(cvGetSize(src),8,1);
//分割HSV
cvSplit(src,SrcB,SrcG,SrcR,NULL);
//创建histogram
CvHistogram* hist;
int dims=3;
int size[]={BSize,GSize,RSize};
float RangeB[]={0,255};
float RangeG[]={0,255};
float RangeR[]={0,255};
float* ranges[]={RangeB,RangeG,RangeR};
hist=cvCreateHist(dims,size,CV_HIST_ARRAY,ranges);
//计算histogram
IplImage* image[]={SrcB,SrcG,SrcR};
cvCalcHist(image,hist);
//归一化histogram
cvNormalizeHist(hist,1.0);
return hist;
}
CvMat* CreateSignature(CvHistogram* hist,int BSize,int GSize,int RSize)  //由histogram得到signature
{
int rows=BSize*GSize*RSize;
CvMat* mat=cvCreateMat(rows,4,CV_32FC1); //第一列为结果,第二列为histogram中该结果的行号,第三列为列号
for(int z=0;z<BSize;z++)
{
for(int y=0;y<GSize;y++)
{
for(int x=0;x<RSize;x++)
{
float data=cvQueryHistValue_3D(hist,z,y,x);
//std::cout<<data<<std::endl;
cvSet2D(mat,z*(GSize*RSize)+y*RSize+x,0,cvScalar(data));
cvSet2D(mat,z*(GSize*RSize)+y*RSize+x,1,cvScalar(z));
cvSet2D(mat,z*(GSize*RSize)+y*RSize+x,2,cvScalar(y));
cvSet2D(mat,z*(GSize*RSize)+y*RSize+x,3,cvScalar(x));
}
}
}
return mat;
}
int CalcEMD2BaseOnBGR(int argc,char** argv)
{
IplImage* src1=cvLoadImage("e:\\picture\\4.jpg");
IplImage* src2=cvLoadImage("e:\\picture\\11.jpg");
int BSize=20;  //理论上,cvCalcEMD2能计算的最大直方图签名的行数为15440,及20*20*20<15440,所以不能用30,30,30
int GSize=20;
int RSize=20;
CvHistogram* hist1=histogram(src1,BSize,GSize,RSize);
CvHistogram* hist2=histogram(src2,BSize,GSize,RSize);
CvMat* mat1=CreateSignature(hist1,BSize,GSize,RSize);
CvMat* mat2=CreateSignature(hist2,BSize,GSize,RSize);
//float max=0;
 //   float min=0;
//cvGetMinMaxHistValue(hist2,&min,&max);
//std::cout<<"hist1"<<min<<" "<<max<<std::endl;
//double Max=0;
//double Min=0;
//cvMinMaxLoc(mat2,&Min,&Max);
//std::cout<<"mat1"<<Min<<" "<<Max<<std::endl;
//计算陆基移动距离
float EMD2Result=cvCalcEMD2(mat1,mat2,CV_DIST_L2);
std::cout<<"0 is best"<<std::endl;
std::cout<<"EMD2Result:"<<EMD2Result<<std::endl;
cvNamedWindow("src1");
cvNamedWindow("src2");
cvShowImage("src1",src1);
cvShowImage("src2",src2);
cvWaitKey(0);
cvDestroyWindow("src1");
cvDestroyWindow("src2");
cvReleaseImage(&src1);
cvReleaseImage(&src2);
return 0;
}

直方图 陆基移动距离 cvCalcEMD2 基于BGR

时间: 2024-07-31 13:08:52

直方图 陆基移动距离 cvCalcEMD2 基于BGR的相关文章

直方图 陆地移动距离 cvCalcEMD2 基于HSV的HS

程序: HSize=30,SSize=32:比例为2.89 HSize=20,SSize=20:比例为2.88 HSize=50,SSize=50:比例为2.87 代码: #include "cv.h" #include "cxcore.h" #include "highgui.h" #include <iostream> CvHistogram* histogram(IplImage* src,int HSize,int SSize

【练习7.3】从直方图创建signature、计算两个直方图的EMD距离

提纲 题目要求 程序代码 结果图片 要言妙道 题目要求: 收集三种光照条件下的手的直方图,计算它们之间的EMD距离 程序代码: 1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点. 2 // 3 //D:\\Work\\Work_Programming\\Source\\Image\\lena.jpg 4 5 #include "stdafx.h" 6 #include <cv.h> 7 #include <highgui.h

【练习7.4】使用直方图陆地移动距离EMD区分不同光线条件下的图片cvCalcEMD2

提纲 题目要求 程序代码 结果图片 要言妙道 题目要求: 设计一个直方图,可以判断给定的图像是在哪种光线条件下被捕捉到的. 程序代码: 1 // OpenCVExerciseTesting.cpp : 定义控制台应用程序的入口点. 2 // 3 //D:\\Work\\Work_Programming\\Source\\Image\\lena.jpg 4 5 #include "stdafx.h" 6 #include <cv.h> 7 #include <highg

利用OpenCV的calcHist绘制灰度直方图、H-S直方图、BGR直方图和自定义直方图的源码及说明

要绘制直方图,最重要的三个函数是calcHist.line.和rectangle,下面分别进行介绍! calcHist函数: calcHist函数的原型如下: void calcHist( const Mat* images, int nimages, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform=t

基于视觉的人的运动识别综述

人的运动识别 ,可以简单地看成一个时变数据的分类问题 ,包括运动的表示和运动的识别两部分 人运动的类别 人的运动可以分为三类 : 动作 ( movement ) .行为 ( activity) 和行动 ( action) , 这三类运动分别处于三个不同复杂程度的层次上. 动作是运动的基元 ,是最基本的运动 , 是形成其他复杂 . 高级运动的基础. 一般来说动作在执行过程中会持续较短的时间 ,其识别方法一般可以采用几何或概率统计的方法. 譬如 ,打网球时挥动了一下球拍 ,这就是一个动作. 行为是指

《OpenCV:直方图应用:直方图均衡化,直方图匹配,对比直方图》

直方图均衡化 直方图均衡化(Histogram Equalization)是直方图最典型的应用,是图像点运算的一种.对于一幅输入图像,通过运算产生一幅输出图像,点运算是指输出图像的每个像素点的灰度值由输入像素点决定,即: 直方图均衡化是通过灰度变换将一幅图像转换为另一幅具有均衡直方图,即在每个灰度级上都具有相同的象素点数过程.从分布图上的理解就是希望原始图像中y轴的值在新的分布中尽可能的展开.变换过程是利用累积分布函数对原始分布进行映射,生成新的均匀拉伸的分布.因此对应每个点的操作是寻找原始分布

转:基于内容的视频分析与检索

摘要 文章简要介绍了从基于内容的视频分析与检索问题的提出到所涉及的关键技术以及目前研究状况,并简要介绍了现阶段在这方面的研究热点及以后要做的工作. 一.问题的提出: 互联网的出现给人类带来了很大的便利,特别是实现资源共享之后的互联网,但面对这浩如烟海的资源到底哪些是对自己有利用价值的呢?而90年代以来,多媒体技术和网络技术的突飞猛进,人们正快速的进入一个信息化社会.现代技术已能运用各种手段采集和生产大量各种类型的多媒体信息数据,出现了数字图书馆.数字博物馆.数字电影.可视电话.交互电视.会议电视

【代码相似论文笔记】基于序列聚类的相似代码检测算法

摘要: 为了提高源程序代码之间相似性的检测效率,提出一种基于序列聚类的相似代码检测算法. 算法首先把源代码按照其自身的结构进行分段提取,然后对各个分段进行部分代码变换,再以带权重的编辑距离为相似度量标准对这些符号进行序列聚类,得到相似的程序代码片段,以达到对源程序进行相似功能检测的目的. 应用: 可以通过检测源程序中的相似代码对源程序进行简化,也可以查找出多个程序之间的相似功能,还能用于抄袭检测. 步骤: 1.提取出源代码中的功能段 2.以带权重的编辑距离为相似度量标准 3.通过聚类源程序代码序

【转】关于Mahalanobis距离的笔记

Mahalanobis距离是用来度量一个点P和一个分布D之间的距离,它是衡量点P与分布D的均值之间存在多少个标准差的一个多维泛化版本. 如果P就位于分布D的均值处,则该距离为0:该距离随着P的偏离均值开始逐步增大. 由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示数据的协方差距离.它是一种有效的计算两个未知样本集的相似度的方法.与欧氏距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的)并且是尺度无关的(scal