写点什么

『OpenCV-Python』视频的读取和保存

作者:德育处主任
  • 2024-11-22
    广东
  • 本文字数:2321 字

    阅读完需:约 8 分钟

点赞 + 关注 + 收藏 = 学会了


上一讲介绍了 OpenCV 的读取图片的方法,这一讲简单聊聊 OpenCV 读取和保存视频。


视频的来源主要有 2 种,一种是本地视频文件,另一种是实时视频流,比如手机和电脑的摄像头。


要读取这两种视频的方法都是一样的,只是传的参数不同而已。

读取摄像头视频

读取摄像头的内容并显示出来需要几步


  1. 获取摄像头内容

  2. 逐帧渲染



import cv2
cap = cv2.VideoCapture(0)
while cap.isOpened(): # 获取一帧 ret, frame = cap.read()
if not ret: print("找不到摄像头") break # 如果读取失败(如视频结束),退出循环
cv2.imshow('frame', frame) if cv2.waitKey(1) == ord('q'): break
# 释放摄像头资源并关闭所有窗口cap.release()cv2.destroyAllWindows()
复制代码


解读一下上面的代码。


  • 通过 cv2.VideoCapture(0) 读取视频,传入参数 0 表示打开默认摄像头。对于有多个摄像头的设备,可以使用 1、2 等参数指定其他摄像头。

  • 使用 cap.isOpened() 检查摄像头是否成功打开。如果失败,程序将退出。

  • cap.read() 可以读取视频里的 1 帧,ret 表示读取是否成功,frame 包含图像数据。

  • 1 帧只有 1 个画面,所以通过 while 循环不断读取视频流的内容。

  • cv2.waitKey(1) 设置为 1 毫秒的延时,这样可以实现几乎实时的显示效果。

  • 最后通过 cv2.waitKey(1) == ord('q') 判断用户有没有按下“q”键,如果按下了就退出循环,然后关闭所有窗口释放资源。

读取本地视频文件

读取本地视频文件的操作流程和读取摄像头视频流差不多,最主要的区别是 cv2.waitKey() 里需要传入的数值。



import cv2
input_video_path = "./01.mov" # 输入视频路径cap = cv2.VideoCapture(input_video_path)
while cap.isOpened(): # 获取一帧 ret, frame = cap.read()
if not ret: print("找不到视频") break # 如果读取失败(如视频结束),退出循环
cv2.imshow('frame', frame) if cv2.waitKey(30) == ord('q'): break
# 释放摄像头资源并关闭所有窗口cap.release()cv2.destroyAllWindows()
复制代码


  • input_video_path 存放本地视频的文件地址,需要包含文件类型的后缀名。

  • 把视频地址丢进 cv2.VideoCapture() 里就可以读取到这个视频了。

  • while 里的操作和前面读取摄像头视频流一样,唯一区别是 cv2.waitKey(30) ,这里我传入了 30,这表示每一帧的显示时间是 30 毫秒,这样视频播放速度就比较正常。

保存视频

不管是将摄像头的视频保存到本地,还是在本地视频增加一点滤镜再保存到本地,操作都是一样的。


主要有以下几步操作:


  1. 获取视频源

  2. 设置要输出的视频路径、参数(宽、高、帧率)

  3. 逐帧保存视频


举个例子,我要将一个彩色的视频转成黑白视频再保存到本地。



import cv2
# 指定本地视频路径和输出路径input_video_path = "01.mov" # 输入视频路径output_video_path = "01_gray.mp4" # 输出灰度视频路径
# 打开输入视频文件cap = cv2.VideoCapture(input_video_path)
# 检查视频是否成功打开if not cap.isOpened(): print("Error: Could not open video.") exit()
# 获取原视频的宽度、高度和帧率frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))fps = int(cap.get(cv2.CAP_PROP_FPS))
# 创建 VideoWriter 对象,用于保存灰度视频fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 视频编码格式out = cv2.VideoWriter(output_video_path, fourcc, fps, (frame_width, frame_height), isColor=False)
# 逐帧读取视频、转换为灰度并保存while cap.isOpened(): ret, frame = cap.read() if not ret: break
# 将帧转换为灰度图像 gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 保存灰度帧到输出视频 out.write(gray_frame)
# 显示灰度帧(可选) cv2.imshow("Gray Video", gray_frame) # 设置退出条件:按下 'q' 键退出 if cv2.waitKey(1) & 0xFF == ord('q'): break
# 释放视频资源并关闭所有窗口cap.release()cv2.destroyAllWindows()
复制代码


说明一下上面的代码。


  • 读取视频:cv2.VideoCapture(input_video_path) 用于读取视频文件。

  • 获取视频属性:如帧宽度、高度和帧率等,用于配置输出视频。

  • 创建输出视频:cv2.VideoWriter(filename, fourcc, fps, frameSize, isColor) 用于创建保存视频的对象。

  • cv2.VideoWriteroutput_video_path 参数用来指定保存视频文件的路径。

  • fourcc 表示视频编码格式的四字符代码,常用的格式有:

  • cv2.VideoWriter_fourcc(*'XVID'): 常用于 .avi 格式的视频,跨平台兼容性较好。

  • cv2.VideoWriter_fourcc(*'MJPG'): 使用 Motion JPEG 编码,也可以用于 .avi 格式。

  • cv2.VideoWriter_fourcc(*'mp4v'): 常用于 .mp4 格式的视频。

  • cv2.VideoWriter_fourcc(*'DIVX'): 支持 .avi 格式。

  • fps 表示视频的帧率,即每秒帧数(Frames Per Second)。帧率决定视频的播放速度和流畅度。常用的帧率数值有 24、30、60。在上面的例子中使用的是原视频的帧率。

  • frameSize 用于设置输出视频帧的宽度和高度,单位是像素。

  • isColor 指示视频是否是彩色。默认是 True 表示才是。

  • 循环读取和保存帧:每一帧读取后可以对帧进行处理,然后写入到输出视频中。

  • 释放资源:处理完成后释放资源,确保文件保存正确。


推荐关注 《OpenCV-Python专栏》



以上就是本文的全部内容。加上上一篇介绍如何读取和保存图片,学习 OpenCV 需要的“材料”已经准备好了。接下来几讲都是介绍 OpenCV 的基础用法,也就是学习“如何加工这些材料”。基础扎实后再讲解几个实战案例。


点赞 + 关注 + 收藏 = 学会了

发布于: 刚刚阅读数: 4
用户头像

反派 2019-03-19 加入

用键盘绣花

评论

发布
暂无评论
『OpenCV-Python』视频的读取和保存_OpenCV_德育处主任_InfoQ写作社区