通过滚动条来调整图像亮度
#include <iostream>
#include "06_opencv_mat.h"
using namespace std;
Mat src,dst,temp;
int lightness = 50; //初始值设置为50
uchar flag = 2;
static void on_track(int pos, void* userdata)
{
if (lightness > 50 && lightness <= 100)
{
flag = 1;
lightness -= 50;
}
else if(lightness >= 0 && lightness < 50)
{
flag = 0;
lightness = 50 - lightness;
}
else
{
flag = 2;
}
switch (flag)
{
case 0:{
temp = Scalar(lightness, lightness, lightness);
subtract(src, temp, dst);
break;
}
case 1: {
temp = Scalar(lightness, lightness, lightness);
add(src, temp, dst);
break;
}
case 2: {
temp = Scalar(0, 0, 0);
add(src, temp, dst);
break;
}
}
imshow("亮度调整", dst);
}
void QuickDemo::tracking_bar_demo(Mat &image)
{
namedWindow("亮度调整", WINDOW_AUTOSIZE);
//我希望滚动条的调整范围在 0 - 100 之间
//不用设置最小值,默认就是0 - 100
int max_value = 100;
src = image;
temp = Mat::zeros(image.size(), image.type());
dst = Mat::zeros(image.size(),image.type());
//参数1 - 给这个滚动条设置一个名字
//参数2 - 滚动条显示在哪个窗体
//参数3 - 通过哪个值来控制,需要传地址过去
//参数4 - 调整的范围是多少,即最大值是多少,最小值为0
//参数5 - 是一个回调函数, TrackbarCallback onChange = 0,默认为NULL(0),
// typedef void (*TrackbarCallback)(int pos, void* userdata);
// 当我们滑动滚动条时,就会产生一个事件(Trackbar Change),系统会捕捉这个事件,
// 然后调用我们写的回调函数TrackbarCallback
//参数6 - void* userdata = 0,是否需要它携带一个外带的数据,这个数据可以是你自己定义的,由void*修饰
createTrackbar("Value Bar:", "亮度调整", &lightness, max_value, on_track);
on_track(50,0);
}
运行结果如下:
向左为亮度减,向右为亮度加。
改进
#include <iostream>
#include "06_opencv_mat.h"
using namespace std;
static void on_track(int pos, void* userdata)
{
Mat src = *((Mat*)userdata);
Mat dst = Mat::zeros(src.size(), src.type());
Mat temp = Mat::zeros(src.size(), src.type());
temp = Scalar(pos, pos, pos);
subtract(src,temp,dst);
imshow("亮度调整", dst);
}
void QuickDemo::tracking_bar_demo(Mat &image)
{
namedWindow("亮度调整", WINDOW_AUTOSIZE);
//我希望滚动条的调整范围在 0 - 100 之间
//不用设置最小值,默认就是0 - 100
int lightness = 0; //初始值设置为0
int max_value = 100;
//参数1 - 给这个滚动条设置一个名字
//参数2 - 滚动条显示在哪个窗体
//参数3 - 通过哪个值来控制,需要传地址过去
//参数4 - 调整的范围是多少,即最大值是多少,最小值为0
//参数5 - 是一个回调函数, TrackbarCallback onChange = 0,默认为NULL(0),
// typedef void (*TrackbarCallback)(int pos, void* userdata);
// 当我们滑动滚动条时,就会产生一个事件(Trackbar Change),系统会捕捉这个事件,
// 然后调用我们写的回调函数TrackbarCallback
//参数6 - void* userdata = 0,是否需要它携带一个外带的数据,这个数据可以是你自己定义的,由void*修饰
createTrackbar("Value Bar:", "亮度调整", &lightness, max_value, on_track,(void*)(&image));
on_track(lightness,&image);
}