对比度亮度调节
图像处理中的对比度和亮度调节是一种非常基础和广泛应用的技术,它可以帮助我们更好地理解和欣赏图像内容,提高图像的整体质量和可用性。
在vscode的IDE中opencv对比度亮度调节的代码实现见我的上一篇文章。
https://blog.csdn.net/m0_46704925/article/details/139046246?spm=1001.2014.3001.5501
结合qt功能实现
Qslier滑动条控件
Qt中的QSlider控件是一种常用的滑动条控件,可以用于调整数值或选择选项。以下是对QSlider控件的介绍:
一、基本功能:
1.提供水平或垂直方向的滑动条界面,用户可以通过拖动滑块来调整值。
2.可以设置最小值、最大值和当前值,以及步长大小。
3.支持鼠标拖动、键盘控制和鼠标滚轮控制。
二、主要属性:
1.minimum
和maximum
: 设置滑动条的最小值和最大值。
2.value
: 获取或设置当前值。
3.singleStep
和pageStep
: 设置单步和页步的大小。
4.orientation
: 设置滑动条的方向,可选水平或垂直。
5.tickPosition
和tickInterval
: 设置刻度线的位置和间隔。
三、信号:
1.valueChanged(int value)
: 当滑块位置改变时发出此信号,参数为当前值。
2.sliderPressed()
: 当用户开始拖动滑块时发出此信号。
3.sliderReleased()
: 当用户释放滑块时发出此信号。
4.sliderMoved(int position)
: 当滑块正在被拖动时发出此信号,参数为当前位置。
四、代码示例:
QSlider* slider = new QSlider(Qt::Horizontal, this);
slider->setMinimum(0);
slider->setMaximum(100);
slider->setValue(50);
slider->setTickPosition(QSlider::TicksBelow);
slider->setTickInterval(10);
connect(slider, &QSlider::valueChanged, [](int value) {
qDebug() << "Slider value changed to:" << value;
});
解释一下示例代码
QSlider* slider = new QSlider(Qt::Horizontal, this);
这一行代码创建了一个新的水平方向的QSlider控件,并将其父对象设置为当前对象(this),这里的this一般是指我们创建的父类窗口。
slider->setMinimum(0);
slider->setMaximum(100);
slider->setValue(50);
这三行代码分别设置了滑动条的最小值为0、最大值为100,以及初始值为50。
slider->setTickPosition(QSlider::TicksBelow);
slider->setTickInterval(10);
这两行代码设置了滑动条的刻度线位置为在滑动条下方,以及刻度线的间隔为10个单位。
connect(slider, &QSlider::valueChanged, [](int value) {
qDebug() << "Slider value changed to:" << value;
});
这段代码建立了一个信号槽连接。当滑动条的值发生变化时,会触发valueChanged
信号,并执行lambda表达式中的代码。这里简单地将当前值输出到调试控制台。
这里QDebug的使用需要导入
#include<QDebug>
控件的添加
上述介绍的是代码的形式去添加这个控件,代码是编写在.cpp文件中具体位置如下。
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
我们这里直接编辑ui文件,拖拽控件添加。
最后的设计界面如图:
然后是准备我们的槽函数,上面介绍slier控件的信号时有四种信号,我们这里使用两种分别是valueChanged(int value)、sliderMoved(int position)。
分别选中两个槽函数了文件会自动生成相应的槽函数声明。
实现代码
控件属性编辑,这里我只是做一个示例,可根据需求自行修改。
ui->horizontalSlider->setMaximum(99);
ui->horizontalSlider->setMinimum(0);
代码主要三部分,两个槽函数、和我们的对于对比度亮度调节的功能函数
void MainWindow::on_horizontalSlider_sliderMoved(int position)
{
if (m_MatImg.empty()) {
return;
}
imgProc_contract_brightness(position / 33.3, 0);
}
void MainWindow::on_horizontalSlider_valueChanged(int value)
{
if (m_MatImg.empty()) {
return;
}
imgProc_contract_brightness(value / 33.3, 0);
}
void MainWindow::imgProc_contract_brightness(float con, int bri)
{
Mat imgSrc = cvImage;
Mat imgDst = Mat::zeros(imgSrc.size(), imgSrc.type());
imgSrc.convertTo(imgDst, -1, con, bri);
NewQImage = QImage(imgDst.data, imgDst.cols, imgDst.rows, imgDst.cols * imgDst.channels(), QImage::Format_RGB888);
NewcvImage = imgDst;
imshow();
}
这里的imshow函数在前面的文章中提到过。见文章
https://blog.csdn.net/m0_46704925/article/details/139102841?spm=1001.2014.3001.5501
上述代码只是控制对比度。只需更改返回参数创建第二个slier就可以控制亮度变化。
void MainWindow::on_horizontalSlider_sliderMoved(int position)
{
if (cvImage.empty()) {
return;
}
imgProc_contract_brightness(1.0, position);
}
void MainWindow::on_horizontalSlider_valueChanged(int value)
{
if (cvImage.empty()) {
return;
}
imgProc_contract_brightness(1.0, value);
}
这样就可以了。