说明:使用Track Bar调节图片亮度
1、创建Track Bar函数
函数原型:
CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname,
int* value, int count,
TrackbarCallback onChange = 0,
void* userdata = 0);
@功能:创建跟踪条并将其附加到指定的窗口
函数createTrackbar用指定的名称创建一个trackbar(一个滑块或范围控件)和范围,赋一个变量值为与trackbar同步的位置,并指定
在轨迹条位置改变时调用onChange回调函数。创建的跟踪栏为显示在指定窗口的winname中
@trackbarname:创建的轨迹条名称
@winname:将被用作已创建trackbar的父窗口的名称
@value:对象的位置,指向整型变量的可选指针滑块。在创建时,滑块的位置由这个变量定义
@count:滑块的最大位置。最小位置总是0
@onChange :指针指向每次滑块改变位置时要调用的函数。这函数应该原型化为void Foo(int,void*);,其中第一个参数是trackbar位置和第二个参数是用户数据(参见下一个参数)。如果回调是NULL指针,不调用回调函数,只更新值。
@userdata :userdata按原样传递给回调的用户数据。它可以用来处理跟踪棒不使用全局变量的事件。
2、图像加权合成函数 addWeighted()
函数原型:
CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2,
double beta, double gamma, OutputArray dst, int dtype = -1);
函数说明:dst = src1alpha + src2beta + gamma;
@note Saturation is not applied when the output array has the depth CV_32S. You may even get
result of an incorrect sign in the case of overflow.
@param src1 first input array.
@param alpha weight of the first array elements.
@param src2 second input array of the same size and channel number as src1.
@param beta weight of the second array elements.
@param gamma scalar added to each sum.
@param dst output array that has the same size and number of channels as the input arrays.
@param dtype optional depth of the output array; when both input arrays have the same depth, dtype
can be set to -1, which will be equivalent to src1.depth().
@sa add, subtract, scaleAdd, Mat::convertTo
3、源码
static void TrackBar_Callback(int TrackBarValue, void *userdata)
{
//Mat Src = *((Mat *)(userdata));等价方式
Mat *pSrc = NULL;
Mat src, m, dst;
std::cout << "TrackBarValue:" << TrackBarValue << std::endl;
pSrc = (Mat *)(userdata);//指针转换
m = Mat::zeros(pSrc->size(), pSrc->type());
dst = Mat::zeros(pSrc->size(), pSrc->type());
m = Scalar(TrackBarValue, TrackBarValue, TrackBarValue);
add(*pSrc, m, dst);
imshow("亮度调节",dst);
}
void QuickDemo::track_bar_demo(Mat &image)
{
int vMax = 100,vInit = 50;//TrackBar范围0-100,初始50
namedWindow("亮度调节", WINDOW_AUTOSIZE);
createTrackbar("TrackBar", "亮度调节", &vInit, vMax, TrackBar_Callback, (void *)(&image));
TrackBar_Callback(vInit, &image);
}
说明:直接使用回调函数的(int TrackBarValue, void *userdata)可以实现无局部变量的操作方式
4、源码:使用加权函数操作亮度与对比度
static void TrackBar_Brightness_Callback(int TrackBarValue, void *userdata)
{
Mat *pSrc = NULL;
Mat src, m, dst;
pSrc = (Mat *)(userdata);//指针转换
m = Mat::zeros(pSrc->size(), pSrc->type());
dst = Mat::zeros(pSrc->size(), pSrc->type());
m = Scalar(TrackBarValue, TrackBarValue, TrackBarValue);
addWeighted((*pSrc), 1.0, m, 0.0, TrackBarValue, dst);//原图的基础上加上TrackBarValue
imshow("对比度、亮度调节", dst);
}
static void TrackBar_Contrast_Callback(int TrackBarValue, void *userdata)
{
Mat *pSrc = NULL;
Mat src, m, dst;
double cof = 0.0f;
pSrc = (Mat *)(userdata);//指针转换
m = Mat::zeros(pSrc->size(), pSrc->type());
dst = Mat::zeros(pSrc->size(), pSrc->type());
m = Scalar(TrackBarValue, TrackBarValue, TrackBarValue);
cof = TrackBarValue / 100.0;
addWeighted((*pSrc), cof, m, 0.0, 0.0, dst);//原图的基础上按cof比例更改
imshow("对比度、亮度调节", dst);
}
void QuickDemo::track_bar_demo(Mat &image)
{
int vMax = 100,vInit = 50;//TrackBar范围0-100,初始50
namedWindow("对比度、亮度调节", WINDOW_AUTOSIZE);
createTrackbar("亮度", "对比度、亮度调节", &vInit, vMax, TrackBar_Brightness_Callback, (void *)(&image));
TrackBar_Brightness_Callback(vInit, &image);
createTrackbar("对比度", "对比度、亮度调节", &vInit, 200, TrackBar_Contrast_Callback, (void *)(&image));
TrackBar_Contrast_Callback(vInit, &image);
}
亮度是图像整体提高一个值,对比度指图像亮的地方越来越亮,即图像像素值差异越来越大