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) + 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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枭玉龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值