【opencv】示例-demhist.cpp 调整图像的亮度和对比度,并在GUI窗口中实时显示调整后的图像以及其直方图。...


#include "opencv2/core/utility.hpp" // 包含OpenCV核心工具库的头文件
#include "opencv2/imgproc.hpp" // 包含OpenCV图像处理的头文件
#include "opencv2/imgcodecs.hpp" // 包含OpenCV图像编码解码的头文件
#include "opencv2/highgui.hpp" // 包含OpenCV高层GUI(图形用户界面)的头文件#include <iostream> // 包含标准输入输出流的头文件// 使用命名空间cv和std,避免每次调用OpenCV和标准库函数时都需要前缀
using namespace cv;
using namespace std;// 全局变量,分别用于存储亮度和对比度的值
int _brightness = 100;
int _contrast = 100;Mat image; // 全局变量,用于存储图像矩阵/* 亮度/对比度调整回调函数 */
static void updateBrightnessContrast( int /*arg*/, void* )
{int histSize = 64; // 定义直方图的大小int brightness = _brightness - 100; // 计算新的亮度值int contrast = _contrast - 100; // 计算新的对比度值/** 使用Werner D. Streidt的算法来调整亮度和对比度* (参见http://visca.com/ffactory/archives/5-99/msg00021.html)*/double a, b;if( contrast > 0 ){double delta = 127.*contrast/100; // 计算对比度增量a = 255./(255. - delta*2); // 根据对比度增量计算系数ab = a*(brightness - delta); // 根据对比度增量和亮度计算系数b}else{double delta = -128.*contrast/100; // 计算对比度减量a = (256.-delta*2)/255.; // 根据对比度减量计算系数ab = a*brightness + delta; // 根据对比度减量和亮度计算系数b}Mat dst, hist; // 定义目标图像和直方图矩阵image.convertTo(dst, CV_8U, a, b); // 应用亮度和对比度的调整并转换图像格式imshow("image", dst); // 显示调整后的图像// 计算调整后图像的直方图calcHist(&dst, 1, 0, Mat(), hist, 1, &histSize, 0);Mat histImage = Mat::ones(200, 320, CV_8U)*255; // 创建直方图的图像// 对直方图进行归一化操作normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, CV_32F);histImage = Scalar::all(255); // 设置直方图图像的背景为白色int binW = cvRound((double)histImage.cols/histSize); // 计算每个bin的宽度// 绘制直方图for( int i = 0; i < histSize; i++ )rectangle( histImage, Point(i*binW, histImage.rows),Point((i+1)*binW, histImage.rows - cvRound(hist.at<float>(i))),Scalar::all(0), -1, 8, 0 );imshow("histogram", histImage); // 显示直方图
}// keys字符串定义了程序可以接受的命令行参数
const char* keys =
{"{help h||}{@image|baboon.jpg|input image file}"
};// 程序主函数
int main( int argc, const char** argv )
{CommandLineParser parser(argc, argv, keys); // 创建命令行参数解析器parser.about("\nThis program demonstrates the use of calcHist() -- histogram creation.\n");if (parser.has("help")) // 如果提供了帮助标志,则打印帮助信息{parser.printMessage();return 0;}string inputImage = parser.get<string>(0); // 获取输入的图像文件// 读取源图像,使用高级GUIimage = imread(samples::findFile(inputImage), IMREAD_GRAYSCALE); // 以灰度模式读取图像if(image.empty()) // 如果读取图像失败,则打印错误信息并退出{std::cerr << "Cannot read image file: " << inputImage << std::endl;return -1;}// 创建显示窗口namedWindow("image", 0);namedWindow("histogram", 0);// 创建轨迹条以调整亮度和对比度,并设置回调函数createTrackbar("brightness", "image", &_brightness, 200, updateBrightnessContrast);createTrackbar("contrast", "image", &_contrast, 200, updateBrightnessContrast);// 使用默认值更新亮度和对比度updateBrightnessContrast(0, 0);waitKey(); // 等待用户按键return 0; // 程序正常退出
} 这段代码是使用C++和OpenCV库编写的图像处理程序,其主要功能是调整图像的亮度和对比度,并在GUI窗口中实时显示调整后的图像以及其直方图。用户可以通过界面上的滑动条来动态地调整亮度和对比度参数从而观察到图像即时的变化效果。程序首先读取并显示一个灰度图像,然后响应用户的交互输入来更新图像显示和直方图。
image.convertTo(dst, CV_8U, a, b); 
calcHist(&dst, 1, 0, Mat(), hist, 1, &histSize, 0); 
normalize(hist, hist, 0, histImage.rows, NORM_MINMAX, CV_32F); 
相关文章:
【opencv】示例-demhist.cpp 调整图像的亮度和对比度,并在GUI窗口中实时显示调整后的图像以及其直方图。...
#include "opencv2/core/utility.hpp" // 包含OpenCV核心工具库的头文件 #include "opencv2/imgproc.hpp" // 包含OpenCV图像处理的头文件 #include "opencv2/imgcodecs.hpp" // 包含OpenCV图像编码解码的头文件 #include "opencv2/highgui…...
计算机网络---第三天
OSI参考模型与TCP/IP模型 参考模型产生背景: 背景:①兼容性较差,接口不统一 ②不利于排错与维护 ③设备成本高 参考模型概念: 概念:OSI参考模型定义了网络中设备所遵守的层次结构 参考模型优点: 优点…...
怎么防止文件被拷贝,复制别人拷贝电脑文件
怎么防止文件被拷贝,复制别人拷贝电,脑文件 防止文件被拷贝通常是为了保护敏感数据、知识产权或商业秘密不被未经授权的人员获取或传播。以下列出了一系列技术手段和策略,可以帮助您有效地防止文件被拷贝。 1. 终端管理软件: 如安企神、域智…...
流式密集视频字幕
流式密集视频字幕 摘要1 IntroductionRelated Work3 Streaming Dense Video Captioning Streaming Dense Video Captioning 摘要 对于一个密集视频字幕生成模型,预测在视频中时间上定位的字幕,理想情况下应该能够处理长的输入视频,预测丰富、…...
【教程】iOS Swift应用加固
🔒 保护您的iOS应用免受恶意攻击!在本篇博客中,我们将介绍如何使用HTTPCORE DES加密来加固您的应用程序,并优化其安全性。通过以下步骤,您可以确保您的应用在运行过程中不会遭受数据泄露和未授权访问的风险。 摘要 …...
新型基础设施建设(新基建)
新型基础设施建设(新基建)主要包括七个方面,即5G基站建设、特高压、城际高速铁路和城市轨道交通、新能源汽车充电桩、大数据中心、人工智能和工业互联网。 以下是新型基础设施的详细内容: 一、5G基站建设。5G网络的扩展和优化&a…...
蓝桥杯 第 9 场 小白入门赛 字符迁移
题目: 3.字符迁移【算法赛】 - 蓝桥云课 (lanqiao.cn) 思路: 此题通过把小写字母映射成数字,进行差分即可。 AC代码: #include<iostream> #include<cstring> #include<algorithm>using namespace std;typed…...
泰迪智能科技人工智能应用工程师(中级)特训营
随着人工智能技术的迅猛发展和应用的不断拓展,掌握人工智能技术已成为现代职业发展和企业创新的关键。为此,人工智能技能提升特训营应运而生,以全面、系统的课程设置,帮助学员深入掌握相关的理论知识,实践操作技能。特…...
【数据结构】考研真题攻克与重点知识点剖析 - 第 6 篇:图
前言 本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术…...
java的基本数据类型
在Java编程语言中,基本数据类型是构成Java程序的基础元素,它们用于存储简单值。Java的基本数据类型可以分为两大类:原始类型(Primitive Types)和引用类型(Reference Types)。原始类型包括整型、…...
0104练习与思考题-算法基础-算法导论第三版
2.3-1 归并示意图 问题:使用图2-4作为模型,说明归并排序再数组 A ( 3 , 41 , 52 , 26 , 38 , 57 , 9 , 49 ) A(3,41,52,26,38,57,9,49) A(3,41,52,26,38,57,9,49)上的操作。图示: tips::有不少在线算法可视化工具(软…...
烤羊肉串引来的思考--命令模式
1.1 吃羊肉串! 烧烤摊旁边等着拿肉串的人七嘴八舌地叫开了。场面有些混乱,由于人实在太多,烤羊肉串的老板已经分不清谁是谁,造成分发错误,收钱错误,烤肉质量不过关等。 外面打游击烤羊肉串和这种开门店做烤…...
Python 描述符
文章目录 类型:数据描述符:方法描述符:描述符的要包括以下几点:方法描述符实现缓存 描述符(Descriptor)是 Python 中一个非常强大的特性,它允许我们自定义属性的访问行为。使用描述符,我们可以创建一些特殊的属性,在访问这些属性时执行自定义…...
Go语言创建HTTP服务器
Web服务器可提供网页、Web服务和文件,而Go语言为创建Web服务器提供了强大的支持。 1.通过Hello World Web 服务器宣告您的存在 标准库中的net/http包提供了多种创建HTTP服务器的方法,它还提供了一个基本的路由器。 package mainimport ("net/http" )func helloWo…...
【LeetCode热题100】【栈】柱状图中最大的矩形
题目链接:84. 柱状图中最大的矩形 - 力扣(LeetCode) 要找最大的矩形就是要找以每根柱子为高度往两边延申的边界,要作为柱子的边界就必须高度不能低于该柱子,否则矩形无法同高,也就是需要找出以每根柱子为高…...
谷歌浏览器插件开发速成指南:弹窗
诸神缄默不语-个人CSDN博文目录 本文介绍谷歌浏览器插件开发的入门教程,阅读完本文后应该就能开发一个简单的“hello world”插件,效果是出现写有“Hello Extensions”的弹窗。 作为系列文章的第一篇,本文还希望读者阅读后能够简要了解在此基…...
Lakehouse 大数据概念
“Lakehouse” 是一个相对新的概念,是大数据理论中的一个重要发展方向。它试图结合传统的数据湖(Data Lake)和数据仓库(Data Warehouse)的优点,以创造一种更为灵活和强大的数据管理体系。 在传统的大数据架构中,数据湖用于存储原始、未加工的数据,而数据仓库则用于存储…...
MySQL学习笔记(二)
1、把查询结果中去除重复记录 2、连接查询 从一张表中单独查询,称为单表查询。emp表和dept表联合起来查询数据,从emp表中取员工名字,从dept表中取部门名字,这种跨表查询,多张表联合起来查询数据,被称为连…...
Verilog语法——按位取反“~“和位宽扩展的优先级
前言 先说结论,如下图所示,在Verilog中“~ ”按位取反的优先级是最高的,但是在等式计算时,有时候会遇到位宽扩展,此时需要注意的是位宽扩展的优先级高于“~”。 验证 仿真代码,下面代码验证的是“~”按位取…...
Navicat工具使用
Navicat的本质: 在创立连接时提前拥有了数据库用户名和密码 双击数据库时,相当于建立了一个链接关系 点击运行时,远程执行命令,就像在xshell上操作Linux服务器一样,将图像化操作转换成SQL语句去后台执行 一、打开Navi…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
