1. 知识点
- cv.namedWindow() 创建一个窗口;
- cv.createTrackbar() 创建一个轨迹栏;
- cv.getTrackbarPos() 获取对应轨迹栏的轨迹位置;
- cv.waitKey() 键盘操作返回对应的key。
2. cv.namedWindow() 函数说明
- 函数使用
cv.namedWindow(winname, flags=None)
- 参数说明
参数 | 说明 |
---|---|
winname | 表示创建窗口的名称。 |
flags | 表示创建的窗口类型。 |
- flags 说明
值 | 说明 |
---|---|
WINDOW_NORMAL | 表示显示图像后,允许用户随意调整窗口大小。 |
WINDOW_AUTOSIZE | 表示根据图像大小显示窗口,不允许用户调整大小。 |
WINDOW_KEEPRATIO | 表示保持图像的比例。 |
3. cv.createTrackbar() 函数说明
- 函数使用
cv.createTrackbar(trackbarname, winname, value, count, trackbarcallback, userdata)
- 参数说明
参数 | 说明 |
---|---|
trackbarname | 表示轨迹栏的名称。 |
winname | 表示附加到的窗口名称。 |
value | 一个指向整形的指针, 表示滑块的位置。 创建时,滑块的初始位置就是该变量当前的值。 |
count | 表示滑块可以达到的最大位置的值。 滑块最小位置的值始终为0。 |
trackbarcallback | 表示执行的回调函数每次跟踪栏值更改。【回调函数始终具有默认参数,即轨迹栏位置。】 |
userdata | 表示默认值0。这个参数是用户传递给回调函数的数据,用来处理轨迹条事件。如果使用的第三个参数value是全局变量,完全可以不去管这个userdata参数。 |
- trackbarcallback回调流程
4. cv.getTrackbarPos() 函数说明
- 函数使用
cv.getTrackbarPos(trackbarname, winname)
- 参数说明
参数 | 说明 |
---|---|
trackbarname | 表示轨迹栏的名称。 |
winname | 表示轨迹栏依托窗口的名称。 |
5. cv.waitKey() 函数说明
- 函数使用
cv.waitKey(delay=0)
- 参数说明
参数 | 说明 |
---|---|
delay | 表示阻塞指定毫秒数。 |
- delay 值说明
值 | 说明 |
---|---|
0或者不填写 | 表示一直阻塞。 |
大于0 | 表示阻塞指定毫秒数。 |
- 注意
该函数的返回值,在不同的操作系统中可能会有差异。
6. cv.imshow() 函数说明
- 函数使用
cv.imshow(winname, mat)
- 参数说明
参数 | 说明 |
---|---|
winname | 表示需要显示图像的窗口名称。 |
mat | 表示需要显示的图像。 |
7. 调整图像的亮度
7.1 分析
- RGB 表示图像的亮度;
- RGB 的取值范围(0,0,0)-(255,255,255);
- 图像像素运算可以改变 RGB 的值。
7.2 代码实现
代码语言:javascript复制import cv2 as cv
import numpy as np
# 回调函数
def trackbarcallback(value):
print(value)
pass
def adjust_brightness_demo():
# 读取图片
img = cv.imread('./images/butterfly.jpg')
# 复制一个用于修改合并的图片
img_copy = np.zeros_like(img)
# 创建一个名为 adjust_brightness 的窗口
cv.namedWindow('adjust_brightness')
# 创建一个名为 progress 的轨迹栏,将其依托到 adjust_brightness 窗口
cv.createTrackbar('progress', 'adjust_brightness', 0, 100, trackbarcallback)
# 循环获取轨迹栏的值
while 1:
# 将图像 img_copy 显示到 adjust_brightness 窗口
cv.imshow('adjust_brightness', img_copy)
# 每10毫秒 获取键盘操作值,如果是 【ESC】 退出循环
key = cv.waitKey(10)
if key == 27:
break
# 获取 adjust_brightness 窗口中 progress 轨迹栏的位置
value = cv.getTrackbarPos('progress', 'adjust_brightness')
# 将轨迹栏的位置值转换为OpenCV图像值
value = np.uint8(value)
# 修改复制图片的像素值
img_copy[:] = (value, value, value)
# 使用像素运算中的加法,增减亮度
img_copy = cv.add(img, img_copy)
# 销毁全部窗口
cv.destroyAllWindows()
if __name__ == "__main__":
adjust_brightness_demo()
7.3 实现结果
7.4 注意
- np.zeros_like 只是生成了一个和img图像一致的矩阵,但是值都是0,因此循环第一次显示的图像是黑色;
- 由于10毫秒的阻塞,肉眼观察不到,没有进行操作,因此执行了cv.add将黑色图片和原图进行了加法计算,所以最后肉眼看到的是显示原图。
8. 键盘响应进行不同操作
8.1 分析
- 监听键盘的操作值,cv.waitKey;
- 【按1】显示 HSV 图像;
- 【按2】显示 YCrCb 图像;
- 【按3】显示 RGB 图像;
- 【按0】显示 BGR 图像;
8.2 代码实现
代码语言:javascript复制import cv2 as cv
import numpy as np
def handle_key():
# 读取图片
img = cv.imread('./images/butterfly.jpg')
# 复制一个 img 用于转换的矩阵
img_copy = cv.add(img, np.zeros_like(img))
# 创建一个名为 waitkey 的窗口
cv.namedWindow('waitkey')
while 1:
# 将图像 img_copy 显示到 waitkey 窗口
cv.imshow('waitkey', img_copy)
# 每10毫秒 获取键盘操作值
key = cv.waitKey(10)
if key == 27:
break
# 按0
elif key == 48:
img_copy = img
# 按1
elif key == 49:
img_copy = cv.cvtColor(img, cv.COLOR_BGR2HSV)
# 按2
elif key == 50:
img_copy = cv.cvtColor(img, cv.COLOR_BGR2YCrCb)
# 按3
elif key == 51:
img_copy = cv.cvtColor(img, cv.COLOR_BGR2RGB)
# 销毁窗口
cv.destroyAllWindows()
if __name__ == "__main__":
handle_key()
8.3 实现结果
9. 总结
- cv.createTrackbar() 的回调是必填参数,不填写会报错;
TypeError: function takes exactly 5 arguments (4 given)
- cv.getTrackbarPos() 获取对应窗口中对应轨迹栏的当前值;
- cv.imshow() 用于在指定的窗口中显示图像;
- cv.waitKey() 表示阻塞指定毫秒数。如果0或者不填写表示一直阻塞!