6.3 写数据 vw.write
vw.write
用法:
vw.write(frame)
参数说明:
ret, frame = cap.read()
将读取到的视频帧,再通过vw.write(frame)
将数据写入多媒体文件。
6.4 释放资源 vw.release
vw.release
用法:
vw.release()
完成工作后释放所有内容(释放VideoCapture、释放VideoWriter、销毁窗口)。
6.5 代码实现
import cv2 # 创建VideoWriter为写多媒体文件 fourcc = cv2.VideoWriter_fourcc(*'DIVX') vw = cv2.VideoWriter('../resource/out.avi', fourcc, 25, (640, 480)) cv2.namedWindow('video', cv2.WINDOW_NORMAL) # 创建窗口 cv2.resizeWindow('video', 640, 360) # 修改窗口尺寸 cap = cv2.VideoCapture(0) # 获取视频设备 while True: # 从摄像头读视频帧 ret, frame = cap.read() # 将视频帧在窗口显示 cv2.imshow('video', frame) # 写数据到多媒体文件 vw.write(frame) # 等待键盘事件,如果为q,退出 key = cv2.waitKey(1000 // 30) if key & 0xFF == ord('q'): break cap.release() # 释放VideoCapture vw.release() # 释放VideoWriter cv2.destroyAllWindows() # 销毁窗口
6.6 代码优化
1、使用 isOpened() 判断摄像头是否已打开?
while cap.isOpened():
判断摄像头是否为打开状态
2、采集数据时要判断数据是否获取到了?
if ret == True: ... else: break
3、优化后代码
import cv2 # 创建VideoWriter为写多媒体文件 fourcc = cv2.VideoWriter_fourcc(*'DIVX') vw = cv2.VideoWriter('../resource/out.avi', fourcc, 25, (640, 480)) 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) # 写数据到多媒体文件 vw.write(frame) # 等待键盘事件,如果为q,退出 key = cv2.waitKey(1000 // 30) if key & 0xFF == ord('q'): break else: break cap.release() # 释放VideoCapture vw.release() # 释放VideoWriter cv2.destroyAllWindows() # 销毁窗口
7、鼠标控制
7.1 设置鼠标回调 setMouseCallback()
setMouseCallback()
用法:
cv2.setMouseCallback(winname, callback, userdata)
参数说明:
- winname:窗口名称
- callback:鼠标事件的回调函数
- userdata:传递给回调函数的可选参数(默认为None)
7.2 回调函数 callback()
callback()
用法:
callback(event, x, y, flags, userdata)
参数说明:
- event:鼠标事件(鼠标移动、左键、右键…)
- x, y:鼠标所在坐标点
- flags:鼠标键及组合键
- userdata:传递给回调函数的可选参数(默认为None)
event类型如下表所示:
event | 值 | 描述 |
EVENT_MOUSEMOVE | 0 | 鼠标移动 |
EVENT_LBUTTONDOWN | 1 | 按下鼠标左键 |
EVENT_RBUTTONDOWN | 2 | 按下鼠标右键 |
EVENT_MBUTTONDOWN | 3 | 按下鼠标中键 |
EVENT_LBUTTONUP | 4 | 左键释放 |
EVENT_RBUTTONUP | 5 | 右键释放 |
EVENT_MBUTTONUP | 6 | 中键释放 |
EVENT_LBUTTONDBLCLK | 7 | 左键双击 |
EVENT_RBUTTONDBLCLK | 8 | 右键双击 |
EVENT_MBUTTONDBLCLK | 9 | 中键双击 |
EVENT_MOUSEWHEEL | 10 | 鼠标滚轮上下移动 |
EVENT_MOUSEHWHEEL | 11 | 鼠标滚轮左右移动 |
flags类型如下表所示:
flags | 值 | 描述 |
EVENT_FLAG_LBUTTON | 1 | 按下左键 |
EVENT_FLAG_RBUTTON | 2 | 按下右键 |
EVENT_FLAG_MBUTTON | 4 | 按下中键 |
EVENT_FLAG_CRTLKEY | 8 | 按下CTRL键 |
EVENT_FLAG_SHIFTKEY | 16 | 按下SHIFT键 |
EVENT_FLAG_ALTKEY | 32 | 按下ALT键 |
7.3 设置背景 np.zeros()
np.zeros()
用法:
img = np.zeros(shape, dtype)
参数说明:
- shape:创建新数组的形状(维度),与显示窗口相反。
- dtype:数据类型
7.4 代码实现
import cv2 import numpy as np # 设置鼠标回调函数 def callback(event, x, y, flags, userdata): print(event, x, y, flags, userdata) # 创建、修改窗口 cv2.namedWindow('mouse_callback', cv2.WINDOW_NORMAL) cv2.resizeWindow('mouse_callback', 640, 360) # 设置鼠标回调 cv2.setMouseCallback('mouse_callback', callback, 'userdata') # 显示窗口和背景 img = np.zeros((360, 640, 3), np.uint8) while True: cv2.imshow('mouse_callback', img) key = cv2.waitKey(0) if key & 0xFF == ord('q'): break # 销毁窗口 cv2.destroyAllWindows()
8、TrackBar控件
8.1 创建TrackBar控件 createTrackbar()
createTrackbar()
用法:
cv2.createTrackbar(trackbarName, windowName, value, count, onChange)
参数说明:
- trackbarName:轨迹条名
- windowName:窗口名
- value:滑块初始位置
- count:滑块达到最大位置的值(最小值为0,最大值为count)
- onChange:默认值为0,指回调函数
- userdate:默认值为0,用户传递给回调函数的数据值
8.2 获取当前TrackBar值 getTrackbarPos()
getTrackbarPos()
用法:
cv2.getTrackbarPos(trackbarName, windowName)
参数说明:
- trackbarName:轨迹条名
- windowName:窗口名
8.3 代码实现
import cv2 import numpy as np # 定义回调函数 def callback(value): print(value) # 创建窗口 cv2.namedWindow('TrackBar', cv2.WINDOW_NORMAL) # 创建trackbar cv2.createTrackbar('R', 'TrackBar', 0, 255, callback) cv2.createTrackbar('G', 'TrackBar', 0, 255, callback) cv2.createTrackbar('B', 'TrackBar', 0, 255, callback) # 设置纯黑色背景图片(640 * 480) img = np.zeros((480, 640, 3), np.uint8) while True: # 获取当前TrackBar值 r = cv2.getTrackbarPos('R', 'TrackBar') g = cv2.getTrackbarPos('G', 'TrackBar') b = cv2.getTrackbarPos('B', 'TrackBar') # 改变背景图片颜色 img[:] = [b, g, r] # 显示 cv2.imshow('TrackBar', img) key = cv2.waitKey(10) if key & 0xFF == ord('q'): break cv2.destroyAllWindows()