OpenCV-Python学习(7)—— OpenCV 轨迹栏操作和键盘响应操作(cv.createTrackbar、cv.getTrackbarPos、cv.waitKey)

1. 知识点

  1. cv.namedWindow() 创建一个窗口;
  2. cv.createTrackbar() 创建一个轨迹栏;
  3. cv.getTrackbarPos() 获取对应轨迹栏的轨迹位置;
  4. cv.waitKey() 键盘操作返回对应的key。

2. cv.namedWindow() 函数说明

  1. 函数使用
cv.namedWindow(winname, flags=None)
  1. 参数说明
参数 说明
winname 表示创建窗口的名称。
flags 表示创建的窗口类型。
  1. flags 说明
说明
WINDOW_NORMAL 表示显示图像后,允许用户随意调整窗口大小。
WINDOW_AUTOSIZE 表示根据图像大小显示窗口,不允许用户调整大小。
WINDOW_KEEPRATIO 表示保持图像的比例。

3. cv.createTrackbar() 函数说明

  1. 函数使用
cv.createTrackbar(trackbarname, winname, value, count, trackbarcallback, userdata)
  1. 参数说明
参数 说明
trackbarname 表示轨迹栏的名称。
winname 表示附加到的窗口名称。
value 一个指向整形的指针, 表示滑块的位置。 创建时,滑块的初始位置就是该变量当前的值。
count 表示滑块可以达到的最大位置的值。 滑块最小位置的值始终为0。
trackbarcallback 表示执行的回调函数每次跟踪栏值更改。【回调函数始终具有默认参数,即轨迹栏位置。】
userdata 表示默认值0。这个参数是用户传递给回调函数的数据,用来处理轨迹条事件。如果使用的第三个参数value是全局变量,完全可以不去管这个userdata参数。
  1. trackbarcallback回调流程

OpenCV-Python学习(7)—— OpenCV 轨迹栏操作和键盘响应操作(cv.createTrackbar、cv.getTrackbarPos、cv.waitKey)_第1张图片

4. cv.getTrackbarPos() 函数说明

  1. 函数使用
cv.getTrackbarPos(trackbarname, winname)
  1. 参数说明
参数 说明
trackbarname 表示轨迹栏的名称。
winname 表示轨迹栏依托窗口的名称。

5. cv.waitKey() 函数说明

  1. 函数使用
cv.waitKey(delay=0)
  1. 参数说明
参数 说明
delay 表示阻塞指定毫秒数。
  1. delay 值说明
说明
0或者不填写 表示一直阻塞。
大于0 表示阻塞指定毫秒数。
  1. 注意

该函数的返回值,在不同的操作系统中可能会有差异。

6. cv.imshow() 函数说明

  1. 函数使用
cv.imshow(winname, mat)
  1. 参数说明
参数 说明
winname 表示需要显示图像的窗口名称。
mat 表示需要显示的图像。

7. 调整图像的亮度

7.1 分析

  1. RGB 表示图像的亮度;
  2. RGB 的取值范围[(0,0,0)-(255,255,255)];
  3. 图像像素运算可以改变 RGB 的值。

7.2 代码实现

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 实现结果

OpenCV-Python学习(7)—— OpenCV 轨迹栏操作和键盘响应操作(cv.createTrackbar、cv.getTrackbarPos、cv.waitKey)_第2张图片

7.4 注意

  1. np.zeros_like 只是生成了一个和img图像一致的矩阵,但是值都是0,因此循环第一次显示的图像是黑色;
  2. 由于10毫秒的阻塞,肉眼观察不到,没有进行操作,因此执行了cv.add将黑色图片和原图进行了加法计算,所以最后肉眼看到的是显示原图。

8. 键盘响应进行不同操作

8.1 分析

  1. 监听键盘的操作值,cv.waitKey
  2. 【按1】显示 HSV 图像;
  3. 【按2】显示 YCrCb 图像;
  4. 【按3】显示 RGB 图像;
  5. 【按0】显示 BGR 图像;

8.2 代码实现

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. 总结

  1. cv.createTrackbar() 的回调是必填参数,不填写会报错;
TypeError: function takes exactly 5 arguments (4 given)
  1. cv.getTrackbarPos() 获取对应窗口中对应轨迹栏的当前值;
  2. cv.imshow() 用于在指定的窗口中显示图像;
  3. cv.waitKey() 表示阻塞指定毫秒数。如果0或者不填写表示一直阻塞

你可能感兴趣的:(OpenCV-Python学习,opencv,python,学习)