1. 视频读取与帧提取
任务目标
使用OpenCV读取本地视频文件,逐帧提取图像并实时显示,同时支持空格键暂停/继续、ESC键退出播放。通过本案例掌握VideoCapture的基本读取流程与帧循环控制逻辑。
环境依赖
- Python 3.7+
- OpenCV:
pip install opencv-python - 测试视频:任意本地视频文件(如
test.mp4),或使用下方代码自动生成的示例视频
关键完整代码
import cv2
def play_video(video_path):
"""读取视频文件并逐帧显示,支持播放控制"""
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
print(f"错误:无法打开视频文件 {video_path}")
return
paused = False
while True:
if not paused:
ret, frame = cap.read()
if not ret:
print("视频播放完毕")
break
cv2.imshow("Video Player", frame)
key = cv2.waitKey(30) & 0xFF
if key == 27: # ESC键退出
break
elif key == 32: # 空格键暂停/继续
paused = not paused
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
# 若没有测试视频,可先运行以下代码生成一个示例视频
# 生成10秒、30fps、640x480的随机噪声视频
import numpy as np
out = cv2.VideoWriter("test.mp4", cv2.VideoWriter_fourcc(*"mp4v"), 30, (640, 480))
for _ in range(300):
frame = np.random.randint(0, 256, (480, 640, 3), dtype=np.uint8)
out.write(frame)
out.release()
print("示例视频 test.mp4 已生成")
play_video("test.mp4")
运行方式
- 将上述代码保存为
video_player.py。 - 确保当前目录下有视频文件
test.mp4(代码首次运行会自动生成一个随机噪声示例视频)。 - 执行命令:
python video_player.py。
验证方法
- 正常播放:程序启动后弹出标题为"Video Player"的窗口,画面持续更新(示例视频为彩色噪点动态变化)。
- 暂停功能:按下空格键,画面冻结在当前帧;再次按空格键恢复播放。
- 退出功能:按下ESC键,窗口关闭,程序正常结束,终端无报错。
- 播放结束:视频播放至最后一帧后,终端输出"视频播放完毕",窗口自动关闭。
常见问题
- 视频无法打开:检查文件路径是否正确,或视频编码是否为OpenCV支持的格式(推荐MP4/H264)。
- 播放速度异常:
waitKey(30)中的30表示每帧间隔约30ms(约33fps),若视频帧率不同可调整该值匹配实际帧率。 - 窗口无响应:确保在循环中调用了
cv2.waitKey(),否则窗口无法处理键盘事件。