#include "cv.h"
#include "highgui.h"
#include "stdio.h"
//*****************************************************
//画直方图函数:根据输入图像,显示HSV二维直方图
//src :指向输入图像的指针
//h_bins :H分量(hue色调)在直方图里划分的等级
//s_bins :S分量(saturation饱和度)在直方图里划分的等级
//scale :直方图每个矩形的宽度
//width :直方图的宽度
//height :直方图的高度
//srcname[] :用于储存载入源图像窗口的名字
//histname[] :用于储存显示直方图图像的窗口的名字
//返回值 :指向生成的直方图的指针
//*****************************************************
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;
}
//*****************************************************
//主函数
//*****************************************************
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;
int s_bins = 8;
int scale = 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 );
printf( "相关:%f \n卡方:%f \n相交:%f \n距离:%f \n\n", cpm1, cpm2, cpm3, cpm4 );
/*对比第一、第三两个直方图,并打印各个比较值*/
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 );
printf( "相关:%f \n卡方:%f \n相交:%f \n距离:%f \n\n", cpm1, cpm2, cpm3, cpm4 );
/*对比第二、第三两个直方图,并打印各个比较值*/
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 );
printf( "相关:%f \n卡方:%f \n相交:%f \n距离:%f \n\n", cpm1, cpm2, cpm3, cpm4 );
/*释放内存,销毁图像*/
cvWaitKey(0);
cvReleaseImage( &image1 );
cvReleaseImage( &image2 );
cvReleaseImage( &image3 );
cvReleaseHist( &hist1 );
cvReleaseHist( &hist2 );
cvReleaseHist( &hist3 );
cvDestroyAllWindows();
return 0;
}相关推荐
《学习OpenCV》第七章直方图(练习7.2)
给定三幅在书中讨论的不同光照条件下的手图像,利用cvCalcHist()来获得室内拍照的手的色肤直方图 分别给定2维、8维、16维、32维、256维进行运算 #include #include #include using namespace std; using namespace cv; #define cvQueryHistValue_1D( hist, idx0 )
opencv笔记——cvCreateImage函数说明
参考网址: 函数cvCreateImage用于创建图像头并分别数据空间。也就是创建图像,并进行初始化设置。 IplImage* cvCreateImage(CvSize size, int depth, int channels); size 图像的长度和宽度。 depth 图像像素的位深度,值为可以为下面一种: IPL_DEPTH_8U - 8位无符号整数 IPL
Python2.7+OpenCV的安装配置以及部分图像基础处理
OpenCV的环境搭建(python3.6.7) 按照习惯,我会先查看自己的python版本,进入python所在文件夹目录后输入python,则命令行会输出对应的python界面,如下图: 在下载安装好python的基础上,安装OpenCV只需要几个简单步骤。 1.打开命令行,进入自己所安装的python所在的文件夹目录下,这里要注意,若是不进入目录,直接输入OpenCV安装语句是无效的。 ...
《学习OpenCV3》(中文版)环境配置摘记
《学习OpenCV3》环境配置摘记 这篇博客是看完《学习OpenCV3》环境配置部分的摘记 只摘部分,完整版请自己翻阅《学习OpenCV3》 下载和安装OpenCV 如果想要获取最新的高级函数功能,也可以下载和编译opencv_contrib模块:网址 Windows系统 (似乎是Visual Studio配置教程) 下载链接:https://opencv.org/...
Opencv3与Opencv2的区别,及opencv2项目移植到opencv3注意事项
Opencv2标志着opencv革命性的改变,Opencv2带来了全新的C++接口,将Opencv的能力无限放大。在2.0时代,opencv增加了新的平台支持,包括iOS和Android,通过CUDA和openGL实现了GPU加速,为Python和Java用户提供了接口。Opencv 3改变了项目架构的方式,3.0版本不会像2.0版本一样激进的尝试,只会有足够稳定的改进。项目架构的改变是Openc...
Ubuntu16.04+python2.7搭建opencv3.2.0
在安装opencv3.2.0的过程中,我遇到了好多坑,特此记录一下。建议安装了Anaconda的朋友们找一找网上的方法,直接利用它进行安装,可以避免很多坑。 下面结合参考的网上的教程,说一说我的安装过程和解决办法。 一、准备工作 提前下载好三个文件,https://github.com/hanxuan123/opencv3.2/tree/master/all,这里给出网上分享的一...
【opencv练习29 - 直方图比较】
/******************************************************* 测试程序 【直方图比较】 时间:2016年8月31日 ********************************************************/ int main(void) { Mat src_base, hsv_base; Mat
《学习OpenCV》练习题第二章第三题
#include #include #pragma comment (lib,"opencv_calib3d231d.lib") #pragma comment (lib,"opencv_contrib231d.lib") #pragma comment (lib,"opencv_core231d.lib") #pragma comment (lib,"opencv_features2d23
《学习OpenCV》练习7-1
#include "cv.h" #include "highgui.h" #include "stdio.h" int main() { /*产生10000随机数,并将随机数储存于一个1*10000像素的图像中*/ CvRNG rng; rng = cvRNG( cvGetTickCount() ); IplImage* mat = cvCreateImage( cvSize(1,
树莓派 安装centos7 开发docker + python2.7 +opencv
树莓派 安装centos7 开发docker + python2.7 +opencv 一 系统安装: 1,准备: 树莓派3b 一个 电源线一根 SD卡一张 网线一根 一台电脑 2,开始: SD卡接入usb转换槽中并接入电脑。 格式化SD卡,使用 SD Memory Card Formatter 格式化。 下载centos7系统镜像(ubantu真是太恶心了,教程和安装...
ElasticSearch集群搭建
docker安装es集群
OpenCV基础学习2
【代码】OpenCV基础学习2。
安卓/苹果/支付宝sdk拉起支付宝h5/app支付
代码】安卓/苹果/支付宝sdk拉起支付宝h5/app支付。
Ubuntu python2.7安装opencv
首先,先给出一个opencv-python的下载链接,里面包含所有版本和不同操作系统下版本,感觉挺有用的,记录一下~~~ https://pypi.tuna.tsinghua.edu.cn/simple/opencv-python/ 今天遇到一个问题,就是需要在python2.7下安装opencv,结果试了几种方法却失败了,网上搜到了很多通过cmake编译的方法,但本人不想那么麻烦,心想...
避坑指南:Zabbix poller进程100%占用的5种常见原因及解决方案
本文深入剖析了Zabbix poller进程占用率高达100%的五大常见原因,包括监控项与进程数不匹配、不可达主机资源浪费、数据库性能瓶颈、监控项配置不合理以及版本缺陷。文章提供了从系统化诊断到针对性解决方案的完整指南,并重点介绍了如何通过优化zabbix_server.conf中的StartPollers等关键参数进行有效调优,帮助运维人员从根本上解决这一经典性能问题。
《哥谭神话-工程篇》01.Palantir 平台架构解析-混乱数据如何转化唯一真相源?
Palantir 平台的架构哲学可以概括为将洞察落地为行动,其核心是将“获取唯一真相”能力深度嵌入现有的、复杂的工作流程中,成为提升运营效率和决策质量的倍增器。
Python2.7安装Opencv3
Python2.7上安装Opencv2的教程网上有很多,我安装的是Python2.7,安装Opencv2按照网上的教程很顺利,但是在自己学习OpenCV-Python Tutorials教程时,cv2.connectedComponentsWithStats()这个函数不能使用,在Stackoverflow上有人说是这个函数只在Opencv3中有,故想着安装下Opencv3 系统:Win
Python+Tableau 全流程数据分析实战:从数据清洗到商业洞察可视化
本文通过Python+Tableau完整演示电商销售数据分析流程。首先使用Python进行数据清洗(缺失值处理、异常值过滤等)和探索性分析(商品类别、时间趋势等),然后导入Tableau创建交互式可视化仪表盘。分析发现电子产品销售额最高但利润率低,美妆类利润率最优,东部地区销售表现最好。最终提出优化供应链、加强美妆推广等商业建议,展示了Python数据处理与Tableau可视化的高效配合。所有代码可直接运行,适合数据分析初学者和从业者实战参考。
centos7上安装opencv4.2
好记性不如烂笔头,放到网上才安全 1. 首先安装cmake 1.1 去cmake官网下载最新版的软件,然后上传到centos 1.2 解压安装包 tar zxvf cmake-3.17.0-rc2.tar.gz 1.3 编译安装 cd cmake-3.17.0-rc2 ./bootstrap make && make in...
brpc组件bvar源码解析(一)简介、使用和类的关系
bvar是brpc中的一个重要组件,brpc内部有很多builtin监控都是bvar实现的。 brpc文档介绍bvar“几乎不会给程序增加性能开销,也快于竞争频繁的原子操作”。它的原理是:多线程累加一个计数器时,每个线程只累加私有的变量而不参与全局竞争,因此写时没有锁的竞争;在读取时累加所有线程的私有变量。虽然读比之前慢多了,但写就快多了,因此它使用写多读少的场景,例如统计、监控场景。 1.使用 // bvar::Adder<T>用于累加,下面定义了一个统计read error总数的Adder。
Cadence virtuos安装教程
本文详细介绍了在Ubuntu 18.04系统上安装Cadence Virtuoso IC617及MMSIM的完整流程。主要内容包括:1)系统环境准备(安装JDK及相关依赖包);2)通过创建软链接和修改系统文件实现RedHat环境兼容;3)共享目录文件操作与分卷压缩包合并解压技巧;4)使用InstallScape工具的安装步骤详解,包括权限处理和配置选项。特别提醒需注意系统兼容性处理(如创建redhat-release文件)和分卷压缩包的特殊解压方法(cat合并)。整个安装过程涉及大量Linux命令操作,需特
OpenCV学习2
【代码】OpenCV学习2。
RK3588高速接口实战-PCIE
摘要: RK3588的PCIe接口支持PCIe 3.0x4和PCIe 2.1x1/x2,具备Root Complex和Endpoint模式,适用于NVMe SSD、5G模块等高速设备。硬件设计需注意85Ω/100Ω阻抗匹配、220nF AC耦合电容及100MHz参考时钟。设备树需配置控制器节点、PHY模式和IOMMU映射(RC模式用iommu-map,EP模式用iommus)。调试时可通过lspci检查链路状态,dmesg查看训练日志,perf分析性能。常见问题包括设备识别失败(检查复位时序、PHY配置)、
python2.7安装opencv2.4.13
Ubuntu14.04 + Opencv-2.4.13 + Python2.7 配置 本文主要记录了为ubuntu14.04 下的 Python2.7 配置cv2库的步骤 主要参考博文1 和 博文 1. Opencv 的基本依赖库 主要参考博文 # 其中,numpy 库可以考虑用 pip 进行安装 sudo apt-get install build-essential c...
pscad IEEE标准系统搭建说明
pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。
汉书HE8,好用的汇编代码编写工具
汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大
[opencv][python] 学习手册2:练习代码3
32_打开摄像头.py 33_视频分解图像.py 34_人脸识别案例.py 35_摄像头人脸识别.py 36_判断当前是白天还是黑夜.py
WINCC7.3破解文件
WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!
windows OpenCV 2.3.1/Opencv2.4.6 + Python 2.7配置
1 .下载 OpenCV 2.3.1 。文中下载了OpenCV-2.3.1-win-superpack (大概124MB,解压后1G多)。他不需编译,使用方便 下载地址 2. OpenCV-2.3.1-win-superpack.exe是自解压文件,直接运行。即可解压。默认解压到opencv文件夹里。 3.下载numpy。opencv的python版需要该模块。下载页面在这里 注意,下载和P
564



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



