0%

OpenCV(二)-图像视频的加载与显示

一、课程题目

  • 车辆检测
    • 窗口的展示
    • 图像/视频的加载
    • 基本图形的绘制
    • 车辆识别

二、创建显示窗口

  • namedWindow() 窗口命名
  • imshow() 显示窗口
  • destroyAllWindows() 销毁窗口
  • resizeWindow
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import cv2  # 导入 OpenCV 库

# 创建一个名为 'new' 的窗口,并设置窗口模式为可调节大小
cv2.namedWindow('new', cv2.WINDOW_NORMAL)

# 将窗口 'new' 的大小调整为 640x480 像素
cv2.resizeWindow('new', 640, 480)

# 显示内容在窗口 'new' 中,这里的参数 0 实际上是不合适的,通常应传入一张图像或一个数组
cv2.imshow('new', 0)

# 等待用户按键,直到有按键按下时才继续执行。返回值是按键的 ASCII 码
key = cv2.waitKey(0)

# 检查按键是否为 'q'
if (key == ord('q')):
# 关闭所有创建的窗口,释放资源
cv2.destroyAllWindows()

三、加载图片

  • imread
    • im 是image的缩写
    • imread(path, flag)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import cv2

cv2.namedWindow('3.3_image', cv2.WINDOW_NORMAL)
img = cv2.imread('D:/0.jpg')

cv2.imshow('3.3_image', img)

key = cv2.waitKey(0)
print(key)
print('q')
print(ord('q'))
# waitKey返回值是16位,取最后8位
if (key & 0xFF == ord('q')):
print(11111)
# 获取q键,直接释放资源
cv2.destroyAllWindows()

四、保存文件

  • imwrite(name, img)
    • name 要保存的文件名
    • img 是Mat类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import cv2

cv2.namedWindow('3.3_image', cv2.WINDOW_NORMAL)
img = cv2.imread('D:/0.jpg')

while True:
cv2.imshow('3.3_image', img)

key = cv2.waitKey(0)

# waitKey返回值是16位,取最后8位
if (key & 0xFF == ord('q')):
print(123)
break
elif (key & 0xFF == ord('s')):
print('sss')
# 当用户点击s时,保存为1.jpg
cv2.imwrite('D:\\1.jpg', img)
else:
print('other')
cv2.destroyAllWindows()

五、从摄像头采集视频

  • VideoCapure()虚拟的采集器
    • cap.read() 获取摄像头采集的视频帧
      • 返回两个值
      • 第一个为状态值,读到桢为true
      • 第二个值为视频帧
    • cap.release() 释放资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import cv2

cv2.namedWindow('video', cv2.WINDOW_AUTOSIZE)

# 获取视频设备
cap = cv2.VideoCapture(0) # 默认设备

while True:
# 从摄像头读视频帧
ret, frame = cap.read()

# 将视频帧在窗口显示
cv2.imshow('video', frame)

# 等待键盘事件,如果为‘q’,退出
key = cv2.waitKey(10)
if (key & 0xFF == ord('q')):
break

# 释放VideoCapture
cap.release()
cv2.destroyAllWindows()

六、从多媒体文件中读取视频帧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import cv2

cv2.namedWindow('video', cv2.WINDOW_AUTOSIZE)

# 获取视频设备
# cap = cv2.VideoCapture(0) # 默认设备
# 获取视频文件,从视频文件中读取视频帧
cap = cv2.VideoCapture("C:\\Program Files (x86)\\DingDing\\main\\current\\plugins\\tblive\\data\\conf_res\\background_res\\01.mp4")

while True:
# 从摄像头读视频帧
ret, frame = cap.read()

# 将视频帧在窗口显示
cv2.imshow('video', frame)

# 等待键盘事件,如果为‘q’,退出
key = cv2.waitKey(10)
if (key & 0xFF == ord('q')):
break

# 释放VideoCapture
cap.release()
cv2.destroyAllWindows()

七、将视频数据录制成多媒体文件

image-20240827105310872

  • VideoWriter
    • 参数一为输出文件
    • 参数二为多媒体文件格式(VideoWriter_fourcc)
    • 参数三为帧率
    • 参数四位分辨率大小
  • write
  • release
    • 先从数据到缓存,再从缓存到磁盘
    • 释放资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import cv2

# 创建VideoWriter对象
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
# 最后一个参数是摄像头采集的分辨率,如果不对,不会写入
vw = cv2.VideoWriter('./out.mp4', fourcc, 25, (1280, 720))

cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 360)

# 获取视频设备
cap = cv2.VideoCapture(0) # 默认设备

# 判断摄像头是否为打开状态
while cap.isOpened():
# 从摄像头读视频帧
ret, frame = cap.read()

if ret == True:
# 将视频帧在窗口显示
cv2.imshow('video', frame)
# 重新将窗口设置为指定大小
cv2.resizeWindow('video', 640, 360)

# 写数据到多媒体文件
vw.write(frame)

# 等待键盘事件,如果为‘q’,退出
key = cv2.waitKey(10)
if (key & 0xFF == ord('q')):
break
else:
break

# 释放VideoCapture
cap.release()
vw.release()
cv2.destroyAllWindows()

八、控制鼠标

设置鼠标回调函数

  • setMouseCallback(winname, callback, userdata)
  • callback(event, x, y, flags, userdata)
    • event:鼠标一定、按下左键、放下左键……
    • x, y: 鼠标坐标
    • flags:鼠标键及组合键
    • event和flag参数的定义在modules/highgui/include/opencv2/highgui.hpp中
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import cv2
import numpy as np

# 鼠标回调函数
def mouse_callback(event, x, y, flags, userdata):
print(event, x, y, flags, userdata)

# mouse_callback(1, 100, 100, 16, "666")

# 创建窗口
cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
cv2.resizeWindow('mouse', 640, 360)

# 设置鼠标回调
cv2.setMouseCallback('mouse', mouse_callback, "123")

# 显示窗口和背景
img = np.zeros((360, 640, 3), np.uint8)
while True:
cv2.imshow('mouse', img)
key = cv2.waitKey(1)
if key & 0xFF == ord('q'):
break

cv2.destroyAllWindows()

九、TrackBar控件

image-20240827131505857

  • createTrackbar
    • trackbarname, winname
    • value: trackbar 当前值
    • count: 最小值为0,最大值为count
    • callback, userdata
  • getTrackBarPos
    • 输入参数:trackbarname
    • 输入参数:winname
    • 输出:当前值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import cv2
import numpy as np

def callback():
pass # Trackbar的回调函数,这里不做任何操作

# 创建窗口
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar', 640, 480)

# 创建trackbar
cv2.createTrackbar('R', 'trackbar', 0, 255, callback)
cv2.createTrackbar('G', 'trackbar', 0, 255, callback)
cv2.createTrackbar('B', 'trackbar', 0, 255, callback)

# 创建一个背景图片
img = np.zeros((640, 480, 3), np.uint8)

while True:
# 获取当前Trackbar的值
r = cv2.getTrackbarPos('R', 'trackbar') # 获取红色通道的值
g = cv2.getTrackbarPos('G', 'trackbar') # 获取绿色通道的值
b = cv2.getTrackbarPos('B', 'trackbar') # 获取蓝色通道的值

# 更新背景图像的颜色,使用从Trackbar获取的RGB值
img[:] = [b, g, r] # 设置图片的颜色,注意OpenCV中颜色的顺序是BGR

# 在窗口中显示图像
cv2.imshow('trackbar', img)

# 等待按键事件,如果按下'q'键则退出循环
key = cv2.waitKey(10)
if key & 0xFF == ord('q'):
break

# 关闭所有窗口
cv2.destroyAllWindows()

image-20240827133754530

-------------本文结束感谢您的阅读-------------