OpenCV-Python学习(7)—— OpenCV 轨迹栏操作和键盘响应操作

2022-10-24 15:59:58 浏览数 (1)

1. 知识点

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

2. cv.namedWindow() 函数说明

  1. 函数使用
代码语言:javascript复制
cv.namedWindow(winname, flags=None)
  1. 参数说明

参数

说明

winname

表示创建窗口的名称。

flags

表示创建的窗口类型。

  1. flags 说明

说明

WINDOW_NORMAL

表示显示图像后,允许用户随意调整窗口大小。

WINDOW_AUTOSIZE

表示根据图像大小显示窗口,不允许用户调整大小。

WINDOW_KEEPRATIO

表示保持图像的比例。

3. cv.createTrackbar() 函数说明

  1. 函数使用
代码语言:javascript复制
cv.createTrackbar(trackbarname, winname, value, count, trackbarcallback, userdata)
  1. 参数说明

参数

说明

trackbarname

表示轨迹栏的名称。

winname

表示附加到的窗口名称。

value

一个指向整形的指针, 表示滑块的位置。 创建时,滑块的初始位置就是该变量当前的值。

count

表示滑块可以达到的最大位置的值。 滑块最小位置的值始终为0。

trackbarcallback

表示执行的回调函数每次跟踪栏值更改。【回调函数始终具有默认参数,即轨迹栏位置。】

userdata

表示默认值0。这个参数是用户传递给回调函数的数据,用来处理轨迹条事件。如果使用的第三个参数value是全局变量,完全可以不去管这个userdata参数。

  1. trackbarcallback回调流程

4. cv.getTrackbarPos() 函数说明

  1. 函数使用
代码语言:javascript复制
cv.getTrackbarPos(trackbarname, winname)
  1. 参数说明

参数

说明

trackbarname

表示轨迹栏的名称。

winname

表示轨迹栏依托窗口的名称。

5. cv.waitKey() 函数说明

  1. 函数使用
代码语言:javascript复制
cv.waitKey(delay=0)
  1. 参数说明

参数

说明

delay

表示阻塞指定毫秒数。

  1. delay 值说明

说明

0或者不填写

表示一直阻塞。

大于0

表示阻塞指定毫秒数。

  1. 注意

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

6. cv.imshow() 函数说明

  1. 函数使用
代码语言:javascript复制
cv.imshow(winname, mat)
  1. 参数说明

参数

说明

winname

表示需要显示图像的窗口名称。

mat

表示需要显示的图像。

7. 调整图像的亮度

7.1 分析
  1. RGB 表示图像的亮度;
  2. RGB 的取值范围(0,0,0)-(255,255,255);
  3. 图像像素运算可以改变 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 注意
  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 代码实现
代码语言: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. 总结

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

0 人点赞