opencv使用Track Bar调节控件

说明:使用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);
}

在这里插入图片描述
亮度是图像整体提高一个值,对比度指图像亮的地方越来越亮,即图像像素值差异越来越大

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值