OPENCV C++(二)直方图+分离颜色通道+画圆画线画矩形
分离RGB彩图颜色通道 也就是把每种分量的亮度图提出来
vector<Mat> channels;split(image1, channels);Mat R = channels.at(0);Mat G = channels.at(1);Mat B = channels.at(2);
这样R,G,B每个图就是这个图的颜色分量图了
图片的克隆,深拷贝!
Mat image1_copy = image1.clone();
申明一个点操作
Point pt;pt.x = 10;pt.y = 10;
这样就可以得到一个点,你可以把它当作圆心来进行画圆操作
circle(image1_copy,pt, 6, CV_RGB(255, 0, 0), -1, 8, 0);
图,点,半径,颜色,-1代表填充1代表不填充,8和0都是默认参数
也可以申明两个点,进行画线操作。
line(image1_copy, Point(20,20), pt2, CV_RGB(0, 255, 0), 1, 8, 0);
这里也可以直接在函数里面写Point(20,20)也代表了一个点,但就不能在其他地方用这个了。
申明一个矩形的操作,也可以叫矩形的ROI
Rect rect;rect.x = 10;rect.y = 10;rect.width = 90;rect.height = 90;rectangle(image1_copy, rect, CV_RGB(243, 125, 254), 1, 8, 0);
下面是直方图统计图的画法
统计各个通道的RGB函数 网上的学习
void showHist(Mat& img, Mat& dst)
{//1、创建3个矩阵来处理每个通道输入图像通道。//我们用向量类型变量来存储每个通道,并用split函数将输入图像划分成3个通道。vector<Mat>bgr;split(img, bgr);//2、定义直方图的区间数int numbers = 256;//3、定义变量范围并创建3个矩阵来存储每个直方图float range[] = { 0,256 };const float* histRange = { range };Mat b_hist, g_hist, r_hist;//4、使用calcHist函数计算直方图int numbins = 256;calcHist(&bgr[0], 1, 0, Mat(), b_hist, 1, &numbins, &histRange);calcHist(&bgr[1], 1, 0, Mat(), g_hist, 1, &numbins, &histRange);calcHist(&bgr[2], 1, 0, Mat(), r_hist, 1, &numbins, &histRange);//5、创建一个512*300像素大小的彩色图像,用于绘制显示int width = 800;int height = 600;Mat histImage(height, width, CV_8UC3, Scalar(0, 0, 0));//6、将最小值与最大值标准化直方图矩阵normalize(b_hist, b_hist, 0, height, NORM_MINMAX);normalize(g_hist, g_hist, 0, height, NORM_MINMAX);normalize(r_hist, r_hist, 0, height, NORM_MINMAX);//7、使用彩色通道绘制直方图int binStep = cvRound((float)width / (float)numbins); //通过将宽度除以区间数来计算binStep变量for (int i = 1; i < numbins; i++){line(histImage,Point(binStep * (i - 1), height - cvRound(b_hist.at<float>(i - 1))),Point(binStep * (i), height - cvRound(b_hist.at<float>(i))),Scalar(255, 0, 0));line(histImage,Point(binStep * (i - 1), height - cvRound(g_hist.at<float>(i - 1))),Point(binStep * (i), height - cvRound(g_hist.at<float>(i))),Scalar(0, 255, 0));line(histImage,Point(binStep * (i - 1), height - cvRound(r_hist.at<float>(i - 1))),Point(binStep * (i), height - cvRound(r_hist.at<float>(i))),Scalar(0, 0, 255));}dst = histImage;return;
}
其中值得学习的函数有:
创建画布:
int width = 800;int height = 600;Mat histImage(height, width, CV_8UC3, Scalar(0, 0, 0));
归一化高度宽度
normalize(b_hist, b_hist, 0, height, NORM_MINMAX);normalize(g_hist, g_hist, 0, height, NORM_MINMAX);normalize(r_hist, r_hist, 0, height, NORM_MINMAX);
对直方图函数处理后的每个统计直方图大小的处理
height - cvRound(b_hist.at<float>(i - 1)
因为画布是从上往下数的
计算灰度图的直方统计量函数
int numbers = 256;//3、定义变量范围并创建3个矩阵来存储每个直方图float range[] = { 0,256 };const float* histRange = { range };Mat b_hist, g_hist, r_hist;//4、使用calcHist函数计算直方图int numbins = 256;calcHist(&bgr[0], 1, 0, Mat(), b_hist, 1, &numbins, &histRange);calcHist(&bgr[1], 1, 0, Mat(), g_hist, 1, &numbins, &histRange);calcHist(&bgr[2], 1, 0, Mat(), r_hist, 1, &numbins, &histRange);
统计各个通道的RGB函数 自己的编写
int h = R.rows;int w = R.cols;int hisgramR[256] = {0};for (int j = 0; j < h; j++) {for (int i = 0; i < w; i++) {hisgramR[R.at<uchar>(j, i)]= hisgramR[R.at<uchar>(j, i)]+1;}}
针对于每个像素进行统计
int nHistWidth = 256;int nHistHeight =400;Mat matHistImage(nHistHeight, nHistWidth, CV_8UC3, Scalar(255, 255, 255));for (int i = 0; i < 256; i++) {line(matHistImage, Point(i, nHistHeight-1), Point(i, nHistHeight-hisgramR[i]*400/5000), CV_RGB(255,0, 0), 1, 8, 0);}
制造画布,且归一化可能不太标准,找了一个比较大的数进行相乘除
相关文章:
OPENCV C++(二)直方图+分离颜色通道+画圆画线画矩形
分离RGB彩图颜色通道 也就是把每种分量的亮度图提出来 vector<Mat> channels;split(image1, channels);Mat R channels.at(0);Mat G channels.at(1);Mat B channels.at(2); 这样R,G,B每个图就是这个图的颜色分量图了 图片的克隆,深拷贝! Mat…...
SpringBoot(2.7.x)中使用PageHelper
如何在SpringBoot中使用PageHelper 先添加依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.12</version> </dependency>SpringBoot 2.6.x…...
【HarmonyOS】API9网络buffer图片加载
【引言】 HarmonyOS中加载网络图片常用的方法是直接给Image组件添加图片的网络地址,申请网络权限ohos.permission.INTERNET后就可以通过url加载对应的图片了,如HarmonyOS官网中的写法: Image(https://www.example.com/example.JPG) 【问题概…...

【前端实习生备战秋招】—HTML 和 CSS面试题总结(二)
【前端实习生备战秋招】—HTML 和 CSS面试题总结(二) 1.有哪些方式可以对一个 DOM 设置它的 CSS 样式? 外部样式表,引入一个外部 css 文件内部样式表,将 css 代码放在 <head> 标签内部内联样式,将 c…...

操作系统知识点总结
操作系统知识点总结: 第一章:操作系统概述 1.1操作系统的概念: 操作系统是一种系统软件,与其他系统软件和应用软件不同,它有自己的基本特征。它的四大基本特征也就是并发,共享,虚拟,异步。 1.2操作系统的特征(四大基本特征): 并发: 这里我们要理解什么是并发,什么是…...
(C++) 多线程之生产者消费者问题
文章目录 前言CodeCode运行效果 分解讲解main()class ProducerConsumerProblemproduce()consumer() END 前言 生产者消费者问题_百度百科 (baidu.com) 生产者消费者问题 (英语:Producer-consumer problem),也称有限缓冲问题&…...

【C语言学习】逃逸字符(转义字符)
逃逸字符(转义字符) 1.\" 双引号 \" printf("请分别输入身高的英尺和英寸,""如输入\"5 7\"表示5英尺7英寸:");这里的"\就是双引号的作用,因为在双引号里面直接用双引号无意义&…...
开发手册|Java后端开发规范重点条目整理
Ps:部分熟知的开发规范未收录在本文中! 一、编程规约 1.1 命名风格 代码中的命名严禁使用拼音与英文混合的方式 alibaba / taobao / youku / hangzhou 等国际通用的名称可视同英文 类名使用大驼峰的形式命名,例如 UpperCameCase 方法、参数…...

c++11 标准模板(STL)(std::basic_ofstream)(二)
定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ifstream : public std::basic_istream<CharT, Traits> 类模板 basic_ifstream 实现文件流上的高层输入操作。它将 std::basic_istrea…...

k8s概念-pv和pvc
回到目录 kubernetes存储卷的分类太丰富了,每种类型都要写相应的接口与参数才行,这就让维护与管理难度加大。 persistenvolume(PV) 是配置好的一段存储(可以是任意类型的存储卷) 也就是说将网络存储共享出来,配置定义成PV。 PersistentVolumeClaim(PVC)是用户pod使…...

python算法指南程序员经典,python算法教程pdf百度云
大家好,小编来为大家解答以下问题,你也能看懂的python算法书 pdf,python算法教程这本书怎么样,现在让我们一起来看看吧! 给大家带来的一篇关于算法相关的电子书资源,介绍了关于算法、详解、算法基础方面的内…...
微服务使用步骤
Maven的依赖冲突解决方案: 路径最短原则配置优先原则破坏规则则使用排除 SpringBoot场景启动器starter的开发流程 c3p0-spring-boot-starter自定义场景启动器test-c3p0调用自定义场景启动器SpringBoot自动装配SpringBoot应用启动原理nacos服务治理 安装 启动bin/s…...

Ubuntu 23.04 作为系统盘的体验和使用感受
1.为啥主系统装了Ubuntu 由于公司发电脑了,我自己也有一台台式电脑,然后也想去折腾一下Ubuntu,就把自己的笔记本装成Ubuntu系统了, 我使用的是23.04的桌面版,带图形化界面的。我准备换回Windows 11了(因为…...

百分点科技跻身中国智慧应急人工智能解决方案市场前三
近日, 全球领先的IT市场研究和咨询公司IDC发布了《中国智慧应急解决方案市场份额,2022》报告,数据显示,2022年中国智慧应急整体市场为104亿元人民币。其中,智慧应急人工智能解决方案子市场备受关注,百分点科…...

vscode如何退出/切换 github 账号
退出/切换 github 账号 左下角点击头像按钮,选择注销,然后再重新登录...

maven发布到中央仓库
创建账号 https://issues.sonatype.org 【第二步】登录申请新项目 右上角点击Create,Project选择第一项,有的时候带不出来第二个New Project,可以再选一次Project的选项。...
C#IEnumberable<>
在C#中,IEnumerable<>是一个泛型接口,用于表示一个可枚举的集合。它定义了一个用于遍历集合元素的枚举器(enumerator)。通过实现IEnumerable<>接口,我们可以使用foreach语句或LINQ查询等方式来迭代访问集合…...

Flink非对齐checkpoint原理(Flink Unaligned Checkpoint)
Flink非对齐checkpoint原理(Flink Unaligned Checkpoint) 为什么提出Unaligned Checkpoint(UC)? 因为反压严重时会导致Checkpoint失败,可能导致如下问题 恢复时间长-服务效率低非幂等和非事务会导致数据…...
Linux crontab命令:循环执行定时任务(详解)
crontab 命令的基本格式如下: [rootlocalhost ~]# crontab [选项] [file] file 指的是命令文件的名字,表示将 file 作为 crontab 的任务列表文件并载入 crontab,若在命令行中未指定文件名,则此命令将接受标准输入(键盘…...

Linux系统jenkins+newman+postman持续集成环境搭建
1、首先安装nodejs 下载nodejs压缩包,下载地址:nodejs官网下载 建议不用下载最新的,我这里用的是推荐的v12.18版本 下载和解压命令 wget https://nodejs.org/dist/v12.18.3/node-v12.18.3-linux-x64.tar.xz解压安装包(记得没有z&…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...

认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...

jdbc查询mysql数据库时,出现id顺序错误的情况
我在repository中的查询语句如下所示,即传入一个List<intager>的数据,返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致,会导致返回的id是从小到大排列的,但我不希望这样。 Query("SELECT NEW com…...

高效的后台管理系统——可进行二次开发
随着互联网技术的迅猛发展,企业的数字化管理变得愈加重要。后台管理系统作为数据存储与业务管理的核心,成为了现代企业不可或缺的一部分。今天我们要介绍的是一款名为 若依后台管理框架 的系统,它不仅支持跨平台应用,还能提供丰富…...
2025.6.9总结(利与弊)
凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…...
手动给中文分词和 直接用神经网络RNN做有什么区别
手动分词和基于神经网络(如 RNN)的自动分词在原理、实现方式和效果上有显著差异,以下是核心对比: 1. 实现原理对比 对比维度手动分词(规则 / 词典驱动)神经网络 RNN 分词(数据驱动)…...
Git 命令全流程总结
以下是从初始化到版本控制、查看记录、撤回操作的 Git 命令全流程总结,按操作场景分类整理: 一、初始化与基础操作 操作命令初始化仓库git init添加所有文件到暂存区git add .提交到本地仓库git commit -m "提交描述"首次提交需配置身份git c…...