视频基础操作
1.1. 例子
读取mp4格式的视频,将每一帧改为灰度图,并且打上水印(“WaterMark”),并将其输出保存为out.mp4,在这个例子中可以看到视频读取,每帧数据处理,视频保存的整体流程简单示例
import cv2
try:
cap=cv2.VideoCapture("CatCloth.mp4")
if not cap.isOpened():
print("Video can't be opened")
raise IOError
# 获取视频的宽度、高度和帧率
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
delay=int(1000/(fps)) #计算每帧视频播放延时
# 创建 VideoWriter 对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
output_path="OutPut.mp4"
out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
while True:
ret,frame=cap.read() #读取一帧数据
if not ret:
break
#对每一帧图像进行处理
# 转换为灰度图像
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 打上水印
cv2.putText(gray_frame, "WaterMark", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
# 写入输出文件
out.write(gray_frame)
# 显示处理后的帧
cv2.imshow("Processed Video", gray_frame)
#此处延迟FPS计算出来的时间,按照视频原有速度播放视频 按q键退出
if(cv2.waitKey(delay)&0xff==ord('q')):
break
# 释放 VideoCapture 和 VideoWriter 对象及所有窗口资源
cap.release()
out.release()
cv2.destroyAllWindows()
except IOError as e:
print(f'IOError:{e}')
except Exception as e:
print(f"Error: {e}")
1.2. 常见操作补充说明
1.2.1. 读取视频文件或摄像头
使用 cv2.VideoCapture()
可以读取视频文件或摄像头。
cv2.VideoCapture
是一个用于捕获视频的类,可以从视频文件、摄像头或网络视频流中读取视频帧。它的构造函数和方法支持多种参数和重载形式,以便灵活地处理不同的视频源。
- 默认构造函数:
cap = cv2.VideoCapture()
-
- 创建一个空的
VideoCapture
对象,通常用于后续调用open()
方法打开视频源。
- 创建一个空的
- 从视频文件或摄像头打开:
cap = cv2.VideoCapture(filename, apiPreference=CAP_ANY)
-
filename
:视频文件路径或摄像头索引(整数,如0
表示默认摄像头)。apiPreference
:指定使用的后端 API(如cv2.CAP_ANY
、cv2.CAP_FFMPEG
等)。默认值为cv2.CAP_ANY
,表示自动选择合适的后端。
- 从视频文件或摄像头打开(带参数):
cap = cv2.VideoCapture(filename, apiPreference, params)
-
params
:一个参数列表,用于指定额外的配置(如分辨率、帧率等)。参数以(paramId, paramValue)
的形式传递。
常用参数解释:
filename
:
-
- 可以是视频文件路径(如
'video.mp4'
)。 - 可以是摄像头索引(如
0
)。 - 可以是网络视频流的 URL(如
'http://192.168.1.100:8080/video'
)。
- 可以是视频文件路径(如
apiPreference
:
-
- 指定使用的后端 API,例如:
-
-
cv2.CAP_ANY
:自动选择后端。cv2.CAP_FFMPEG
:使用 FFmpeg 后端。cv2.CAP_MSMF
:使用 Microsoft Media Foundation 后端(Windows)。cv2.CAP_V4L
:使用 Video4Linux 后端(Linux)。
-
params
:
-
- 一个参数列表,用于指定额外的配置。例如:
-
-
cv2.CAP_PROP_FRAME_WIDTH
:设置帧宽度。cv2.CAP_PROP_FRAME_HEIGHT
:设置帧高度。cv2.CAP_PROP_FPS
:设置帧率。
-
# 读取视频文件 自动选择后端,且无其他设置
cap = cv2.VideoCapture("example.mp4")
# 读取摄像头
# cap = cv2.VideoCapture(0) # 默认摄像头(索引0)
#检查视频是否正确读取
if not cap.isOpened():
print("Video can't be opened")
return
1.2.2. 获取视频属性
可以通过 cap.get()
获取视频的各种属性,例如宽度、高度、帧率等。
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) # 帧宽
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # 帧高
fps = cap.get(cv2.CAP_PROP_FPS) # 帧率
print(f"Width: {width}, Height: {height}, FPS: {fps}")
1.2.3. 逐帧读取视频
通过循环逐帧读取视频,并处理每一帧。
while cap.isOpened():
ret, frame = cap.read() # 读取一帧
if not ret:
break # 视频结束
#
# 显示当前帧
cv2.imshow("Frame", frame)
# 按下 'q' 键退出
if cv2.waitKey(25) & 0xFF == ord('q'):
break
cap.release() # 释放视频流
cv2.destroyAllWindows()
1.2.4. 保存视频
使用 cv2.VideoWriter()
可以将处理后的视频保存为文件。
cv2.VideoWriter()
是 OpenCV 库中用于创建视频写入对象的函数,可以将一组图像帧保存为视频文件。
#函数参数介绍
cv.VideoWriter(filename, fourcc, fps, frameSize[, isColor])
参数介绍:
- filename (str): 输出视频文件的路径。
- fourcc (int): 指定编码器的四字符代码(FourCC)。
-
- 例如:
- - FFmpeg 使用:
-
-
-
cv2.VideoWriter_fourcc(*'mp4v')
cv2.VideoWriter_fourcc(*'XVID')
。
-
-
-
- Windows 开发版 上编译的 OpenCV 使用
-
-
cv2.VideoWriter_fourcc(*'MJPG')
。
-
- fps (float): 视频的帧率(每秒帧数)。
- frameSize (tuple): 视频帧的尺寸(宽,高)。
- isColor (bool, optional): 指示视频是否为彩色。默认为
True
(彩色)。如果设置为False
,输出视频将为灰度。
# 设置视频编码器和帧率
fourcc = cv2.VideoWriter_fourcc(*'XVID') # 使用 XVID 编码器
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) # 文件名、编码器、帧率、尺寸
# 写入帧
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
out.write(frame) # 写入帧
cv2.imshow("Frame", frame)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
cap.release()
out.release() # 关闭视频写入
cv2.destroyAllWindows()