【OpenCV 4开发详解】窗口交互操作

本文详细介绍了OpenCV 4中如何实现图像窗口的交互操作,包括使用createTrackbar()创建滑动条来动态调整图像亮度,以及通过setMouseCallback()设置鼠标响应,实现标记图像重要区域的功能。通过实例展示了滑动条改变图像亮度和鼠标绘制轨迹的效果。
摘要由CSDN通过智能技术生成
本文首发于 “小白学视觉”微信公众号,欢迎关注公众号
本文作者为小白,版权归 人民邮电出版社发行所有,禁止转载,侵权必究!

经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

交互操作能够增加用户对程序流程的控制,使得程序可以根据用户需求实现不同的处理结果。有时某一个参数作用需要反复尝试不同的数值,这时交互操作可以实现在程序运行过程中改变参数数值,避免重复运行程序,节省时间同时能够增加结果的对比效果。本节中将介绍OpenCV 4中提供的图像窗口滑动条和鼠标交互响应两种窗口交互操作。

图像窗口滑动条

图像窗口滑动条,顾名思义就是在显示图像的窗口中创建能够通过滑动改变数值的滑动条。有时我们需要动态调节某些参数,以使图像处理的效果更加明显,能够改变参数数值的滑动条可以很好的胜任这项工作。OpenCV 4中通过createTrackbar()函数在显示图像的窗口上创建滑动条,该函数的函数原型在代码清单3-54中给出。

代码清单3-54 createTrackbar()函数原型
1.	int cv::createTrackbar(const String &  trackbarname,
2.	                           const String &  winname,
3.	                           int *  value,
4.	                           int  count,
5.	                           TrackbarCallback  onChange = 0,
6.	                           void *  userdata = 0 
7.	                           )
  • trackbarname:滑动条的名称
  • winname:创建滑动条窗口的名称。
  • value:指向整数变量的指针,该指针指向的值反映滑块的位置,创建后,滑块位置由此变量定义。
  • count:滑动条的最大取值。
  • onChange:每次滑块更改位置时要调用的函数的指针。该函数应该原型为void Foo(int,void *);,其中第一个参数是轨迹栏位置,第二个参数是用户数据。如果回调是NULL指针,则不会调用任何回调,只更新数值。
  • userdata:传递给回调函数的可选参数

该函数能够在图像窗口的上方创建一个范围从0开始的整数滑动条,由于滑动条只能输出整数,如果需要得到小数,必须进行后续处理,例如输出值除以10得到含有1位小数的数据。函数第一个参数是滑动条的名称,第二个参数是创建滑动条的图像窗口的名称。第三个参数是指向整数变量的指针,该指针指向的值反映滑块的位置,在创建滑动条时该参数确定了滑动块的初始位置,当滑动条创建完成后,该指针指向的整数随着滑块的移动而改变。第四个参数是滑动条的最大取值。第五个参数是每次滑块更改位置时要调用的函数的指针。该函数应该原型为void Foo(int,void *),其中第一个参数是轨迹栏位置,第二个参数是用户数据,如果回调是NULL指针,则不会调用任何回调,只更新数值。最后一个参数是传递给回调函数的void *类型数据,如果使用的第三个参数是全局变量,可以不用忽略最后一个参数,使用参数的默认值即可。

为了了解滑动条动态改变参数的方法以及动态参数在程序中的作用,在代码清单3-55中给出了通过滑动条改变图像亮度的示例程序。程序中滑动条控制图像亮度系数,将图像原始灰度值乘以亮度系数得到最终的图像。为了使图像亮度变化比较平滑,将滑动条参数除以100以得到含有两位小数的亮度系数。为了保证每次亮度的改变都是在原始图像的基础上,设置了两个表示图像的img1、 img2全局变量,其中img1表示原始图像,img2表示亮度改变后的图像。程序中,通过拖拽滑动块可以动态的改变图像的亮度,运行结果在图3-34中给出。

代码清单3-55 myCreateTrackbar.cpp在图像中创建滑条改变图像亮度
1.	#include <opencv2/opencv.hpp>
2.	#include <iostream>
3.	
4.	using namespace std;
5.	using namespace cv;
6.	
7.	//为了能在被调函数中使用,所以设置成全局的
8.	int value;
9.	void callBack(int, void*);  //滑动条回调函数
10.	Mat img1, img2;
11.	
12.	int main()
13.	{
   
14.		img1 = imread("lena.png");
15.		if (!img1.data)
16.		{
   
17.			cout << "请确认是否输入正确的图像文件" << endl;
18.			
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白学视觉

您的赞赏是我们坚持下去的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值