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


    轨迹条:cv::createTrackbar

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

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

    参数解释:

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

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

    使用轨迹条设置对比度

    #include 
    
    // 回调函数,用于处理轨迹条值的变化
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    在这里插入图片描述

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

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

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

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

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

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

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

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

    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    using namespace cv;
    #include 
    #include 
    using namespace cv; //包含cv命名空间
    #include 
    
    
    
    
    // 描述:全局函数声明
    //
    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

    在这里插入图片描述

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

    #include 
    
    // 全局变量用于存储对比度值
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
  • 相关阅读:
    代码随想录训练营第59天|503.下一个更大元素II,42.接雨水
    C# 上位机Modbus Crc校验方法
    python实现oracle数据库连接并转成dataframe
    Git 版本控制系统 笔记
    直播课堂系统08补-腾讯云对象存储和课程分类管理
    Maven中央仓库
    响应式基础
    C | atexit函数
    Kernel Memory 入门系列:快速开始
    K210跟随物体(控制舵机转动)
  • 原文地址:https://blog.csdn.net/qq_46107892/article/details/133696127