人工智能之视觉领域 计算机视觉 第十一章 视频基础操作

人工智能之视觉领域 计算机视觉

第十一章 视频基础操作


文章目录

  • [人工智能之视觉领域 计算机视觉](#人工智能之视觉领域 计算机视觉)
  • 前言:视频基础操作
    • [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 播放视频:循环读取 + 显示

基本流程:

  1. 创建 VideoCapture 对象
  2. 循环
    • 读取一帧 → ret, frame = cap.read()
    • 若成功(ret == True),显示 → cv2.imshow()
    • 按键退出(如 q
  3. 释放资源
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

python 复制代码
fourcc = 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》

相关推荐
狮子座明仔2 小时前
Chain of Mindset:让AI学会像人一样“切换脑回路“
人工智能
CoderJia程序员甲2 小时前
GitHub 热榜项目 - 日榜(2026-02-20)
人工智能·ai·大模型·github·ai教程
weixin_444579302 小时前
西湖大学强化学习第二讲——贝尔曼公式(Bellman equation)
人工智能
啊阿狸不会拉杆2 小时前
《计算机视觉:模型、学习和推理》第 3 章-常用概率分布
人工智能·python·学习·机器学习·计算机视觉·正态分布·概率分布
肾透侧视攻城狮2 小时前
《TensorFlow文本分类系统解析:从IMDB数据到智能模型实战》
人工智能·深度学习·tensorfl文本分类项目·imdb电影评论数据集·模型架构/编译·训练过程/训练结果可视化·评估测试集性能
jay神3 小时前
基于深度学习的无人机航拍小目标检测算法研究
人工智能·深度学习·目标检测·计算机视觉·毕业设计
木枷4 小时前
Training Software Engineering Agents and Verifiers with SWE-Gym
人工智能·软件工程
jz_ddk9 小时前
[数学基础] 浅尝向量与张量
人工智能·机器学习·向量·张量
孔明兴汉10 小时前
大模型 ai coding 比较
人工智能