《LearnPython-Python学习笔记》-OpenCV学习笔记之五:视频读取写入

admin 2025-11-07 01:09:05 编程 来源:ZONE.CI 全球网 0 阅读模式

    用 OpenCV 开发难免会针对 Camera 或者是 Video 做处理,有的时候需要将画面保留下来,这个时候最佳方案是保存成一个 .avi 的文件。

    OpenCV 底层是用 FFMEPG 进行多媒体开发的,所以 OpenCV 它的长项不在于此,它只是提供了这种能力而已,如果要针对多媒体文件做复杂的处理,推荐的还是 FFMEPG 专业库。

    OpenCV 用来创建视频文件的类是 VideoWriter。

    但首先,给大家普及一些视频类相关的知识点。

    1. 文件后缀名我们一般都知道视频文件是 .mp4、.3gp、.rmvb 等等格式的,但一个文件取这样的后缀名是为了告诉用户或者操作系统,它的内容是什么格式的。我们也可以将 rmvb 格式的文件取名为 *.avi。后缀的目的是为了方便用专业的工具或者软件操作它们。

    2. 文件格式我们可以将一个视频文件看做一个容器。

    简单地说就是可以看做是一个盒子。

    这个盒子里面有视频画面数据、音频数据、字幕数据等等。

    1. 编码格式视频容器中,一般有视频和音频数据,它们采取的编码方式不一样。

    视频常见的编码方式通常有: x264、h264、mpeg-4

    音频常见的编码方式通常有: mp3、AAC、flac

    编码的目的主要是为了高效存储和传输,如果你不采用编码压缩的话,那么视频可以看做是一系列的图片序列,体积会非常大。

    1. 编码器和解码器把视频或者音频按照编码格式,编码成特定文件格式需要编码器的参与,不然每次开发重新写代码代价很高。

    把特定文件格式解码成特定的编码格式数据,这个过程称为解码,需要解码器的存在。

    解码器和编码器都有开源的或者收费的工具库,极大方便了开发者。

    1. FPS 帧率我们读初中物理时,大概了解过电影画面一秒钟 24 帧,其实对应的就是 24 fps,frame per second,有些手机有高速摄像的功能,原理就是能够 1 秒钟拍摄 960 张图片,然后用正常的速度放映出来,所以细节比较多。

    fps 越高,细节越好,体验也越好,但是文件容量也越高。

    不同的文件格式如 mp4、avi、mkv 等等,它们存放 打包数据的方式不一样,文件内部文件编码方式也可能不一样。

    6.VideoWriter用 OpenCV 保存视频非常简单,通过调用它的 VideoWriter类。详细函数格式 VideoWriter(filename, fourcc, fps, frameSize[, isColor])。

    第一个参数是要保存的文件的路径fourcc 指定编码器fps 要保存的视频的帧率frameSize 要保存的文件的画面尺寸isColor 指示是黑白画面还是彩色的画面7.一些其他细节

    通过摄像头捕捉读入视频,获取第一个摄像头cv2.VideoCapture(0),如果有多个摄像头可以修改参数,比如改成1是第二个摄像头。

    视频编解码器VideoWriter_fourcc,fourcc意思为四字符代码(Four-Character-Codes),顾名思义该编码由4个字符组成,下面是VideoWriter_fourcc对象的一些常用参数,注意:字符顺序不能弄混。

    cv2.VideoWriter_fourcc(‘I’, ‘4’, ‘2’, ‘0’),该参数是YUV编码类型,文件名后缀为.avicv2.VideoWriter_fourcc(‘P’, ‘I’, ‘M’, ‘I’),该参数是MPEG-1编码类型,文件名后缀为.avicv2.VideoWriter_fourcc(‘X’, ‘V’, ‘I’, ‘D’),该参数是MPEG-4编码类型,文件名后缀为.avicv2.VideoWriter_fourcc(‘T’, ‘H’, ‘E’, ‘O’),该参数是Ogg Vorbis,文件名后缀为.ogvcv2.VideoWriter_fourcc(‘F’, ‘L’, ‘V’, ‘1’),该参数是Flash视频,文件名后缀为.flvfourcc 本身是一个 32 位的无符号数值,用 4 个字母表示采用的编码器。 常用的有 “DIVX”、”MJPG”、“XVID”、“X264”。

    推荐使用 ”XVID”, cv2.VideoWriter_fourcc(*’XVID’),但一般依据你的电脑环境安装了哪些编码器。

    8.代码示例

    1. #!/usr/bin/env python
    2. # -*- coding: utf-8 -*-
    3. # @Time : 2020/3/29 10:11
    4. # @Author : King110108
    5. # @File : webcame.py
    6. # @Description:
    7. # @IDE : PyCharm
    8. import cv2
    9. cap = cv2.VideoCapture(0) #读取摄像头,0为摄像头索引,当有多个摄像头时,从0开始编号
    10. fourcc = cv2.VideoWriter_fourcc(*'XVID') #创建视频流写入对象,VideoWriter_fourcc为视频编解码器
    11. #fourcc意为四字符代码(Four-Character Codes),顾名思义,该编码由四个字符组成,下面是VideoWriter_fourcc对象一些常用的参数,注意:字符顺序不能弄混
    12. # cv2.VideoWriter_fourcc('I', '4', '2', '0'),该参数是YUV编码类型,文件名后缀为.avi
    13. # cv2.VideoWriter_fourcc('P', 'I', 'M', 'I'),该参数是MPEG-1编码类型,文件名后缀为.avi
    14. # cv2.VideoWriter_fourcc('X', 'V', 'I', 'D'),该参数是MPEG-4编码类型,文件名后缀为.avi
    15. # cv2.VideoWriter_fourcc('T', 'H', 'E', 'O'),该参数是Ogg Vorbis,文件名后缀为.ogv
    16. # cv2.VideoWriter_fourcc('F', 'L', 'V', '1'),该参数是Flash视频,文件名后缀为.flv
    17. out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) #设置视频参数, 20为帧播放速率,640x480是视频输出窗口大小
    18. while True:
    19. ret, frame = cap.read()
    20. gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #转为灰度
    21. out.write(frame) #写入视频
    22. cv2.imshow('frame', frame) #彩色显示
    23. cv2.imshow('gray', gray) #灰度显示
    24. if cv2.waitKey(1) & 0xFF == ord('q'): #按q退出程序
    25. break
    26. cap.release()
    27. out.release()
    28. cv2.destroyAllWindows()

    这段代码的目的就是获取摄像头的视频流,然后保存到本地,帧率是 20fps,尺寸是 640x480.

    需要注意的是在 VideoWriter 中指定的尺寸要和 write() 中写进去的一样,不然视频会存储失败的。

    如果需要读取视频文件,那么就将 VideoCapture 指定文件路径。

    如果,将图片序列合成为视频文件,其实原理也一样,一张一张读取,然后写到 VideoWriter 当中去。

    以太坊cppgolang区别 编程

    以太坊cppgolang区别

    以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
    progolang 编程

    progolang

    Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
    golangn个发送者 编程

    golangn个发送者

    Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
    golang技能图谱 编程

    golang技能图谱

    从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
    评论:0   参与:  11