- 作者:老汪软件技巧
- 发表时间:2024-11-13 10:03
- 浏览量:
上一讲介绍了 OpenCV 的读取图片的方法,这一讲简单聊聊 OpenCV 读取和保存视频。
视频的来源主要有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.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()
保存视频
不管是将摄像头的视频保存到本地,还是在本地视频增加一点滤镜再保存到本地,操作都是一样的。
主要有以下几步操作:
获取视频源设置要输出的视频路径、参数(宽、高、帧率)逐帧保存视频
举个例子,我要将一个彩色的视频转成黑白视频再保存到本地。
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()
说明一下上面的代码。
fps 表示视频的帧率,即每秒帧数(Frames Per Second)。帧率决定视频的播放速度和流畅度。常用的帧率数值有24、30、60。在上面的例子中使用的是原视频的帧率。frameSize 用于设置输出视频帧的宽度和高度,单位是像素。isColor 指示视频是否是彩色。默认是 True 表示才是。循环读取和保存帧:每一帧读取后可以对帧进行处理,然后写入到输出视频中。释放资源:处理完成后释放资源,确保文件保存正确。
以上就是本文的全部内容。加上上一篇介绍如何读取和保存图片,学习 OpenCV 需要的“材料”已经准备好了。接下来几讲都是介绍 OpenCV 的基础用法,也就是学习“如何加工这些材料”。基础扎实后再讲解几个实战案例。