opencv 视频处理相关

技术opencv 视频处理相关 opencv 视频处理相关包含视频格式知识(编解码和封装格式);如何获取视频信息及视频编解码格式;opencv读取及保存视频,及opencv fourcc编码格式
一、基

中文版视频处理相关

包含视频格式知识(编解码和封装格式);如何获取视频信息及视频编解码格式;中文版读取及保存视频,及opencv fourcc编码格式

一、基础知识

视频的编解码格式和封装格式

参考如山似水视频编码与封装?式详解

参考迷之程序员中文版视频编码格式

参考艾里珊钟视频的编解码格式-知乎

常?的AVI、RMVB、MKV、ASF、WMV、MP4、3GP、FLV等?件(.后缀)其实只能算是?种封装标准。个完整的视频?件是由?频和视频两部分组成的,例如H264、Xvid等就是视频编码格式、MP3、AAC等就是?频编码格式

常?视频编码?式

Xvid(MPEG4),H264,MPEG1,MPEG2(感兴趣的可以了解下DivX和文件格式的故事,这两兄弟,前者收费,后者开源,用后者就对了)

常?存储封装格式

总体上说影片格式和空间是?前最常?的格式,影片格式由于先天缺陷不利于?络传输;m2ts和影片格式是先进的下?代标准,今后可能逐步流?野型腮腺炎病毒和格式通常是微软MPEG4算法的存储格式,DAT和每加仑行驶英里数是MPEG1算法编码的?件的存储?式,其中数据;数字录音带主要?于视频高密光盘(Video Compact Disc)则是MPEG2算法编码的?件的存储?式,通常?于DVD。

python使用ffmpeg 获取视频文件信息

!!!注意使用以下命令安装包,不然会使用报错!!!

点安装ffmpeg-python

参考代码

导入工具

input_video=' ./data/rafting.avi '

if __name__=='__main__':

probe=ffmpeg.probe(输入_视频)

视频_流_信息=探测[“streams”][0]

audio_stream_info=探测[“溪流”][1]

格式信息=探测['格式']

#显示视频编解码器信息

print(' codec _ type : { 0 } | codec _ name : { 1 } | codec _ long _ name : { 2 }).格式(video _ stream _ info[' codec _ type '],

video _ stream _ info[' codec _ name '],

video _ stream _ info[' codec _ long _ name ']))

#显示奥迪编解码器信息

print(' codec _ type : { 0 } | codec _ name : { 1 } | codec _ long _ name : { 2 }).格式(audio _ stream _ info[' codec _ type '],

audio _ stream _ info[' codec _ name '],

audio _ stream _ info[' codec _ long _ name ']))

#显示容器(封装)格式

print(' filename : { 0 } | format _ name : { 1 } | format _ long _ name : { 2 }).格式(format_info['filename'],

format_info['format_name'],

format_info['表单

at_long_name"]))

参考视频信息输出样例

{'streams': [{'index': 0, 'codec_name': 'msmpeg4v2', 'codec_long_name': 'MPEG-4 part 2 Microsoft variant version 2', 'codec_type': 'video', 'codec_time_base': '1/12', 'codec_tag_string': 'MP42', 'codec_tag': '0x3234504d', 'width': 1920, 'height': 1080, 'coded_width': 1920, 'coded_height': 1080, 'closed_captions': 0, 'has_b_frames': 0, 'pix_fmt': 'yuv420p', 'level': -99, 'refs': 1, 'r_frame_rate': '12/1', 'avg_frame_rate': '12/1', 'time_base': '1/12', 'start_pts': 0, 'start_time': '0.000000', 'duration_ts': 19999, 'duration': '1666.583333', 'bit_rate': '2422022', 'nb_frames': '19999', 'disposition': {'default': 0, 'dub': 0, 'original': 0, 'comment': 0, 'lyrics': 0, 'karaoke': 0, 'forced': 0, 'hearing_impaired': 0, 'visual_impaired': 0, 'clean_effects': 0, 'attached_pic': 0, 'timed_thumbnails': 0}}], 'format': { ...}

二、opencv视频相关操作

1.视频信息读取相关

首先读取视频文件,函数部分使用方式如下

video_reader = cv2.VideoCapture('test.mp4')

cv2.VideoCapture()

如果传的参数是数字,表示使用摄像头。如 cv2.VideoCapture(0),表示使用计算机第一个摄像头。

如果传的是一个视频的地址,则表示读取本地视频。这里我只用第二种,给一个视频的绝对路径并读取它。另有如下两常用函数:

  • cv2.VideoCapture().isOpened() 检测视频读取状态是否正常
  • cv2.VideoCapture().read() 获取视频某一帧,返回两个值,第一个是布尔值,表示“这一帧”是否获取正确;第二个值是这一帧的内容,是一个矩阵。

获取视频的基本信息

例如获取视频的编解码信息 FOURCC ,例如输出 1145656920

print( int(video_reader.get(cv2.CAP_PROP_FOURCC)))    
## 或者直接整数参数替代,参考下面表格
print(int(video_reader.get(6)))   

**cv2.VideoCapture.get参数 ** 参考官网

FOURCC

关于fourCC的一段讲述

FourCC is a 4-byte code used to specify the video codec. The list of available codes can be found in fourcc.org. It is platform dependent. Following codecs work fine: In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. ( XVID is more preferable. MJPG results in high size video. X264 gives very small size video ) In Windows: DIVX ( more to be tested and added )

FourCC code is passed as cv2.VideoWriter_fourcc('M','J','P','G') or cv2.VideoWriter_fourcc(\*'MJPG) for MJPG.

这里针对FOURCC专门写一下,可以看到例如上面的输出 1145656920,opencv中默认把FOURCC从字符转为int类型,对应的转换原理可以参考维基中的Technical details。

int转换为四位的字符,参考以下python代码

def decode_fourcc(cc):
    return "".join([chr((int(cc)  8 * i)  0xFF) for i in range(4)])
    
decode_fourcc(1145656920)
'XVID'

或者参考这c++代码

unsigned int f = (unsigned)capture.get(cv::CAP_PROP_FOURCC);
char fourcc[] = {
		(char)f, // First character is lowest bits
		(char)(f  8), // Next character is bits 8-15
		(char)(f  16), // Next character is bits 16-23
		(char)(f  24), // Last character is bits 24-31
		'\0' // and don't forget to terminate
	};
cout  "the return int fourcc was: "  f  endl;
cout  "FourCC for this video was: "  fourcc  endl;
/*运行结果为:
the return int fourcc was: 1145656920
FourCC for this video was: XVID
*/

或者这个在线转换的, 在线int fourCC转字符;另外opencv有函数自动把四位字符的fourCC转为int

cv2.VideoWriter_fourcc(*'XVID')     ###  1145656920

一些常见的fourCC 字符和 integer 对照表

字符 对应integer
"XVID" 1145656920
"MJPG" 1196444237
"X264" 875967064
"DIB" 541215044
"WMV1" 827739479
"WMV2" 844516695

3. 读取视频相关

这一部分比较简单,网上教程也很多,贴一个代码就行

    success = True
    video_reader = cv2.VideoCapture(video_path)
    while success and video_reader.isOpened():
        # get a frame
        success, frame = video_reader.read()
        # show a frame
        cv2.imshow("capture", frame)
        if cv2.waitKey(100)  0xFF == ord('q'):
            break
    video_reader.release()
    cv2.destroyAllWindows() 

3. 保存视频相关

cv2.VideoWriter()

保存视频需要使用cv2.VideoWriter()函数

VideoWriter(filename, fourcc, fps, frameSize[, isColor]) - VideoWriter object

参数说明:

比较重要的三个fourcc 指定编码格式,注意格式和对应的后缀匹配;frameSize 视频分辨率,一定要确保写入的图像和此分辨率一致,如果像改分辨率得先把图resize再保存成特定分辨率;isColor,True,输入图必须是RGB,否则无法保存,但是却不会报错,只不过发现保存的视频为空的,也打不开

  • filename,要保存的视频路径
  • fourcc,视频压缩帧的编码codec,例如 cv2.VideoWriter_fourcc('M', 'P', '4', '2') 或者 cv2.VideoWriter_fourcc(*"MP42") 表示使用 MPEG-4.2 codec, 可以参考这个: 可以使用的fourcc列表大全
  • fps,输出视频的帧率
  • frameSize,输出视频每帧图像的大小,要和写入的那帧图大小一直,不然会有问题
  • isColor,如果非零,编码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在Windows下支持这个标志)

附加一个关于fourCC的说明

四个字符用来表示压缩帧的codec 例如:
CV_FOURCC(‘P’,‘I’,‘M’,‘1’) = MPEG-1 codec
CV_FOURCC(‘M’,‘J’,‘P’,‘G’) = motion-jpeg codec
CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’) = MPEG-4.2 codec
CV_FOURCC(‘D’, ‘I’, ‘V’, ‘3’) = MPEG-4.3 codec
CV_FOURCC(‘D’, ‘I’, ‘V’, ‘X’) = MPEG-4 codec
CV_FOURCC(‘U’, ‘2’, ‘6’, ‘3’) = H263 codec
CV_FOURCC(‘I’, ‘2’, ‘6’, ‘3’) = H263I codec
CV_FOURCC(‘F’, ‘L’, ‘V’, ‘1’) = FLV1 codec
NOTE:生成文件占用空间最小的编码方式是MPEG-4.2 codec。在VideoWriter类的构造函数参数为CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’) 。
最大的是MPEG-1 codec,对应在VideoWriter类的构造函数参数为CV_FOURCC(‘P’,‘I’,‘M’,‘1’) ,所占磁盘空间是前者的5.7倍。所以如果需要24小时全天候录制监控,可以优先使用MPEG-4.2的编解码方式。
若编码器代号为 -1,则运行时会弹出一个编码器选择框.

原文链接:https://blog.csdn.net/qiu931110/article/details/85174069

例子

先定义输出文件

    fps_cv = video_reader.get(cv2.CAP_PROP_FPS)  ### 视频fps, opencv检测到的
    fourcc = cv2.VideoWriter_fourcc(*'XVID')     ### 保存视频的格式
    h, w, c = frame.shape
    out = cv2.VideoWriter(save_path, fourcc, fps_cv, (w, h), isColor=True)  ## 保存视频

然后一遍读视频每帧一遍保存成新的视频

    success = True
    video_reader = cv2.VideoCapture(video_path)
    while success and video_reader.isOpened():
        # get a frame
        success, frame = video_reader.read()
        ### save frame
        out.write(frame)
    out.release()  ### 完成保存,释放
    video_reader.release()

各种视频格式测试

保存1080p的视频,共300帧的内容,H.265 和H.264暂未测试,opencv需要相关的依赖包

分辨率 格式 需要时间 文件大小
1920*1080 'XVID' MPEG-4 codec 1.7377230167388915 6.2MB
1920*1080 ‘MP42’ MPEG-4.2 codec 1.7837894439697266 6.1MB
1920*1080 "DIVX" MPEG-4 codec 1.7331401348114013 6.2MB
1920*1080 "DIV3" MPEG-4.3 codec 3.3492454290390015 6.1MB

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/112516.html

(0)

相关推荐

  • 怎么刷抖音粉丝,刷抖音粉丝网站最便宜?

    技术怎么刷抖音粉丝,刷抖音粉丝网站最便宜?抖音便宜刷粉网站,刷抖音粉丝网站最便宜抖音刷粉丝的平台网站搜索应该也很多,价格差异也很大,原因主要是看做单的号的质量,有的机器刷单,有的是真人接单,有的是群派单,还有的是真机养的

    测评 2021年10月20日
  • 柯基不断尾有什么坏处,柯基从小就断尾,它会痛吗

    技术柯基不断尾有什么坏处,柯基从小就断尾,它会痛吗柯基犬断尾当然会痛啊柯基不断尾有什么坏处,我们能做的就是在最恰当的时间,采用最恰当的方法,将它们的疼痛和伤害降到最低。一、那么所有的柯基犬都会断尾吗?其实也不是,比如以下

    生活 2021年10月25日
  • springcloud判断微服务循环调用(springmessaging)

    技术如何进行spring-messaging远程代码执行漏洞分析这篇文章给大家介绍如何进行spring-messaging远程代码执行漏洞分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。0x00

    攻略 2021年12月20日
  • 家长的话怎么写一年级,家长对一年级孩子的寄语和期望

    技术家长的话怎么写一年级,家长对一年级孩子的寄语和期望1、孩子家长的话怎么写一年级,转眼间你入学已经一年了。一年来,你很快适应了小学的生活,也付出了很多的努力,在这里,妈妈为你的成长而欣喜。同时,也和你一样,对辛勤教育你

    生活 2021年10月25日
  • 色彩斑斓造句,小学二年级五颜六色造句

    技术色彩斑斓造句,小学二年级五颜六色造句五颜六色的花朵点缀在茂盛的牧草间色彩斑斓造句。他们将房子漆得五颜六色。  不曾料想,这个季节最先盛开的花竟是雨伞,一朵朵摇曳着,像五颜六色的合欢。  它全身有五颜六色的羽毛。  我

    生活 2021年10月22日
  • 删除排序数组中的重复项 ----java

    技术删除排序数组中的重复项 ----java 删除排序数组中的重复项 ----java给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。

    礼包 2021年11月4日