当前位置: 首页 > news >正文

OpenCV-Python学习(22)—— OpenCV 视频读取与保存处理(cv.VideoCapture、cv.VideoWriter)

1. 学习目标

  1. 学习 OpenCV 的视频的编码格式 cv.VideoWriter_fourcc;
  2. 学会使用 OpenCV 的视频读取函数 cv.VideoCapture;
  3. 学会使用 OpenCV 的视频保存函数 cv.VideoWriter。

2. cv.VideoWriter_fourcc()常见的编码参数

2.1 参数说明

参数说明
cv.VideoWriter_fourcc(‘M’,‘P’,‘4’,‘V’)MPEG-4编码 .mp4 可指定结果视频的大小
cv.VideoWriter_fourcc(‘X’,‘2’,‘6’,‘4’)MPEG-4编码 .mp4 可指定结果视频的大小
cv.VideoWriter_fourcc(‘I’, ‘4’, ‘2’, ‘0’)该参数是YUV编码类型,文件名后缀为.avi 广泛兼容,但会产生大文件
cv.VideoWriter_fourcc(‘P’, ‘I’, ‘M’, ‘I’)该参数是MPEG-1编码类型,文件名后缀为.avi
cv.VideoWriter_fourcc(‘X’, ‘V’, ‘I’, ‘D’)该参数是MPEG-4编码类型,文件名后缀为.avi,可指定结果视频的大小
cv.VideoWriter_fourcc(‘T’, ‘H’, ‘E’, ‘O’)该参数是Ogg Vorbis,文件名后缀为.ogv
cv.VideoWriter_fourcc(‘F’, ‘L’, ‘V’, ‘1’)该参数是Flash视频,文件名后缀为.flv

2.2 使用

  1. 以写mp4视频为例,以下为等价写法:
fourcc = cv.VideoWriter_fourcc('m', 'p', '4', 'v')
fourcc = cv.VideoWriter_fourcc('M', 'P', '4', 'V')
fourcc = cv.VideoWriter_fourcc(*'MP4V')
fourcc = cv.VideoWriter_fourcc(*'mp4v')

3. 视频读取

3.1 cv.VideoCapture() 函数说明

cv.VideoCapture(filename[, apiPreference[, params]]) → <VideoCapture object>cv.VideoCapture(index[, apiPreference[, params]]) → <VideoCapture object>

3.2 参数说明

参数说明
filename表示读取的视频文件的路径,包括扩展名。
index表示摄像头的 ID 编号,0 表示默认后端打开默认摄像机。
apiPreference表示决定使用那个第三方库读取视频。

4. 视频保存

4.1 cv.VideoWriter() 函数说明

cv.VideoWriter(filename, fourcc, fps, frameSize[, isColor]) → <VideoWriter object>

4.2 参数说明

参数说明
filename表示保存的视频文件的路径,包括扩展名。
fourcc表示用于压缩帧的编码器/解码器的字符代码。
fps表示视频流的帧速率。
frameSize表示元组 (w, h),视频帧的宽度和高度。
isColor表示是否彩色图像。

5. cv.VideoCapture 和 cv.VideoWriter 的成员函数

函数名说明
cv.VideoCapture.isOpened()表示检查视频捕获是否初始化成功。
cv.VideoCapture.read()表示捕获视频文件、视频流或捕获的视频设备。
cv.VideoCapture.get(propId)表示获取 VideoCapture 类对象的属性。
cv.VideoCapture.set(propId, value)表示设置 VideoCapture 类对象的属性。
cv.VideoCapture.release()表示关闭视频文件或设备,释放对象。
cv.VideoWriter.fourcc(c1, c2, c3, c4[, ])表示构造编码器/解码器的fourcc代码。
cv.VideoWriter.write(image[, ])表示写入下一帧视频。
cv.VideoWriter.release()表示关闭视频写入,释放对象。

6. 实例将 .avi 转 .mp4

6.1 实例代码

import cv2 as cv
import imageio# 读取视频,将视频按照帧导出图片
def get_video_images(video_path):cap = cv.VideoCapture(video_path)images = []while cap.isOpened():ret, frame = cap.read()  # 读取下一帧视频图像if ret is True:cv.imshow("frame", frame)images.append(frame)key = cv.waitKey(24)if key == ord('q'):breakelse:breakcap.release()cv.destroyAllWindows()return images# 转MP4
def create_mp4(filename, fps, images):h,w,c = images[0].shapefourcc = cv.VideoWriter_fourcc(*'mp4v')writer = cv.VideoWriter(filename, fourcc, fps, (w,h))for frame in images:writer.write(frame)writer.release()if __name__ == "__main__":imgs = get_video_images('./images/Megamind.avi')create_mp4('./images/Megamind.mp4', 24, imgs)

6.2 转换结果使用 gif 展示

输入图片说明

7. 总结

  1. 视频写入类VideoWriter的参数frameSize是元组 (w, h),即视频帧的宽度和高度,而OpenCV图像的形状是 (h, w),注意二者的顺序相反;
  2. write 写入图片的宽高必须保持一直;
  3. 使用摄像头时,index=0 表示默认后端打开默认摄像机,例如笔记本内置摄像头。
http://www.lryc.cn/news/31430.html

相关文章:

  • 2023-03-05力扣每日一题
  • 真正的IT技术男是什么样的?
  • 在函数中,用指针接收就可以改变相应的内容吗??
  • Java+ElasticSearch+Pytorch实现以图搜图
  • 【C语言学习笔记】:指针
  • 微信小程序搭建流程
  • 嵌入式 Linux进程间的通信--信号
  • Vue3 核心模块源码解析(中)
  • 华为OD机试题 - 剩余可用字符集(JavaScript)| 含思路
  • 焦虑的根源
  • 1.认识网络爬虫
  • 【论文速递】WACV 2023 - 一种全卷积Transformer的医学影响分割模型
  • 加密图像的脆弱水印及应用
  • python线上商城网站项目前台和后台源码
  • PowerShell 实现企业微信机器人推送消息
  • IDEA集成Git就是这么简单
  • springBoot 事务基本原理
  • HBuilderX无线连接真机
  • idea初学笔记
  • C++核心编程<类和对象>(4)
  • 编写http workshop脚本从网页缓存里解析音乐
  • 当数字孪生遇上轨道交通,会有什么新发展?
  • 原理底层计划--分布式事务
  • Hive总结
  • docker环境下安装jenkins
  • Shifu基础功能:设备接入
  • 基于Java+SpringBoot+Vue+Redis+RabbitMq的鲜花商城
  • 蓝桥杯真题(解码)小白入!
  • 并发包中的ConcurrentLinkedQueue和LinkedBlockingQueue有什么区别?
  • 分享四个前端Web3D动画库在Threejs中使用的动画库以及优缺点附地址