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

轨迹条: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) + bfor( 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.hqwc.cn/news/128514.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GitHub基础

1、仓库是什么意思&#xff1f;仓库拥有者是谁&#xff1f; 在软件开发或版本控制系统中&#xff0c;"仓库"&#xff08;Repository&#xff09;是指存储项目代码、配置文件、文档等相关文件的地方。它可以看作是一个中央存储库&#xff0c;用于管理和跟踪项目的各个…

【MyBatis】MyBatis 详解

MyBatis 详解 一. MyBatis 是什么二. MyBatis 在整个框架中的定位三. MyBatis 的操作1. 先创建好数据库和表2. 添加MyBatis框架⽀持3. 修改配置文件4. 添加业务代码5. 增、删、改操作① 增加⽤户② 修改用户操作③ 删除操作 6. 查询操作① 单表查询② 多表查询 一. MyBatis 是什…

Swift SwiftUI CoreData 过滤数据 2

预览 Code import SwiftUI import CoreDatastruct HomeSearchView: View {Environment(\.dismiss) var dismissState private var search_value ""FetchRequest(entity: Bill.entity(),sortDescriptors: [NSSortDescriptor(keyPath: \Bill.c_at, ascending: false)…

提升企业形象与效率,申请办理400电话客服中心

引言&#xff1a; 随着企业竞争的日益激烈&#xff0c;提供优质的客户服务成为企业赢得市场份额的关键。而400电话客服中心的建立&#xff0c;不仅可以提升企业形象&#xff0c;还能提高客户满意度和工作效率。本文将介绍400电话客服中心的申请办理过程&#xff0c;以及其对企业…

2023年中国隆鼻行业发展历程及趋势分析:隆鼻手术市场将实现进一步增长[图]

隆鼻术就是以各种植入材料置入为主要方法&#xff0c;隆起或抬高鼻部形态为主要目的的鼻整形术式。隆鼻术可能是开展最多的整形美容手术之一。隆鼻术也是一种很成熟的美容手术&#xff0c;操作较为简单、安全、风险较小&#xff0c;也易于接受。 隆鼻行业分类 资料来源&#x…

万界星空科技低代码平台+协同制造MES产品

在生产数字化建设方面&#xff0c;MES产品针对不同的制造行业&#xff0c;开发的工作量较大。传统交付方式开发周期长、过程不可控、质量把控难&#xff0c;同时&#xff0c;开发实施周期长带来了需求变化的可能性增加&#xff0c;周期可能还会延长。 随着数字技术的不断迭代成…

用delphi7将excel导入access并查询及其分析(一)

开发环境&#xff1a;win7 64&#xff08;win10 64&#xff09;两个系统环境&#xff0c;delphi7。 一、安装delphi7&#xff08;已经放在阿里云盘的soft中&#xff09; 解压安装&#xff0c;文件夹里自带SN.txt。直接默认路径安装&#xff08;关系到后续的控件安装时方便&…

【Zookeeper专题】Zookeeper经典应用场景实战(二)

目录 前置知识课程内容一、Zookeeper分布式锁实战1.1 什么是分布式锁1.2 基于数据库设计思路1.3 基于Zookeeper设计思路一1.4 基于Zookeeper设计思路二1.5 Curator 可重入分布式锁工作流程1.6 总结 二、基于Zookeeper实现服务的注册与发现2.1 设计思路2.2 Zookeeper实现注册中心…

计算机基础

分值&#xff1a;3-7 1. 计算机系统概述 2. 计算机组成结构 3. 存储结构 3.1. 层次化存储结构 一般用什么调什么&#xff0c;局部性原理 内存和外存可以统称为虚拟存储器 我们可以操作哪些&#xff1a;操作外存、内存、CPU寄存器。Cache具有透明性。 3.2. Cache Cache的功…

《C和指针》笔记31:多维数组的数组名、指向多维数组的指针、作为函数参数的多维数组

文章目录 1. 指向多维数组的数组名2. 指向多维数组的指针3. 作为函数参数的多维数组 1. 指向多维数组的数组名 我们知道一维数组名的值是一个指针常量&#xff0c;它的类型是“指向元素类型的指针”&#xff0c;它指向数组的第1个元素。那么多维数组的数组名代表什么呢&#x…

基于JavaSpring的学生宿舍管理系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88407844

Android启动式服务

服务是与活动类似的应用组件&#xff0c;只不过服务没有用户界面。 使用服务可以一直在后台做某些事情&#xff0c;比如下载一个大文件&#xff0c;播放一段音乐或者监听来自服务器的一个消息。 有三种类型的服务&#xff1a; 1、启动式服务 启动式服务可以在后台无限期的运行&…