【从零学习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. return -1;
19. }
20. namedWindow("滑动条改变图像亮度");
21. imshow("滑动条改变图像亮度", img1);
22. value = 100; //滑动条创建时的初值
23. //创建滑动条
24. createTrackbar("亮度值百分比", "滑动条改变图像亮度", &value, 600, callBack, 0);
25. waitKey();
26. }
27.
28. static void callBack(int, void*)
29. {
30. float a = value / 100.0;
31. img2 = img1 * a;
32. imshow("滑动条改变图像亮度", img2);
33. }
图3-34 myCreateTrackbar.cpp程序中滑动条不同位置对图像亮度的改变