栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

opencv使用Track Bar调节控件

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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);
}


亮度是图像整体提高一个值,对比度指图像亮的地方越来越亮,即图像像素值差异越来越大

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/929140.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号