c++视觉---使用轨迹条设置图片的对比度,亮度

news2024/10/2 20:27:01

轨迹条:cv::createTrackbar

cv::createTrackbar 是OpenCV库中的一个函数,用于创建一个图形用户界面 (GUI) 中的滑动条控件,允许用户在应用程序运行时调整特定参数的值。这个函数的调用方式如下:

int cv::createTrackbar(const std::string& trackbarName, const std::string& windowName, int* value, int count, cv::TrackbarCallback onChange = 0, void* userdata = 0);

参数解释:

  • trackbarName:滑动条的名称,显示在滑动条旁边的标签上。
  • windowName:包含滑动条的窗口的名称。
  • value:一个整数指针,用于存储滑动条的当前值。当用户移动滑动条时,这个值会被更新。
  • count:滑动条的最大值(最小值默认为0)。这决定了滑动条的取值范围。
  • onChange:一个可选的回调函数,在用户移动滑动条时会被调用。它允许您在滑动条值变化时执行自定义操作。
  • userdata:一个可选的用户数据指针,传递给回调函数,允许您在回调函数中使用自定义数据。

通过创建滑动条,用户可以在运行时交互地调整参数的值,这对于图像处理和计算机视觉应用程序非常有用,允许用户实时观察效果并进行微调。

使用轨迹条设置对比度

#include <opencv2/opencv.hpp>

// 回调函数,用于处理轨迹条值的变化
void onTrackbar(int value, void* userdata) {
	cv::Mat* imagePtr = static_cast<cv::Mat*>(userdata);

	// 设置对比度增强参数
	double alpha = static_cast<double>(value) / 100.0;

	// 增强图像对比度
	cv::Mat enhancedImage = (*imagePtr) * alpha;

	// 显示增强后的图像
	cv::imshow("Enhanced Image", enhancedImage);
}

int main() {
	// 读取输入图像
	cv::Mat inputImage = cv::imread("1.jpg");

	// 检查图像是否成功加载
	if (inputImage.empty()) {
		std::cout << "无法加载输入图像" << std::endl;
		return -1;
	}

	// 创建窗口
	cv::namedWindow("Enhanced Image");

	// 创建轨迹条
	int initialContrast = 100; // 初始对比度值
	cv::createTrackbar("Contrast", "Enhanced Image", &initialContrast, 300, onTrackbar, &inputImage);

	// 显示初始图像
	cv::imshow("Enhanced Image", inputImage);

	// 等待按键事件
	cv::waitKey(0);

	return 0;
}

在这里插入图片描述

使用:image. at(y,x)[c]语法来设置对比度和亮度

image.at<Vec3b>(y, x)[c] 是一种在OpenCV中用于访问图像像素值的常见方式。让我解释这个表达式的各个部分:

  • image:这是一个OpenCV的cv::Mat对象,表示图像。cv::Mat 是OpenCV中用于表示图像和矩阵的数据结构。

  • at<Vec3b>(y, x):这是使用at方法来访问图像的像素值的一种方式。at方法接受图像中的行和列索引作为参数,并返回该位置的像素值。

  • <Vec3b>:这是模板参数,指定了图像中每个像素的数据类型。在这种情况下,Vec3b 表示每个像素是一个3通道的彩色像素,其中每个通道都是8位无符号整数。

  • (y, x):这是要访问的像素的行和列坐标。y 表示行号,x 表示列号。

  • [c]:这是通道索引,表示要访问的通道。在3通道彩色图像中,通常有三个通道,分别对应于红色、绿色和蓝色。通过 [c],您可以选择要访问的通道,其中 c 的值通常为0(红色通道)、1(绿色通道)或2(蓝色通道)。

因此,image.at<Vec3b>(y, x)[c] 允许您访问图像在 (x, y) 处指定通道 c 上的像素值。这对于图像处理和像素级操作非常有用。

#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;
#include <iostream>
#include <fstream>
using namespace cv; //包含cv命名空间
#include <opencv2/core/core.hpp>




// 描述:全局函数声明
//
static void on_ContrastAndBright(int, void*);
static void ShowHelpText();
//- -------【全局变量声明部分】-------------------------
// 描述: 全局变量声明
//、
int g_nContrastValue; //对比度值
int g_nBrightValue; //亮度值
Mat g_srcImage, g_dstImage;
// 【main()函数】--------------------------
// 描述: 控制台应用程序的入口函数, 我们的程序从这里开始
//
int main()
{
	//【1】读取输入图像
	g_srcImage = imread("1.jpg");
	if (!g_srcImage.data) { printf("读取图片错误,请确定目录下是否有imread 函数指定图片存在~!"); return false; }
	g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type());
	// 【2】设定对比度和亮度的初值
	g_nContrastValue = 80;
	g_nBrightValue = 80;
	//【3】创建效果图窗口
	namedWindow("【效果图窗口】", 1);
	//【4】创建轨迹条
	createTrackbar("对比度: ", "【效果图窗口】", &g_nContrastValue, 300, on_ContrastAndBright);
	createTrackbar("亮度: ", "【效果图窗口】", &g_nBrightValue, 200, on_ContrastAndBright);
	//【5】进行回调函数初始化
	on_ContrastAndBright(g_nContrastValue, 0);
	on_ContrastAndBright(g_nBrightValue, 0);
	//【6】按下"q"键时, 程序退出
	while (char(waitKey(1)) != 'q') {}
	return 0;
}

//-------------------【on_ContrastAndBright()函数】-
// 描述: 改变图像对比度和亮度值的回调函数
//------------
static void on_ContrastAndBright(int, void*)
{
	// 创建窗口
	namedWindow("【原始图窗口】", 1);
	//三个 for循环,执行运算g_dstImage(i,j) = a*g_srcImage(i,j) + b
	for( int y = 0; y< g_srcImage. rows; y++)
	{
		for (int x = 0; x < g_srcImage.cols; x++)
		{
			for (int c = 0; c < 3; c++)
			{
				g_dstImage.at<Vec3b>(y, x)[c] =
					saturate_cast<uchar>((g_nContrastValue * 0.01) * (g_srcImage.at<Vec3b>(y, x)[c]) + g_nBrightValue);
			}
		}
	}
	//显示图像
	imshow("【原始图窗口】", g_srcImage);
	imshow("【效果图窗口】", g_dstImage);
}

在这里插入图片描述

调用本地相机来设置对比度

#include <opencv2/opencv.hpp>

// 全局变量用于存储对比度值
int contrast = 100;

// 回调函数,用于处理轨迹条值的变化
void onTrackbar(int value, void* userdata) {
	// 将轨迹条值存储到全局变量中
	contrast = value;
}

int main() {
	// 打开默认相机(通常是第一个相机)
	cv::VideoCapture cap(0);

	// 检查相机是否成功打开
	if (!cap.isOpened()) {
		std::cout << "无法打开相机" << std::endl;
		return -1;
	}

	// 创建窗口
	cv::namedWindow("Camera Feed");

	// 创建轨迹条
	cv::createTrackbar("对比度", "Camera Feed", &contrast, 200, onTrackbar);

	while (true) {
		cv::Mat frame;
		cap >> frame; // 从相机获取帧

		// 增强图像对比度
		cv::Mat enhancedFrame = frame * (contrast / 100.0);

		// 显示增强后的图像
		cv::imshow("Camera Feed", enhancedFrame);

		// 检查是否按下ESC键,如果是则退出循环
		if (cv::waitKey(1) == 27) {
			break;
		}
	}

	// 关闭相机
	cap.release();

	// 销毁窗口
	cv::destroyAllWindows();

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1072054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

69名学员通过!9月份,誉天红帽RHCE学员再创佳绩!

9月份&#xff0c;誉天又有69名学员通过了RHCE认证&#xff0c;让我们和他们一起分享这份喜悦&#xff0c;继续努力前行&#xff01; ▲部分红帽学员留影▲ 学习并不是一场速度比赛&#xff0c;而是一场毅力与坚持的较量。每个人都有自己的学习节奏和方式&#xff0c;重要的是找…

【快速入门】JVM之类加载机制与Native

感慨&#xff1a; 如何定义一个合格的Java程序员&#xff0c;Java程序员要了解掌握哪些知识点&#xff0c;网上的面试题太多了&#xff0c;后端需要了解掌握的知识点太多太多了&#xff0c;Java基础、数据结构、异常、多线程、Spring、Spring boot、事务、算法、数据库&#xf…

python对excel数据表进行数据清洗

当拿到excel表&#xff0c;使用python对excel操作前&#xff0c;第一件事情是对excel表的数据进行数据清洗。 数值是否有空值&#xff0c;是否有重复的数据&#xff0c;把以上2个问题解决完成以后&#xff0c;才是对数据真正操作的开始。 1、使用pandans读取数据 2、判断exce…

安装hadoop,并配置hue

0、说明 对于大数据学习的初始阶段&#xff0c;我也曾尝试搭建相应的集群环境。通过搭建环境了解组件的一些功能、配置、原理。 在实际学习过程中&#xff0c;我更多的还是使用docker来快速搭建环境。 这里记录一下我搭建hadoop的过程。 1、下载hadoop 下载地址&#xff1a;…

2023年中国智慧医院市场现状及行业发展趋势分析[图]

自&#xff12;&#xff10;&#xff11;&#xff19;年开始&#xff0c;国家卫健委首次提出了智慧医院这一概念ꎬ并明确提出包含的三个方面&#xff0c;即:一是智慧医疗方面&#xff0c;主要面向医院所有医务人员使用者&#xff0c;以深层次提升医院信息化建设为目标ꎬ规范参照…

2023年中国连锁麻辣烫市场发展趋势分析:连锁麻辣烫行业规模将持续增长[图]

连锁麻辣烫即以连锁模式经营的麻辣烫。麻辣烫源自巴蜀地区&#xff0c;后经过市场从业者的改良推广&#xff0c;已经成为一种表现形式丰富多样的中式快餐。可根据连锁麻辣烫门店连锁模式的不同&#xff0c;将连锁麻辣烫门店分为直营连锁麻辣烫和加盟连锁麻辣烫。 连锁麻辣烫行…

无痛入门Prometheus:一个强大的开源监控和告警系统,如何快速安装和使用?

一、前生今世 Prometheus 是完全开源的系统监控和告警工具包&#xff0c;它受 Google 内部的 BorgMon 监控系统启发&#xff0c;由前Google 工程师从 2012 年开始在 SoundCloud 以开源软件的形式进行研发&#xff0c;自此以后&#xff0c;许多公司和组织都采用了Prometheus 作为…

Docker学习笔记 - 极简极入门级

Docker学习笔记 - 极简极入门级 文章目录 Docker学习笔记 - 极简极入门级前言架构命令docker pulldocker pushdocker imagesdocker rmidocker rundocker stop/start/restartdocker rmdocker psdocker execdocker logsdocker save/loaddocker inspectdocker builddocker network…

2023年中国香樟木家具行业分析:定制化和个性化的需求不断增加[图]

香樟木是一种常见的木材&#xff0c;它在家具行业中被广泛使用。香樟木家具行业定义是指使用香樟木材料制造的家具产品的生产、销售和相关业务活动。 香樟木家具行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 香樟木家具的生产主要集中在少数大型…

vue-slot插槽

作用&#xff1a;让父组件可以向子组件中任意位置插入html结构&#xff0c;也是组件通信方式的一种&#xff0c;适用于父组件》子组件 分类: 默认插槽、具名插槽、作用域插槽 定义子组件时使用slot组件&#xff0c;在使用子组件是可以决定是否插入具体的html代码 默认插槽 如…

Survey on Cooperative Perception in an Automotive Context 论文阅读

论文链接 Survey on Cooperative Perception in an Automotive Context 0. Abstract 本文就协同基础设施领域提供相关环境的调查回顾了感知中涉及的主要模块&#xff1a;定位&#xff0c;目标检测和跟踪&#xff0c;地图生成提供了协同感知的 SWOT 1. Intro 无人驾驶汽车的背…

万宾荣获深圳应博会“全球应急产业先锋奖”创始人发表峰会演讲

今年5月&#xff0c;住房和城乡建设部表示将全面启动的城市基础设施生命线安全工程工作&#xff0c;通过各类智能感知设备等数字化手段&#xff0c;及早发现和管控城市燃气、桥梁、供水、排水防涝等领域的风险隐患&#xff0c;切实提高城市安全保障能力、维护人民生命财产安全&…

基于SpringBoot的足球联赛管理系统

基于SpringBoot的足球联赛管理系统 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 首页 详情 管理员界面 摘要 基于Spring Boot的足球联赛管理系统代表了一种现代体育赛事管…

这15个海运提单的雷区 你知道吗?

海运提单中英文对照 海运提单主要项目填制说明 1、托运人(Shipper)&#xff1a;即与承运人签订运输契约&#xff0c;委托运输的货主&#xff0c;即发货人。在信用证支付方式下&#xff0c;一般以受益人为托运人;托收方式以托收的委托人为托运人。另外&#xff0c;根据《UCP500》…

【uniapp】subnvue组件数据更新视图未更新问题

背景 : 页面中的弹窗使用了subnvue来写, 根据数据依次展示一个一个的弹窗, 点击"关闭"按钮关闭当前弹窗, 显示下一个弹窗 问题 : 当点击关闭时( 使用的splice() ), 数据更新了 , 而视图没有更新, 实际上splice() 是不仅更新数据, 也可以更新视图的 解决 : this.$fo…

Linux配置JAVA_HOME

[rootlocalhost ~]# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy1.下载jdk 官网下载地址 2.将下载好的软件包解压到指定目录 tar -zxf /usr/local/software/jdk-…

雪莱的式子武汉2023(分析+快速幂)

传送门&#xff1a;登录—专业IT笔试面试备考平台_牛客网 思路&#xff1a; 对于每一种质因子&#xff0c;如果他在μ&#xff08;&#xff09;函数中出现两次&#xff0c;那这种情况对答案贡献为0&#xff0c;所以我们可以只讨论每一种因子出现0&#xff0c;1次的情况。 对于…

Altium Designer实用系列(一)----原理图导入PCB、PCB板子外形、多层板绘制等

一、原理图导入PCB 绘制原理图就不必多说了&#xff0c;根据自己电路的需求&#xff0c;去设计电源、芯片的外围电路、MCU外设分配就好。接下来主要介绍的是在导入PCB前对原理图的检查&#xff1a; 元器件标号注解 元器件封装确认&#xff1a;工具->封装管理器&#xff1…

美团代运营优势成都优优聚告诉你!

美团代运营是一种全新的商务服务模式&#xff0c;通过委托美团平台进行运营管理&#xff0c;以提升企业销售业绩和品牌影响力为目标。美团代运营有着许多优势&#xff0c;下面我们来详细了解一下。 首先&#xff0c;美团代运营具有强大的用户流量。作为中国最大的本地生活服务平…

wpf中prism框架

安装prism包&#xff1a; 添加引用 using System; using System.Collections.Generic; using System.Configuration; using System.Data; using System.Linq; using System.Threading.Tasks; using System.Windows; using Prism.DryIoc; using Prism.Ioc;namespace PrismDemo …