06 滚动条操作1.0 - 调整图像亮度
opencv知识点:
- 创建滚动条 - createTrackbar()
- 处理滚动条事件的函数 - TrackbarCallback()
本课所解决的问题:
- 如何创建滚动条?
- 如何通过滚动条进行亮度调整?
1.滚动条的创建
上一课中,我们调整亮度只能一次一次的去调整,现在我们来试一下通过滚动条调整亮度。
在OpenCV中,我们要想在图像上通过滚动条调整亮度,要用到两个API
-
createTrackbar
-
TrackbarCallback(用户自写)
createTrackbar
创建滚动条
共6个参数
第1个参数 滚动条名称
第2个参数 窗口名称
第3个参数 初始的位置
第4个参数 最大位置(最小位置始终为0)
第5个参数 处理轨迹栏事件类型的回调函数
(opencv中这里默认是onChange = 0,实际应用中我们要自己进行函数定义及实现)
第6个参数 userdata 传递给回调函数的用户数据(任何我们想传的,比如图像)
TrackbarCallback类型的函数
共2个参数
第1个参数 指定轨迹栏的当前位置
第2个参数 void*类型的可选传入数据
2.通过滚动条调整亮度
这里的代码只是初步的实现,并没有充分利用creatTrackbar的6个参数
同时部分地方也不符合面向对象的编程,所以我们在下一课进行了代码优化
程序
quickopencv.h
//函数定义
void tracking_bar_demo(Mat& image);
quickdemo.cpp
#include "quickopencv.h"
#include <opencv2/dnn.hpp>
using namespace cv;
using namespace std;
//函数实现
Mat src, dst, m;
int lightness;
static void on_track(int, void*) {
m = Scalar(lightness, lightness, lightness);
add(src, m, dst);
//subtract(src, m, dst);
imshow("亮度调整", dst);
}
void QuickDemo::tracking_bar_demo(Mat& image) {
src = image;
dst = Mat::zeros(image.size(), image.type());
m = Mat::zeros(image.size(), image.type());
namedWindow("亮度调整", WINDOW_AUTOSIZE);
int max_value = 100;
lightness = 50;
createTrackbar("Value Bar:", "亮度调整", &lightness, max_value, on_track);
//on_track(lightness, 0);
/*
课程中的这一句代码,是多此一举,这是一个回调函数不需要我们手动调用
这个lightness在createTrackbar中就已经传入了,这里没必要再去调用传入
*/
}
提高亮度:
提高亮度
add(src, m, dst);
降低亮度:
降低亮度
subtract(src, m, dst);