第九部分、视频读写
- 第一节、视频读写处理
- 1.视频标准与格式
- 2.视频读写与函数
- 3.代码练习与测试
- 学习参考
第一节、视频读写处理
1.视频标准与格式
视频标准与格式:
- SD(Standard Definition)标清480P
- HD(High Definition)高清720P/1080P
- UHD(Ultra High Definition)超高清4K/2160P
分辨率表示
- SD-640x480, 704x480, 720x480, 848x480等
- HD-960x720,1280x720,1440x1080,1920x1080
- UHD-4K,2160P
图片压缩的时候清晰度选取越高,所占内存也越大。
2.视频读写与函数
- filename表示视频文件
- Index表示USB摄像头或者web camera的索引,index = 0表示电脑自带的摄像头
- apiPreference = CAP_ANY意思自动决定第三方视频库如: cv.CAP_FFMPEG, cv.CAP_DSHOW,OpenCV并没有自己集成视频的编码与解码,所以需要自己指定使用哪个第三方库来完成视频读写。多数情况不设这个参数,让电脑自行选择。
# VideoCaput的get方法
1.cv.CAP_PROP_FRAME_WIDT # 每一帧的宽
2.cv.CAP_PROP_FRAME_HEIGHT # 每一帧的高度
3.cv.CAP_PROP_FPS # 每一秒多少张图(帧数)
# 帧越高计算机处理能力越强,一秒钟30帧观感比较好,当一秒超过3帧的时候我们就认为他是连续播放图片(视频)
4.cv.CAP_PROP_FOURCC # 获取视频编码格式(MP4,AVI等等)
5.cv.CAP_PROP_FRAME_COUNT # 视频流总帧数
cv.VideoWriter(
filename, 保存文件名称
fourcc, 编码方式
fps, 帧率
frameSize 视频帧大小,与实现大小相符(取决于接收方电脑1s能跑多少帧)
[, isColor] ) -> <VideoWriter object>
当视频无法保存时可能是fps帧率=0,或者设定的framesize大小与电脑实际运行返回的framesize大小不一致。
3.代码练习与测试
注意:摄像头的权限控制与释放,当我们使用完摄像头之后要释放资源。
- cap.release()
- writer.release()
# 视频读写处理
def video_demo():
# 读取视频文件
cap = cv.VideoCapture(r"F:\python\opencv-4.x\samples\data\vtest.avi")
# 获取视频帧率fps
fps = cap.get(cv.CAP_PROP_FPS)
# 获取每帧的宽度
frame_w = cap.get(cv.CAP_PROP_FRAME_WIDTH)
# 获取每帧的高度
frame_h = cap.get(cv.CAP_PROP_FRAME_HEIGHT)
print("fps:", fps, "frame_w", frame_w, "frame_h", frame_h)
# 编码方式
# 指定编码方式为vp09
# fourcc = cv.VideoWriter_fourcc(*'vp09')
# 计算机自动获取编码格式
fourcc = cap.get(cv.CAP_PROP_FOURCC)
# 注意将编码格式fourcc转换成int类型
# 定义写入一个视频
writer_mp4 = cv.VideoWriter('output.mp4', int(fourcc), fps, (int(frame_w), int(frame_h)))
# 循环读取图片完成视频
while True:
# 摄像头读取,ret为是否成功打开摄像头,true,false。 frame为视频的每一帧图像
ret, frame = cap.read()
if ret is not True:
break
cv.imshow("frame", frame)
# 间隔1ms播放下一帧
c = cv.waitKey(1)
if c == 27:
break
# 写入视频帧,注意初始的帧数要和实际返回帧数一致
writer_mp4.write(frame)
# 释放资源
cap.release()
writer_mp4.release()
cv.waitKey(0)
cv.destroyAllWindows()
# 视频文件执行之后会有警告但是不影响使用
结果示例:
# 调用摄像头读写
def video_face_demo():
# 程序执行开始时间
a = time.time()
print(a)
# 读取视频文件
cap = cv.VideoCapture(0)
# # 更改分辨率大小和fps大小
# cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
# cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 960)
# cap.set(cv2.CAP_PROP_FPS, 70)
# resize = (int(cap.get(cv.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv.CAP_PROP_FRAME_HEIGHT)))
# print(resize)
# 获取视频帧率fps
fps = cap.get(cv.CAP_PROP_FPS)
# 获取每帧的宽度
frame_w = cap.get(cv.CAP_PROP_FRAME_WIDTH)
# 获取每帧的高度
frame_h = cap.get(cv.CAP_PROP_FRAME_HEIGHT)
print("fps:", fps, "frame_w", frame_w, "frame_h", frame_h)
# 记录调用时长
print(time.time() - a)
print(time.strftime('%Y-%m-%d %H:%M:%S'))
while True:
# 获取每一帧的帧率
fps = cap.get(cv.CAP_PROP_FPS)
print(fps)
# 摄像头读取,ret为是否成功打开摄像头,true,false。 frame为视频的每一帧图像
ret, frame = cap.read()
# 摄像头是和人对立的,将图像垂直翻转
frame = cv2.flip(frame, 1)
cv.imshow("video", frame)
# 10ms显示一张图片
c = cv.waitKey(10)
if c == 27:
break
# 释放资源
cap.release()
cv.waitKey(0)
cv.destroyAllWindows()
# 视频文件执行之后会有警告但是不影响使用
学习参考
本系列所有OpenCv相关的代码示例和内容均来自博主学习的网站:opencv_course