#include "cv.h"
#include "highgui.h"
#include "stdio.h"
//*****************************************************
//画直方图函数:根据输入图像,显示HSV二维直方图
//src :指向输入图像的指针
//h_bins :H分量(hue色调)在直方图里划分的等级
//s_bins :S分量(saturation饱和度)在直方图里划分的等级
//scale :直方图每个矩形的宽度
//width :直方图的宽度
//height :直方图的高度
//srcname[] :用于储存载入源图像窗口的名字
//histname[] :用于储存显示直方图图像的窗口的名字
//返回值hist :指向生成的直方图的指针
//*****************************************************
CvHistogram* myHSVHistogram( IplImage* src, int h_bins, int s_bins, int scale, int width, int height, const char srcname[], const char histname[] )
{
if (src==NULL || src->nChannels!=3)
{
return NULL;
}
/*hsv图像初始化*/
IplImage* hsv = cvCreateImage( cvGetSize(src), 8, 3 );
IplImage* h_plane = cvCreateImage( cvGetSize(src), 8, 1 );
IplImage* s_plane = cvCreateImage( cvGetSize(src), 8, 1 );
IplImage* v_plane = cvCreateImage( cvGetSize(src), 8, 1 );
IplImage* planes[] = { h_plane, s_plane };
/*H分量(hue色调)划分等级,S分量(saturation饱和度)划分等级*/
int hist_size[] = { h_bins, s_bins };
/*H分量、S分量的变化范围*/
float h_ranges[] = { 0, 180 };
float s_ranges[] = { 0, 255 };
float* ranges[] = { h_ranges, s_ranges };
/*输入图像转换到HSV颜色空间,并将h、s、v分别分割到各自的单通道图像上*/
cvCvtColor( src, hsv, CV_BGR2HSV );
cvSplit( hsv, h_plane, s_plane, v_plane, 0 );
/*创建直方图,二维, 每个维度上均分*/
CvHistogram * hist = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 );
/*根据H、S两个平面数据统计planes图像的直方图*/
cvCalcHist( planes, hist, 0, 0 );
/*获取直方图统计的最大值,用于动态显示直方图*/
float max_value;
cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 );
/*设置直方图显示图像的高度、宽度*/
IplImage* hist_img = cvCreateImage( cvSize(width,height), 8, 3 );
cvZero( hist_img );
/*用来进行HSV到RGB颜色转换的临时单位图像*/
IplImage* hsv_color = cvCreateImage(cvSize(1,1),8,3); //单位图像,相当于一个8bit、3通道的像素点
IplImage* rgb_color = cvCreateImage(cvSize(1,1),8,3);
/*for循环显示矩形*/
for (int h=0; h<h_bins; h++) //循环画色调直方图
{
for (int s=0; s<s_bins; s++) //在每个画色调直方图循环中,循环画饱和度直方图
{
int i = h*s_bins+s; //直方图中某一矩形的序号(从左到右,由大到小,从0开始)
float bin_val = cvQueryHistValue_2D( hist, h, s ); //获得某一直方图矩形的数值,即统计数值
int intensity = cvRound( bin_val*height/max_value ); //四舍五入,计算显示在图像中的矩形高度
cvSet2D( hsv_color, 0, 0, cvScalar( h*180.f/h_bins, s*255.f/s_bins, 255, 0));
cvCvtColor( hsv_color, rgb_color, CV_HSV2BGR ); //为hsv像素点设置颜色(颜色设置使用了归一化),并转换为rgb格式
CvScalar color = cvGet2D( rgb_color, 0, 0 );
cvRectangle( //画矩形
hist_img,
cvPoint( i*scale, height ), //起点横坐标为第i个矩形乘以每个矩形宽度,纵坐标为图像高度,即图像底部
cvPoint( (i+1)*scale, height-intensity ), //终点横坐标为矩形宽度,纵坐标为图像底减去矩形高度,令矩形显示在底部
color,
CV_FILLED, //填充矩形
8,
0 );
}
}
/*显示源图像与直方图*/
cvNamedWindow( srcname, CV_WINDOW_NORMAL );
cvShowImage( srcname, src );
cvNamedWindow( histname, CV_WINDOW_AUTOSIZE );
cvShowImage( histname, hist_img );
return hist;
}
//**************************************************************************
//生成EMD的signature函数:输入图像生成signature并输出EMD距离
//hist1,hist2 :指向输入比较图像的指针
//h_bins,s_bins :H(hue色调)、S(saturation饱和度)在直方图里划分的等级
//返回值emd :输入两幅比较图像的EMD距离
//**************************************************************************
float myEMDsignature( CvHistogram* hist1, CvHistogram* hist2, int h_bins, int s_bins )
{
/*构建一个(h_bins*s_bins)*3的矩阵头*/
CvMat* sig1 = NULL;
CvMat* sig2 = NULL;
int rows = h_bins*s_bins;
int cols = 3;
sig1 = cvCreateMat( rows, cols, CV_32FC1 );
sig2 = cvCreateMat( rows, cols, CV_32FC1 );
/*给二维直方图的矩阵赋值,矩阵每一列第一个变量为bin的值,第二第三为为某点坐标(h,s)*/
for (int h=0; h<h_bins; h++)
{
for (int s=0; s<s_bins; s++)
{
float bin_val = cvQueryHistValue_2D( hist1, h, s );
cvSet2D( sig1, h*s_bins+s, 0, cvScalar(bin_val));
cvSet2D( sig1, h*s_bins+s, 1, cvScalar(h));
cvSet2D( sig1, h*s_bins+s, 2, cvScalar(s));
bin_val = cvQueryHistValue_2D( hist2, h, s );
cvSet2D( sig2, h*s_bins+s, 0, cvScalar(bin_val));
cvSet2D( sig2, h*s_bins+s, 1, cvScalar(h));
cvSet2D( sig2, h*s_bins+s, 2, cvScalar(s));
}
}
/*计算EMD距离并返回*/
float emd = cvCalcEMD2( sig1, sig2, CV_DIST_L2 );
return emd;
}
//*****************************************************
//主函数
//*****************************************************
int main()
{
/*载入图像并检测*/
IplImage* image1 = cvLoadImage( "E:\\...\\hand_1.jpg", CV_LOAD_IMAGE_COLOR );
assert(image1 != NULL);
IplImage* image2 = cvLoadImage( "E:\\...\\hand_2.jpg", CV_LOAD_IMAGE_COLOR );
assert(image2 != NULL);
IplImage* image3 = cvLoadImage( "E:\\...\\hand_3.jpg", CV_LOAD_IMAGE_COLOR );
assert(image3 != NULL);
/*显示直方图的变量初始化*/
int h_bins = 18; //180平均分成18份
int s_bins = 8; //256平均分成8份
int scale = 8; //每个矩形宽度为8
int width = (h_bins*s_bins)*scale;
int height = 300;
/*创建直方图,并调用我的直方图画图函数画出直方图*/
CvHistogram* hist1;
CvHistogram* hist2;
CvHistogram* hist3;
hist1 = myHSVHistogram( image1, h_bins, s_bins, scale, width, height, "hand_1", "hist_image_1" );
hist2 = myHSVHistogram( image2, h_bins, s_bins, scale, width, height, "hand_2", "hist_image_2" );
hist3 = myHSVHistogram( image3, h_bins, s_bins, scale, width, height, "hand_3", "hist_image_3" );
/*对比第一、第二两个直方图,并打印各个比较值*/
printf( "h_bins=%d, s_bins=%d时图像1与图像2直方图的比较:\n", h_bins, s_bins );
double cpm1 = cvCompareHist( hist1, hist2, CV_COMP_CORREL );
double cpm2 = cvCompareHist( hist1, hist2, CV_COMP_CHISQR );
double cpm3 = cvCompareHist( hist1, hist2, CV_COMP_INTERSECT );
double cpm4 = cvCompareHist( hist1, hist2, CV_COMP_BHATTACHARYYA );
float emd = myEMDsignature( hist1, hist2, h_bins, s_bins );
printf( "相关:%f \n卡方:%f \n相交:%f \n距离:%f \nEMD :%f \n\n", cpm1, cpm2, cpm3, cpm4, emd );
/*对比第一、第三两个直方图,并打印各个比较值*/
printf( "h_bins=%d, s_bins=%d时图像1与图像3直方图的比较:\n", h_bins, s_bins );
cpm1 = cvCompareHist( hist1, hist3, CV_COMP_CORREL );
cpm2 = cvCompareHist( hist1, hist3, CV_COMP_CHISQR );
cpm3 = cvCompareHist( hist1, hist3, CV_COMP_INTERSECT );
cpm4 = cvCompareHist( hist1, hist3, CV_COMP_BHATTACHARYYA );
emd = myEMDsignature( hist1, hist3, h_bins, s_bins );
printf( "相关:%f \n卡方:%f \n相交:%f \n距离:%f \nEMD :%f \n\n", cpm1, cpm2, cpm3, cpm4, emd );
/*对比第二、第三两个直方图,并打印各个比较值*/
printf( "h_bins=%d, s_bins=%d时图像2与图像3直方图的比较:\n", h_bins, s_bins );
cpm1 = cvCompareHist( hist2, hist3, CV_COMP_CORREL );
cpm2 = cvCompareHist( hist2, hist3, CV_COMP_CHISQR );
cpm3 = cvCompareHist( hist2, hist3, CV_COMP_INTERSECT );
cpm4 = cvCompareHist( hist2, hist3, CV_COMP_BHATTACHARYYA );
emd = myEMDsignature( hist2, hist3, h_bins, s_bins );
printf( "相关:%f \n卡方:%f \n相交:%f \n距离:%f \nEMD :%f \n\n", cpm1, cpm2, cpm3, cpm4, emd );
/*释放内存,销毁图像*/
cvWaitKey(0);
cvReleaseImage( &image1 );
cvReleaseImage( &image2 );
cvReleaseImage( &image3 );
cvReleaseHist( &hist1 );
cvReleaseHist( &hist2 );
cvReleaseHist( &hist3 );
cvDestroyAllWindows();
return 0;
}相关推荐
python3.7 -openCV安装教程与测试
安装过程 我下载的python是3.5版本,然后安装了Anaconda3。一开始安装opencv时在命令行窗口输入pip install python-opencv直接安装,但是安装的路径错误,测试代码时显示不了图片,然后进了一个网址https://www.jianshu.com/p/ae9b59909f0e,按照上面教程重新下载opencv。 测试安装成功:输入import cv2未报错 安装时...
《学习OpenCV》练习7-2
#include "cv.h" #include "highgui.h" #include "stdio.h" //***************************************************** //画直方图函数:根据输入图像,显示HSV二维直方图 //src :指向输入图像的指针 //h_bins :H分量(hue色调)在直方图里划分的等级 /
在pycharm2021.2中学习opencv图像处理,基于python3.9.7、pycharm完成配置
在pycharm中学习opencv图像处理安装python下载python安装包开始安装安装pycharm社区版下载pycharm开始安装如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 安装python 使用pycharm学习opencv应该是最简单的了,对新手比较友好,
opencv笔记——cvCreateImage函数说明
参考网址: 函数cvCreateImage用于创建图像头并分别数据空间。也就是创建图像,并进行初始化设置。 IplImage* cvCreateImage(CvSize size, int depth, int channels); size 图像的长度和宽度。 depth 图像像素的位深度,值为可以为下面一种: IPL_DEPTH_8U - 8位无符号整数 IPL
在pycharm中(python3.7)安装cv2/opencv
直接拧干水份,上干货 先在 https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy 这个上面找到对应于自己python版本的opencv,我的python是3.7的,我看了很多资料,说python2.7要用3.1的opencv,所以我就直接下载的是下面这个,大家如果不敢确定自己应该下载那个版本的,可以根据我下面写的这个试试: python2.7-----------------------3.1Opencv python3.0/python3.0±--------
Win7下Cmake编译配置opencv3.3+contrib+cuda7.5
这次配置cuda加速真是遇到各种错误,前后折腾了三四天才总算成功了。下面是我的编译配置opencv的步骤以及遇到的一些坑。 1.准备工作 opencv3.3 源文件下载链接:https://github.com/opencv/opencv opencv_contirb 源文件下载链接:https://github.com/opencv/opencv_contrib cm...
QT学习opencv3中文版--第三章练习题自我注解
学习opencv3中文版--第三章练习题自我注解``欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图...
Window7 下编译Opencv 3.3+contrib模块+Cmake+VS2015
1.所需工具 Opencv3.3 Opencv3.3 Cmake Cmake下载 contrib Opencv_contrib_3.3.0 这里说一下,Opencv尽量使用对应版本的Contrib模块,不然在Cmake的时候容易出错。 2.CMake编译 下载完三个工具之后,全部解压/安装,在Opencv文件夹下建立一个newbuild文件夹(名字随意),比如我的OPencv装在D:\...
直方图中bin的说明
每个直方图,通常都可以用一个列向量来表示,列向量里面的每一个值就是一个bin,比如说列向量有个50个元素,那么就代表有50个bin。 对于彩色图像,一般是rgb图像,都是3-channel,每个channel一般是255个灰度级,即每个通道对应8个bin,那么一幅RGB图像就对应8x8x8=512bin。 对应于彩色图像为什么是512bins呢?为什么是8*8...
【OpenCV3编程入门学习笔记】——第1章 邂逅OpenCV
邂逅OpenCV 文章目录邂逅OpenCV前言1.1 OpenCV周边概念认知1.1.1 图像处理、计算机视觉与OpenCV1.1.2 OpenCV概述1.1.3 起源及发展1.1.4 应用概述1.2 OpenCV基本架构分析1.3 OpenCV3带来了什么1.4 OpenCV的下载、安装与配置1.5 快速上手OpenCV图像处理前期准备1.5.1 程序一 图像显示1.5.2 程序二 图像腐蚀1.5.3 程序三 图像模糊1.5.4 程序四 canny边缘检测1.6 OpenCV视频操作基础1.6.1 读取并
基于Matlab-Simulink的大林算法控制系统设计与振铃消除实验
本文详细介绍了基于Matlab-Simulink的大林算法控制系统设计与振铃消除实验。通过分析纯滞后系统的控制难题,探讨大林算法在工业控制中的应用优势,并提供Matlab-Simulink环境搭建、控制器D(z)设计、振铃消除及仿真实验的完整流程。文章还对比了大林算法与PID控制的性能差异,为工程实践提供参考。
《学习OpenCV》练习3-7
#include "cv.h" #include "highgui.h" #include "stdio.h" int main() { IplImage* img = cvLoadImage( "homework_3-7.jpg" ); IplImage* clone1, *clone2; IplImage* dst = cvCreateImage( cvGetSize(img), im
【论文精度】生成式预训练模型——BART(Bidirectional and Auto-Regressive Transformers)
BART是一个预训练的seq2seq的去噪自编码(denoising autoencoder)模型,BART以下方式进行训练①用任意的噪声函数(noising function)去破坏文本;②学习一个模型来重建原始文本。它使用一个标准的基于transformer的神经机器翻译架构,可以看作是BERT(双向编码器)、GPT(left-to-right解码器)以及其他预训练方案的推广。
基于QT5的opencv学习之《学习opencv课后练习3-7》
#------------------------------------------------- # # Project created by QtCreator 2015-11-23T20:46:54 # #------------------------------------------------- QT += core QT -= gui
CCS20实战入门:第一个工程搭建示例
通过实际操作演示如何在ccs20中创建并配置首个开发项目,涵盖环境设置与基础调试步骤,帮助新手快速上手ccs20集成开发环境,提升嵌入式开发效率。
STM32F103中GPIO_Remap1_CAN1与GPIO_Remap2_CAN1的配置差异与应用场景解析
本文深入解析了STM32F103中GPIO_Remap1_CAN1与GPIO_Remap2_CAN1的配置差异与应用场景。通过剖析AFIO_MAPR寄存器,明确了两者在引脚映射(PB8/PB9 vs PD0/PD1)和适用封装上的区别,并提供了详细的配置步骤、常见陷阱排查及基于项目需求的选型指南,帮助开发者高效完成CAN引脚重映射。
《学习OpenCV(中午版)》第3章 练习7
void myType7() { IplImage* src = cvLoadImage("lena.jpg", CV_LOAD_IMAGE_UNCHANGED); IplImage* blue = cvCreateImage(cvSize(src->width, src->height), src->depth, 1); IplImage* green = cvCreateImage(cv
大数据利器Hadoop:从基础到实战,一篇文章掌握大数据处理精髓!
在当今大数据时代,数据量的爆炸式增长对企业和技术提出了前所未有的挑战。如何高效地存储、处理和分析这些庞大的数据集,成为了亟待解决的问题。Hadoop作为一种分布式计算框架,应运而生,为大数据处理提供了有效的解决方案。Hadoop是一个由Apache软件基金会维护的开源项目,它基于Google的分布式文件系统(Google File System,GFS)和MapReduce计算模型设计。Hadoop的主要目标是处理大规模数据集,它可以在普通硬件集群上运行,从而降低了大数据处理的成本。
《学习OpenCV》第七章直方图(练习7.1)
《学习OpenCV》第七章课后题一 7.1 在0-1之间生成1000个随机值ri,定义一个bin的大小,并且建立一个直方图几1/ri。 在每一个bin中元素数是否相同(正负差值在10内即可) #include #include #include using namespace std; using namespace cv; #define cvQueryHistValue_1D(
【DDR5 PCB走线SI/PI仿真调试】详细全攻略
问题场景发现症状优化措施过孔Stub效应TDR波形尖峰,信号反射严重使用盲孔,背钻减少Stub,降低Via数量串扰过大眼图闭合,误码率增加增加走线间距,插入地线隔离,减少平行长度电源阻抗过高PDN谐振导致纹波大多频率去耦,靠近电源引脚布置多档电容,合理分层信号时序失配优化走线长度匹配,避免信号走线跨层跳变DDR5设计不仅是硬件的挑战,更是仿真能力的考验。掌握SI/PI仿真,理解信号背后的物理本质,才能真正把握高速接口的“灵魂”!
要理解成本中心与利润中心的根本区别与适用场景,需从 “责任范围、考核核心、管理目标” 三个核心维度切入,同时明确二者在企业管理体系中的联动关系
摘要: 成本中心与利润核心区别在于责任范围、考核目标和管理权限。成本中心仅对成本负责(如生产、行政部门),考核成本控制能力;利润中心需同时管控成本与收入(如独立产品线、区域分公司),以利润为核心指标。选择标准取决于单元是否拥有收入决策权:无收入权的支持/执行部门设为成本中心,能独立经营、核算盈亏的单元设为利润中心。二者协同运作,成本中心为利润中心提供基础支持,利润中心的需求动态影响成本中心资源配置,共同实现企业整体目标。划分本质是确保考核指标与责任范围匹配,避免管理失效。
《学习OpenCV》第一版课后习题解答
2014-07-18起,开始练习《学习OpenCV》的课后习题。 课后练习链接索引 跳转到 章节 概要 第三章 ROI 第四章 文字输出、绘制图形、仿射变换、透视变换 第五章 平滑处理、 图像求差、漫水填充、阈值化、掩码图像、缩放 第六章 阈值化、腐蚀、边缘检测、霍夫直线变换、圆变换、坐标转换、积分图像 第七章 直...
【大数据Java基础-Java基础01】环境搭建(一)Sublime Text3搭建Java编译环境(Windows系统)
1. 首先配置好Java环境变量 我的jdk版本是1.8.0_191,存放目录是C:\Program Files\Java,因此添加以下环境变量 (1)系统变量→新建 JAVA_HOME 变量,变量值为: C:\Program Files\Java\jdk1.8.0_191 (2)系统变量→找到 Path 变量→编辑,末尾加入: ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin 如果Path变量末尾本身有“;”,则上述路径前面则不需要加“;” (3)系统变量→新建 CL
[OpenCV实战]7 使用YOLOv3和OpenCV进行基于深度学习的目标检测
目录 1 YOLO介绍 1.1 YOLOv3原理 1.2 为什么要将OpenCV用于YOLO? 1.3 在Darknet和OpenCV上对YOLOv3进行速度测试 2 使用YOLOv3进行对象检测(C++/Python) 2.1 模型及配置文件下载 2.2 初始化参数 2.3 加载模型和获取输入图像 2.4 单帧图像处理 2.4.1 获取输出层的名称 2.4.2 处理网络的输...
VC中sqlite的使用
在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示
SAP B1中文培訓教材_SDK
公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说
Python2.7安装Opencv3
Python2.7上安装Opencv2的教程网上有很多,我安装的是Python2.7,安装Opencv2按照网上的教程很顺利,但是在自己学习OpenCV-Python Tutorials教程时,cv2.connectedComponentsWithStats()这个函数不能使用,在Stackoverflow上有人说是这个函数只在Opencv3中有,故想着安装下Opencv3 系统:Win
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
5856



被折叠的 条评论
为什么被折叠?



