目录
前言
- 视频是由图片组成的, 视频的每一帧就是一幅图片, 一般是30帧, 表示一秒显示30张图片. - cv2.VideoCapture可以捕获摄像头, 用数字来表示不同的设备, 比如0, 1 - 如果是视频文件, 可以直接指定路径即可.
通过路径获取视频内容
获取视频内容
vc = cv2.VideoCapture(path)
检查是否正确打开
vc.isOpened() # 可以读到内容返回True
循环播放
播放视频就是不停的换图像帧,即循环调用 vc.read() 和 cv2.imshow()
完整代码
import cv2
# 打开视频文件
def open_video(path):
vc = cv2.VideoCapture(path)
ret = vc.isOpened() # 可以读到内容返回True
# 检查是否正确打开
if ret:
print("视频打开成功")
else:
print("视频打开失败")
return -1
print(f"开始播放视频: {path.split('/').pop()},按esc键退出")
# 循环读帧播放视频
while ret:
# 可以读到内容ret返回True
ret, frame = vc.read()
# 读到最后frame就是空
if frame is None:
print("视频播放完毕")
break
if ret:
cv2.imshow('{}'.format(path).split('/').pop(), frame)
# 0xFF == 27表示按esc退出键会退出
if cv2.waitKey(33) & 0xFF == 27:
break
# 释放视频对象
vc.release()
# 关闭窗口
cv2.destroyAllWindows()
open_video("videos/1.mp4")
从摄像头读取视频数据
获取视频设备
cap = cv2.VideoCapture(0)
其他与直接读取视频一致
完整实例
python
import cv2
# 从摄像头一直读取数据
def camera():
# 获取视频设备
cap = cv2.VideoCapture(0)
print("获取视频设备成功")
ret = cap.isOpened()
# 创建窗口
cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)
print("成功创建窗口")
print("开始播放来自摄像头的视频,按esc键退出)
while ret:
# 从摄像头读取视频
ret, frame = cap.read()
# 将视频帧放在窗口中显示
cv2.imshow('video', frame)
# 等待键盘事件, 按esc键会退出
if cv2.waitKey(33) & 0xFF == 27:
break
# 释放摄像头
cap.release()
print("摄像头已关闭")
# 关闭窗口
cv2.destroyAllWindows()
camera()
录制视频
- VideoWriter : 参数一为输出文件, 参数二为多媒体文件格式(VideoWriter_fourcc), 参数三为帧率, 参数四为分辨率. - write 编码并写入缓存 - release 缓存内容写入磁盘, 并释放资源
用于创建视频编解码器的四字符码(FourCC)
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
cv2.VideoWriter()
vm = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480))
'output.mp4' 是输出视频文件的名称,fourcc 是所选的视频编码器,20 是帧率,(640, 480) 是视频的分辨率。
将视频帧逐帧写入视频文件
vw.write(frame)
完整示例
python
import cv2
# 录制视频
def record_video():
# 获取视频设备
cap = cv2.VideoCapture(1)
print("获取视频设备成功")
# *mp4v就是解包操作 等同于 'm', 'p', '4', 'v'
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 用于创建视频编解码器的四字符码(FourCC)。
# (640, 480)表示摄像头拍视频, 这个大小搞错了也不行,主要是这个分辨率.
vw = cv2.VideoWriter('output.mp4', fourcc, 20, (640, 480))
# 'output.mp4' 是输出视频文件的名称,fourcc 是所选的视频编码器,20 是帧率,(640, 480) 是视频的分辨率。
print("开始录制来自摄像头的视频,按esc键退出")
# 循环存帧录制视频
while cap.isOpened():
ret, frame = cap.read()
if not ret:
print('没有接收到图像')
break
vw.write(frame) # 将视频帧逐帧写入视频文件。
cv2.imshow('frame', frame) # 显示录制的帧
if cv2.waitKey(33) & 0xFF == 27:
break
# 释放摄像头
cap.release()
print("摄像头已关闭")
record_video()