OpenCV 滑动条调整图像对比度和亮度

一、知识点
1、int createTrackbar(const String & trackbarname, const String & winname, int * value, int count, TrackbarCallback onChange = 0, void * userdata = 0);

(1)、创建一个滑动条并将其附在指定窗口上。

(2)、参数说明:

trackbarname: 创建的滑动条显示名称。

winname: 包含滑动条的窗口名称。

value: 将由滑动条更改的整数值的指针。

count: 滑动条的最大位置。

onChange: 回调函数,每次滑块改变位置时会调用此函数。 函数原型void Foo(int, void *),第一个参数是滑动条位置,第二个参数是用户数据。 如果为nullptr,则不会调用回调函数,但是value仍然自动更新。

userdata: 用户数据,传递给回调函数。

2、void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1);

(1)、计算两个数组的加权和。 在多通道情况下,每个通道都是独立处理的。

(2)、算法代码: dst = src1 * alpha + src2 * beta + gamma;

(3)、参数说明:

src1: 第一个输入数组。

alpha: 第一个数组元素的权重。

src2: 第二个输入数组,和src1大小和通道数相同。

beta: 第二个数组元素权重。

gamma: 标量,会添加到总和中。

dst: 输出数组。

dtype: 输出数组的可选深度。 当两个输入数组具有相同的深度时,dtype可以设置为-1,这相当于src1.depth()。

(4)、src1 * alpha可以改变对比度,比如原先2个值为2、4,相差2,分别乘以2后为4、8,相差4,差值变大。

(5)、gamma可以改变亮度,总和中每个像素的每个通道值都会加上gamma。

二、示例代码: 滑动条调整图像对比度和亮度

cpp 复制代码
#include <iostream>
#include <opencv2/opencv.hpp>


void onContrast(int value, void * pSrc)
{
    cv::Mat src = *((cv::Mat *)pSrc);
    cv::Mat temp = cv::Mat::zeros(src.size(), CV_8UC3);
    cv::Mat dst;

    double contrast = value / 50.0;
    cv::addWeighted(src, contrast, temp, 0.0, 0.0, dst);

    cv::imshow("对比度和亮度调整", dst);
}


void onLightness(int value, void * pSrc)
{
    cv::Mat src = *((cv::Mat *)pSrc);
    cv::Mat temp = cv::Mat::zeros(src.size(), CV_8UC3);
    cv::Mat dst;

    cv::addWeighted(src, 1.0, temp, 0.0, value, dst);
    cv::imshow("对比度和亮度调整", dst);
}


int main()
{
    cv::Mat src = cv::imread("../images/8.png");
    if (src.empty())
    {
        std::cout << "load src image error..." << std::endl;
        return -1;
    }
    cv::imshow("原始图像", src);

    cv::namedWindow("对比度和亮度调整", cv::WINDOW_AUTOSIZE);

    int contrastValue = 50;
    cv::createTrackbar("对比度", "对比度和亮度调整", &contrastValue, 100, onContrast, &src);

    int lightnessValue = 50;
    cv::createTrackbar("亮度", "对比度和亮度调整", &lightnessValue, 100, onLightness, &src);

    cv::waitKey(0);
    return 0;
}
相关推荐
woshihonghonga3 小时前
Jupyter Notebook模块导入错误排查
人工智能
B站计算机毕业设计之家4 小时前
智慧交通项目:Python+PySide6 车辆检测系统 YOLOv8+OpenCV 自定义视频 自定义检测区域 (源码+文档)✅
大数据·python·opencv·yolo·智慧交通·交通·车流量
ting_zh5 小时前
PyTorch、TensorFlow、JAX 简介
人工智能·pytorch·tensorflow
数据与人工智能律师5 小时前
AI的法治迷宫:技术层、模型层、应用层的法律痛点
大数据·网络·人工智能·云计算·区块链
椒颜皮皮虾྅5 小时前
【DeploySharp 】基于DeploySharp 的深度学习模型部署测试平台:安装和使用流程
人工智能·深度学习·开源·c#·openvino
迈火6 小时前
PuLID_ComfyUI:ComfyUI中的图像生成强化插件
开发语言·人工智能·python·深度学习·计算机视觉·stable diffusion·语音识别
AI新兵7 小时前
AI大事记10:从对抗到创造——生成对抗网络 (GANs)
人工智能·神经网络·生成对抗网络
却道天凉_好个秋7 小时前
深度学习(十五):Dropout
人工智能·深度学习·dropout
你好~每一天8 小时前
2025 中小企业 AI 转型:核心岗技能 “怎么证、怎么用”?
人工智能·百度·数据挖掘·数据分析·职业·转行
飞哥数智坊9 小时前
3B参数差点干翻32B模型,Qwen3 Next 是如何做到的?
人工智能