第三部分、滚动条操作
- 第一节、滚动条操作
- 1.事件响应函数
- (1)UI组件时间响应过程
- (2)事件响应函数
- (3)创建窗口函数
- (4)调整图像亮度
- 2.滚动条操作
- 3.代码练习与测试
- 学习参考
第一节、滚动条操作
1.事件响应函数
(1)UI组件时间响应过程
-
Callback基本流程
-
OpenCV中的响应主要是通过操作系统实现。
-
如右图所示假设我们自己创建了一个Api,做滚动条,名字是createTrackbar,滚动条里面参数包括。
注意:参数的定义必须按照右图中的形式定义
- trackbarname滚动条名称
- winname窗口名称 – imshow的第一个参数
- value 滚动条上拉动滑块的值
- count 滑块的最大值(0-255或者0-100等等)
- onChange 滑动过程中触发的函数
- userdata 滑动过程中外带的参数,没有的话就置0
-
注意:右图中的TrackbarCallback指的就是左图中的回调的响应方法,当我们用户组件触发之后,应用程序会去让用户界面回调一个方法,这个方法就是TrackbarCallback,这个回调的方法是要自己定义的。
(2)事件响应函数
typedef void(* cv::TrackbarCallback) (int pos, void *userdata)
# pos必须定义,指的是滑块的位置,userdata用户数据可以定义也可以不定义
# 完成事件响应函数的声明与实现
def trackbar_callback (pos):
print(pos)
(3)创建窗口函数
cv.namedWindow(winname [, flags]) -> None
# 参数: winname表示窗口标题
# 参数flags支持的flag有:
1. WINDOW_NORMAL # 可以调整窗口大小,(推荐如果图片太大就用这个)
2. WINDOW_AUTOSIZE # 根据图像大小自动适应,不可调,(推荐如果自己电脑分辨率能显示出来就用这个)
3. WINDOW_KEEPRATIO # 可以保持比例窗口,调整大小,(推荐不用这个,用上面两个)
(4)调整图像亮度
RGB值表示亮度
RGB(0, 0,0) 黑色 --> RGB(255,255,255)白色 # 通过增大像素值提高亮度
# add、subtract函数除了支持图像+图像、也可以图像+常量方式(常量就是一个颜色)
# 通过他们可以修改图像的亮度
一些常见的调整图像亮度的方法:
- 动态调整,基于滚动条修改常量值,实现动态修改图像亮度并刷新显示
- 创建图像窗口
- 创建滚动条组件
- 在窗口显示图像
- 拖拉滚动条修改图像亮度
2.滚动条操作
通过滚动条的方式改变图像亮度:
3.代码练习与测试
# 创建一个滚动条调整亮度
def trackbar_callback(pos): # trackbar_callback函数里可以什么都不做,但是必须有这个函数
print(pos)
def trackbar_demo():
image = cv.imread(r"F:\python\opencv-4.x\samples\data\butterfly.jpg")
cv.namedWindow("trackbar_demo",cv.WINDOW_AUTOSIZE)
cv.createTrackbar("lightness", "trackbar_demo", 0, 200, trackbar_callback)# callback先注册后使用
cv.imshow("trackbar_demo", image)
while True:
pos = cv.getTrackbarPos("lightness", "trackbar_demo")
image2 = np.zeros_like(image)
# image2是个常量,通过原图片和image2做加减法来提升和降低亮度
image2[:, :] = (np.uint8(pos), np.uint8(pos), np.uint8(pos))
# 提升亮度
result = cv.add(image, image2)
# 降低亮度
# result = cv.subtract(image, image2)
cv.imshow("trackbar_demo", result)
# 1ms获取一次键值,默认是 - 1,ESC是27
c = cv.waitKey(1)
if c == 27: # 按ESC建终止调整亮度功能
break
cv.waitKey(0) # 按任意建关闭窗口
cv.destroyAllWindows()
结果示例:
学习参考
本系列所有OpenCv相关的代码示例和内容均来自博主学习的网站:opencv_course