《学习OpenCV》练习7-2

学习opencv3中文版--第三章练习题答案 1. #include<opencv2/opencv.hpp> using namespace std; int main() { /* a.选择一个负的浮点数 b.计算它的绝对值,近似,向上取整,向下取整 */ //生成一个负的浮点数 Cv32suf f; f.f = -2.3; cout <<"负的浮点... 阅读详情
#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直方图创建CreateHist、计算cvCalcHist和访问的汇总 直方图广泛应用于很多计算机视觉应用中。通过标记帧与帧之间显著的边缘和颜色的统计变化,直方图被用来检测视频中场景的变换。通过为每个兴趣点设置一个有相近特征的直方图所构成的“标签”,用以确定图像中的兴趣点。边缘、色彩、角等直方图构成了可以被传递给目标识别分类器的一个通用特征类型。色彩和边缘的直方图序列还可以用来识别网络视频是否被复制等。直方图是计算机视觉中最经典的工具之一。 阅读详情

相关推荐

《学习OpenCV》第七章直方图(练习7.2)

给定三幅在书中讨论的不同光照条件下的手图像,利用cvCalcHist()来获得室内拍照的手的色肤直方图 分别给定2维、8维、16维、32维、256维进行运算 #include #include #include using namespace std; using namespace cv; #define cvQueryHistValue_1D( hist, idx0 )

u011559236的博客 564

opencv笔记——cvCreateImage函数说明

参考网址: 函数cvCreateImage用于创建图像头并分别数据空间。也就是创建图像,并进行初始化设置。 IplImage* cvCreateImage(CvSize size, int depth, int channels); size 图像的长度和宽度。 depth 图像像素的位深度,值为可以为下面一种: IPL_DEPTH_8U - 8位无符号整数 IPL

积沙成塔 6万+

Python2.7+OpenCV的安装配置以及部分图像基础处理

OpenCV的环境搭建(python3.6.7) 按照习惯,我会先查看自己的python版本,进入python所在文件夹目录后输入python,则命令行会输出对应的python界面,如下图: 在下载安装好python的基础上,安装OpenCV只需要几个简单步骤。 1.打开命令行,进入自己所安装的python所在的文件夹目录下,这里要注意,若是不进入目录,直接输入OpenCV安装语句是无效的。 ...

scan 6124

《学习OpenCV3》(中文版)环境配置摘记

《学习OpenCV3》环境配置摘记 这篇博客是看完《学习OpenCV3》环境配置部分的摘记 只摘部分,完整版请自己翻阅《学习OpenCV3》 下载和安装OpenCV 如果想要获取最新的高级函数功能,也可以下载和编译opencv_contrib模块:网址 Windows系统 (似乎是Visual Studio配置教程) 下载链接:https://opencv.org/...

youcanyouup 6358

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...

yangxueyangxue的博客 1万+

Ubuntu16.04+python2.7搭建opencv3.2.0

在安装opencv3.2.0的过程中,我遇到了好多坑,特此记录一下。建议安装了Anaconda的朋友们找一找网上的方法,直接利用它进行安装,可以避免很多坑。 下面结合参考的网上的教程,说一说我的安装过程和解决办法。 一、准备工作 提前下载好三个文件,https://github.com/hanxuan123/opencv3.2/tree/master/all,这里给出网上分享的一...

csdn_elsa的博客 5586

【opencv练习29 - 直方图比较】

/******************************************************* 测试程序 【直方图比较】 时间:2016年8月31日 ********************************************************/ int main(void) { Mat src_base, hsv_base; Mat

Mittens 的专栏 372

《学习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

qdsclove的专栏 1565

《学习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,

C_Freed的专栏 848

树莓派 安装centos7 开发docker + python2.7 +opencv

树莓派 安装centos7 开发docker + python2.7 +opencv 一 系统安装: 1,准备: 树莓派3b 一个 电源线一根 SD卡一张 网线一根 一台电脑 2,开始: SD卡接入usb转换槽中并接入电脑。 格式化SD卡,使用 SD Memory Card Formatter 格式化。 下载centos7系统镜像(ubantu真是太恶心了,教程和安装...

carlos 程序员里最丑的 3681

ElasticSearch集群搭建

docker安装es集群

weixin_46562226的博客 2026

OpenCV基础学习2

【代码】OpenCV基础学习2。

qq_61402449的博客 865

安卓/苹果/支付宝sdk拉起支付宝h5/app支付

代码】安卓/苹果/支付宝sdk拉起支付宝h5/app支付。

m0_68973987的博客 5387

Ubuntu python2.7安装opencv

首先,先给出一个opencv-python的下载链接,里面包含所有版本和不同操作系统下版本,感觉挺有用的,记录一下~~~ https://pypi.tuna.tsinghua.edu.cn/simple/opencv-python/ 今天遇到一个问题,就是需要在python2.7下安装opencv,结果试了几种方法却失败了,网上搜到了很多通过cmake编译的方法,但本人不想那么麻烦,心想...

renwu 5740

避坑指南:Zabbix poller进程100%占用的5种常见原因及解决方案

本文深入剖析了Zabbix poller进程占用率高达100%的五大常见原因,包括监控项与进程数不匹配、不可达主机资源浪费、数据库性能瓶颈、监控项配置不合理以及版本缺陷。文章提供了从系统化诊断到针对性解决方案的完整指南,并重点介绍了如何通过优化zabbix_server.conf中的StartPollers等关键参数进行有效调优,帮助运维人员从根本上解决这一经典性能问题。

7z8x2c4v6b9的博客 251

《哥谭神话-工程篇》01.Palantir 平台架构解析-混乱数据如何转化唯一真相源?

Palantir 平台的架构哲学可以概括为将洞察落地为行动,其核心是将“获取唯一真相”能力深度嵌入现有的、复杂的工作流程中,成为提升运营效率和决策质量的倍增器。

903

Python2.7安装Opencv3

Python2.7上安装Opencv2的教程网上有很多,我安装的是Python2.7,安装Opencv2按照网上的教程很顺利,但是在自己学习OpenCV-Python Tutorials教程时,cv2.connectedComponentsWithStats()这个函数不能使用,在Stackoverflow上有人说是这个函数只在Opencv3中有,故想着安装下Opencv3 系统:Win

高速旋转的等离子体 1万+

Python+Tableau 全流程数据分析实战:从数据清洗到商业洞察可视化

本文通过Python+Tableau完整演示电商销售数据分析流程。首先使用Python进行数据清洗(缺失值处理、异常值过滤等)和探索性分析(商品类别、时间趋势等),然后导入Tableau创建交互式可视化仪表盘。分析发现电子产品销售额最高但利润率低,美妆类利润率最优,东部地区销售表现最好。最终提出优化供应链、加强美妆推广等商业建议,展示了Python数据处理与Tableau可视化的高效配合。所有代码可直接运行,适合数据分析初学者和从业者实战参考。

weixin_44520581的博客 337

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...

董广明的博客 2137

brpc组件bvar源码解析(一)简介、使用和类的关系

bvar是brpc中的一个重要组件,brpc内部有很多builtin监控都是bvar实现的。 brpc文档介绍bvar“几乎不会给程序增加性能开销,也快于竞争频繁的原子操作”。它的原理是:多线程累加一个计数器时,每个线程只累加私有的变量而不参与全局竞争,因此写时没有锁的竞争;在读取时累加所有线程的私有变量。虽然读比之前慢多了,但写就快多了,因此它使用写多读少的场景,例如统计、监控场景。 1.使用 // bvar::Adder<T>用于累加,下面定义了一个统计read error总数的Adder。

华秋实的专栏 1852

Cadence virtuos安装教程

本文详细介绍了在Ubuntu 18.04系统上安装Cadence Virtuoso IC617及MMSIM的完整流程。主要内容包括:1)系统环境准备(安装JDK及相关依赖包);2)通过创建软链接和修改系统文件实现RedHat环境兼容;3)共享目录文件操作与分卷压缩包合并解压技巧;4)使用InstallScape工具的安装步骤详解,包括权限处理和配置选项。特别提醒需注意系统兼容性处理(如创建redhat-release文件)和分卷压缩包的特殊解压方法(cat合并)。整个安装过程涉及大量Linux命令操作,需特

wangjie36的博客 299

OpenCV学习2

【代码】OpenCV学习2。

2201_75747841的博客 341

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配置)、

weiyvyy的博客 505

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...

杨燕丹的博客 6373

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

weixin_37834269的博客 622

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

mengyafei43的专栏 8786
上一篇: 《学习OpenCV》练习7-1
下一篇: 《学习OpenCV》练习7-3
fredx93
博客等级 码龄14年 17粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值