Opencv中TrackBar

Opencv利用TrackBar调整图片的亮度和对比度

通过TrackBar可以方便调节参数

createTrackbar("TrackBar名称:", "window名称", 通过TrackBar改变的值(调节范围:在0-最大值之间改变), max_value, 回调函数, (void*) (&image))
第一个参数:滚动条名字;
第二个参数:要添加滑动条的窗口名字
第三个参数:*是滑动条的初始位置,同时也之后调整滑动条时传入回调函数的变量
第四个参数:滑动条的最大值;
第五个参数:所写的回调函数名字,默认为0
第六个参数:这个变量这个参数是用户传给回调函数的数据,用来处理轨迹条事件,默认值为0

通过TrackBar对多个参数进行同步调整原理说明:
1、对多个参数的调节可以合并在一个回调函数里面,不同createTrackbar的回调函数都为同一个回调函数,这样修改就在同一图片的基础上修改了。
2、操作图片Mat 和不同createTrackbar对应的“value”是全局变量。如下面例子(1)所示,将输入图片和输出图片以及修改的参数设置为全局变量,这样回调函数和主函数才能顺利使用变量。
3、可以将输入图片通过回调函数的参数列表(int value, void* userdata)将更给的参数和输入图片传入给回调函数,但是不能两个TrackBar不能共同作用。虽然一个窗口下,但是只能分别调节。如例子(2)所示,只能单子调节对比度或者亮度。调节完亮度后,再调节对比度,不会在调节后的亮度的基础上进行调整。

https://blog.csdn.net/qq_51116518/article/details/119734918

1.通过TrackBar调节Canny两个阈值参数,直接观察检测效果

#include "opencv2/opencv.hpp"
#include<iostream>
using namespace cv;
using namespace std;

Mat srcimg;
Mat dstimg;
int value1 = 20;
int value2 = 20;
void OnChange(int, void*)
{
	//threshold(srcimg, dstimg, value, 255, THRESH_BINARY);//二值化
	//二值化参数:输入图像,输出图像,value滑动条所在的阈值,255为最大阈值,THRESH_BINARY的形式
	Canny(srcimg, dstimg, value1, value2, 3, false);//边缘处理
	imshow("TrackBar", dstimg);
}


void main()
{
	srcimg = imread("big4.jpg");
	namedWindow("TrackBar", WINDOW_AUTOSIZE);
	createTrackbar("Threshold1", "TrackBar", &value1, 255, OnChange, 0);//创建滑动条
	createTrackbar("Threshold2", "TrackBar", &value2, 255, OnChange, 0);//创建滑动条
	//滑动条参数:第一个:滑动条名称;第二个:窗口名称;&滑动条位置的地址,255最大阈值,OnChange:回调指针;最后一个参数是用户资料,设置为0即可
	imshow("TrackBar", dstimg);
	waitKey(0);
}

2.通过TrackBar调节图片的亮度和对比度

static void on_lightness(int b, void* userdata) {
	Mat image = *((Mat*)userdata);
	Mat dst = Mat::zeros(image.size(), image.type());
	Mat m = Mat::zeros(image.size(), image.type());
	addWeighted(image, 1.0, m, 0, b, dst);
	imshow("亮度与对比度调整", dst);
}

static void on_contrast(int b, void* userdata) {
	Mat image = *((Mat*)userdata);
	Mat dst = Mat::zeros(image.size(), image.type());
	Mat m = Mat::zeros(image.size(), image.type());
	double contrast = b / 100.0;
	addWeighted(image, contrast, m, 0.0, 0, dst);
	imshow("亮度与对比度调整", dst);
}

void QuickDemo::tracking_bar_demo(Mat &image) {
	namedWindow("亮度与对比度调整", WINDOW_AUTOSIZE);
	int lightness = 50;
	int max_value = 100;
	int contrast_value = 100;
	int max_contrast_value = 200;
	createTrackbar("Value Bar:", "亮度与对比度调整", &lightness, max_value, on_lightness, &image);//createTrackbar("TrackBar名称:", "window名称", 通过TrackBar改变的值(调节范围:在0-最大值之间改变), max_value, 回调函数, (void*) (&image))
	createTrackbar("Contrast Bar:", "亮度与对比度调整", &contrast_value, max_contrast_value, on_contrast, &image);
	//on_lightness(50, &image);
}

注:
1.void型指针
void通常表示无值,但将void作为指针的类型时,它却表示不确定的类型。这种void型指针是一种通用型指针,也就是说任何类型的指针值都可以赋给void类型的指针变量

需要指出的是,这里说void型指针是通用指针,是指它可以接受任何类型的指针的赋值,但对已获值的void型指针,对它进行再处理,如输出或者传递指针值时,则必须再进行显式类型转换,否则会出错。
————————————————
版权声明:本文为CSDN博主「白鳯」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44368437/article/details/117563488

    void* pc;
    int i = 123;
    char c = 'a';
    pc = &i;
	cout << pc << endl;         //输出指针地址006FF730
	cout << *(int*)pc << endl;  //输出值123
    pc = &c;
	cout << *(char*)pc << endl; //输出值a

2.addWeighted()
void(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);

第一个参数,InputArray类型的src1,表示需要加权的第一个数组,一般是一个Mat;
第二个参数,double类型的alpha,表示第一个数组的权重
第三个参数,InputArray类型的src2,表示需要加权的第二个数组,它需要和第一个数组拥有相同的尺寸和通道数;
第四个参数,double类型的beta,表示第二个数组的权重;
第五个参数,double类型的gamma,加到权重总和上的标量值(类似于偏置);
第六个参数,OutputArray类型的dst,输出的数组,它和输入的两个数组有相同的尺寸和通道数;
第七个参数,int类型的dtype,输出阵列的可选深度,默认值是-1。当两个输入数组有相同的深度时,设置为-1.
下面数学公式表示:用addWeighted函数计算两个数组的加权和:

dst = src1 * alpha + src2 * beta + gamma;

int main() {
    Mat src1 = imread("/Users/dwz/Desktop/cpp//mogu.jpg");
    Mat src2 = imread("/Users/dwz/Desktop/cpp/rain.jpg");
 
    double alpha = 0.5;
    double beta = 1 - alpha;
    double gamma = 0;
 
    Mat dst;
    addWeighted(src1, alpha, src2, beta, gamma, dst, -1);
    imwrite("addweighted.jpg", dst);
 
    return 0;
}

————————————————
版权声明:本文为CSDN博主「xddwz」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/xddwz/article/details/110811018

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值