人工智能之视觉领域 计算机视觉
第十一章 视频基础操作
文章目录
- [人工智能之视觉领域 计算机视觉](#人工智能之视觉领域 计算机视觉)
- 前言:视频基础操作
- [1. 通俗理解:视频 = 快速播放的图像序列](#1. 通俗理解:视频 = 快速播放的图像序列)
- [2. 核心组件详解](#2. 核心组件详解)
- [2.1 读取视频:`cv2.VideoCapture()`](#2.1 读取视频:
cv2.VideoCapture())- [2.2 播放视频:循环读取 + 显示](#2.2 播放视频:循环读取 + 显示)
- [2.3 保存视频:`cv2.VideoWriter()`](#2.3 保存视频:
cv2.VideoWriter())
- [📋 常见 FourCC 编码:](#📋 常见 FourCC 编码:)
- [3. 视频处理完整流程(Mermaid 图)](#3. 视频处理完整流程(Mermaid 图))
- [4. 配套代码实战](#4. 配套代码实战)
- [示例 1:播放本地视频(带信息显示)](#示例 1:播放本地视频(带信息显示))
- [示例 2:从摄像头录制并保存视频](#示例 2:从摄像头录制并保存视频)
- [示例 3:视频处理 + 保存(灰度化 + 边缘检测)](#示例 3:视频处理 + 保存(灰度化 + 边缘检测))
- [5. 常见问题与技巧](#5. 常见问题与技巧)
- [❓ 问题1:保存的视频无法播放?](#❓ 问题1:保存的视频无法播放?)
- [❓ 问题2:摄像头画面卡顿?](#❓ 问题2:摄像头画面卡顿?)
- [❓ 问题3:如何跳转到指定时间?](#❓ 问题3:如何跳转到指定时间?)
- [✅ 本章总结](#✅ 本章总结)
- 资料关注
前言:视频基础操作
学习目标:掌握使用 OpenCV 读取本地视频或摄像头、逐帧播放、处理并保存视频的基本技能,能控制播放速度,为后续视频分析(如运动检测、目标跟踪)打下坚实基础。
1. 通俗理解:视频 = 快速播放的图像序列
想象你有一本"翻页动画书":
- 每一页是一张静态图(称为 帧,Frame)
- 快速翻动 → 看起来像在动
✅ 视频 = 按时间顺序排列的一系列图像帧
- 普通视频:25~30 帧/秒(FPS)
- 高速摄影:100+ FPS
- 视频处理 = 对每一帧图像做操作(滤波、检测、标注等)
2. 核心组件详解
2.1 读取视频:cv2.VideoCapture()
python
cap = cv2.VideoCapture(source)
source 类型 |
说明 | 示例 |
|---|---|---|
整数(如 0) |
摄像头设备索引 | cv2.VideoCapture(0) → 默认摄像头 |
| 字符串 | 视频文件路径 | cv2.VideoCapture('video.mp4') |
| URL | 网络流(RTSP/HTTP) | cv2.VideoCapture('http://...') |
⚠️ 注意:路径不能含中文!建议使用英文路径。
常用属性查询(获取视频信息):
python
fps = cap.get(cv2.CAP_PROP_FPS) # 帧率
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # 宽度
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 高度
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 总帧数(文件有效)
2.2 播放视频:循环读取 + 显示
基本流程:
- 创建
VideoCapture对象 - 循环 :
- 读取一帧 →
ret, frame = cap.read() - 若成功(
ret == True),显示 →cv2.imshow() - 按键退出(如
q)
- 读取一帧 →
- 释放资源
python
while True:
ret, frame = cap.read()
if not ret:
break # 视频结束或出错
cv2.imshow('Video', frame)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
🔑 关键点 :
cv2.waitKey(delay)控制播放速度
delay=0:暂停,等待按键delay=30:约 33ms/帧 → ~30 FPS- 实际播放速度 =
max(系统处理时间, delay)
2.3 保存视频:cv2.VideoWriter()
python
out = cv2.VideoWriter(filename, fourcc, fps, (width, height))
| 参数 | 说明 |
|---|---|
filename |
输出文件名(如 'output.avi') |
fourcc |
编码格式(见下表) |
fps |
帧率(通常与输入一致) |
(width, height) |
帧尺寸(必须匹配写入的图像尺寸) |
📋 常见 FourCC 编码:
| 编码 | 说明 | 兼容性 |
|---|---|---|
'XVID' |
常用 AVI 编码 | Windows/Linux 通用 |
'MJPG' |
Motion JPEG | 文件大,但兼容性好 |
'MP4V' |
MP4 编码 | 需注意大小写(Mac/Linux 用 'mp4v') |
-1 |
弹出编码选择框(仅 Windows) | 调试用 |
💡 创建 FourCC:
pythonfourcc = cv2.VideoWriter_fourcc(*'XVID') # 推荐写法 # 或 fourcc = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
3. 视频处理完整流程(Mermaid 图)
否
是
否
是
是
否
启动 VideoCapture
是否打开成功?
报错退出
获取视频属性: FPS, 尺寸
创建 VideoWriter (可选)
循环读取帧
读取成功?
跳出循环
对帧进行处理
(如灰度化、边缘检测)
显示处理后帧
按 q 退出?
跳出循环
写入帧到 VideoWriter
释放 VideoCapture/VideoWriter
关闭所有窗口
4. 配套代码实战
示例 1:播放本地视频(带信息显示)
python
import cv2
# 打开视频文件
video_path = 'sample.mp4'
cap = cv2.VideoCapture(video_path)
# 检查是否成功打开
if not cap.isOpened():
print(f"❌ 无法打开视频文件: {video_path}")
exit()
# 获取视频信息
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print(f"🎥 视频信息:")
print(f" 尺寸: {width}x{height}")
print(f" 帧率: {fps:.2f} FPS")
print(f" 总帧数: {total_frames}")
# 播放循环
frame_id = 0
while True:
ret, frame = cap.read()
if not ret:
print("✅ 视频播放完毕")
break
frame_id += 1
# 在画面上显示帧号和时间
time_sec = frame_id / fps
cv2.putText(frame, f"Frame: {frame_id}/{total_frames}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
cv2.putText(frame, f"Time: {time_sec:.2f}s", (10, 60),
cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
cv2.imshow('Video Player', frame)
# 控制播放速度:按实际帧率延迟
if cv2.waitKey(int(1000 / fps)) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
示例 2:从摄像头录制并保存视频
python
import cv2
# 打开默认摄像头
cap = cv2.VideoCapture(0)
# 检查摄像头
if not cap.isOpened():
print("❌ 无法打开摄像头")
exit()
# 获取摄像头分辨率
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = 20.0 # 摄像头通常不返回准确 FPS,手动设定
# 创建 VideoWriter(保存为 AVI)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('recorded_video.avi', fourcc, fps, (width, height))
print("📹 按 's' 开始录制,'q' 退出")
recording = False
while True:
ret, frame = cap.read()
if not ret:
break
# 显示提示
status = "RECORDING..." if recording else "Press 's' to start"
cv2.putText(frame, status, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
cv2.imshow('Camera', frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('s'):
recording = not recording # 切换录制状态
elif key == ord('q'):
break
if recording:
out.write(frame) # 写入帧
# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
print("✅ 录制完成!视频已保存为 recorded_video.avi")
示例 3:视频处理 + 保存(灰度化 + 边缘检测)
python
import cv2
# 输入输出设置
input_video = 'input.mp4'
output_video = 'output_edge.avi'
cap = cv2.VideoCapture(input_video)
if not cap.isOpened():
print("❌ 无法打开输入视频")
exit()
# 获取属性
fps = cap.get(cv2.CAP_PROP_FPS)
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 创建输出 VideoWriter(注意:边缘图是单通道,需转回三通道才能保存!)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output_video, fourcc, fps, (width, height))
print("🔄 正在处理视频...")
while True:
ret, frame = cap.read()
if not ret:
break
# 处理:灰度 → 高斯模糊 → Canny 边缘
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(blurred, 50, 150)
# 转回三通道(BGR)以便保存
edges_color = cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR)
# 写入输出视频
out.write(edges_color)
# 可选:实时预览
cv2.imshow('Processing...', edges)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放
cap.release()
out.release()
cv2.destroyAllWindows()
print(f"✅ 处理完成!结果已保存为 {output_video}")
5. 常见问题与技巧
❓ 问题1:保存的视频无法播放?
✅ 检查:
- 编码器是否安装(如 XVID)
- 帧尺寸是否与
VideoWriter初始化一致 - 是否调用了
out.write()和out.release()
❓ 问题2:摄像头画面卡顿?
✅ 解决:
- 降低分辨率:
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) - 使用更快的处理算法
- 确保
waitKey延迟合理
❓ 问题3:如何跳转到指定时间?
✅ 使用 set():
python
# 跳转到第 10 秒
cap.set(cv2.CAP_PROP_POS_MSEC, 10000)
# 或跳转到第 100 帧
cap.set(cv2.CAP_PROP_POS_FRAMES, 100)
✅ 本章总结
| 操作 | 核心函数 | 关键参数 |
|---|---|---|
| 读取视频 | cv2.VideoCapture() |
文件路径 / 摄像头ID |
| 读取帧 | cap.read() |
返回 (ret, frame) |
| 显示帧 | cv2.imshow() + cv2.waitKey() |
控制播放速度 |
| 保存视频 | cv2.VideoWriter() |
编码、FPS、尺寸 |
| 释放资源 | cap.release(), out.release() |
必须调用! |
🌟 你现在可以:
- 播放任何本地视频文件
- 用笔记本摄像头录制自己的视频
- 对视频做实时滤镜(美颜、边缘、二值化等)
- 保存处理后的视频用于分享或分析!
资料关注
公众号:咚咚王
gitee:https://gitee.com/wy18585051844/ai_learning
《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》