Python+OpenCv--采用不同编码器保存的视频比较

基本命令介绍:


  • 1 cv2.imread(filename,property) 读入图像

    • property:指定图像用哪种方式读取文件
  • 2 cv2.IMREAD_COLOR:读入彩色图像,默认参数,Opencv 读取彩色图像为RBG模式,要与BMP格式的图像区分开
  • 3 cv2.IMREAD_GRAYSCALE:读入灰度图像
  • 4 cv2.imshow(窗口名,图像文件) :显示图像
  • 5 cv2.waitKey() 键盘绑定函数
    • 功能:函数等待特定的几毫秒,看是否由键盘输入
  • 6 cv2.namedWindow(窗口名,属性) 创建一个窗口
    • 属性:指定窗口大小模式
  • 7 cv2.WINDOW_AUTOSIZE:根据图像大小自动创建大小
  • 8 cv2.WINDOW_NORMAL:窗口大小可调整
  • 9 cv2.destoryAllWindows(): 删除任何建立的窗口
更多介绍请参考下面实例代码:

实例代码:

#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
# author:"Zhang Shuyu"
import cv2

fourcc = cv2.VideoWriter_fourcc('X','V','I','D') # 使用XVID编码器,xvid为主流的通用视频编码器
camera = cv2.VideoCapture(0) # 参数0表示第一个摄像头
#fps = camera.get(cv2.CAP_PROP_FPS)# 获取视频帧率 todo:当视频流从摄像头采集时此命令无法使用
size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)),
       int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT)))

# 判断视频是否打开
if (camera.isOpened()):
    print('Open')
else:
    print('Fail to open!')

# 测试用,查看视频size
size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)),
       int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print ('size:'+repr(size))
out = cv2.VideoWriter('output_test_xvid-30.avi',fourcc,30,size) # 参数分别是:保存的文件名、编码器、帧率、视频宽高
count=0
while True:
    count+=1
    grabbed, frame_lwpCV = camera.read() # 逐帧采集视频流
    if not grabbed:
        break
    cv2.imshow('lwpCVWindow', frame_lwpCV) # 显示采集到的视频流
    out.write(frame_lwpCV)
    key = cv2.waitKey(1) & 0xFF
    if key == ord('q') or count==300:#等待采集300帧图像数据或者点击键盘‘q’退出保存视频,count可以控制视频保存的时间
        break
out.release() #释放out,保存视频,否则程序会出现错误,保存的视频文件会提醒文件损坏
camera.release() #释放camera
cv2.destroyAllWindows()

在以上的代码中修改

fourcc = cv2.VideoWriter_fourcc('X','V','I','D') #'X','V','I','D'就是编码器的格式

可以使用PIM1MP42等不同的编码格式

更多具体的视频流编码格式可以参考https://blog.csdn.net/qq_30622831/article/details/82082122

注意:有的编码器自己是不能使用的,不然保存后得到的视频会是0Kb或者无法打开出现异常,下图中的红色部分代表采用H264编码器得到的视频出现异常。原因是我的电脑上没有相应的linopenH264.dll文件。
这里写图片描述

最后通过对不同的编码格式(也就是编码器)得到的视频进行分析,可以得到下表:(不包括output_test_h264-30.avi)

视频 编码方式 fps(帧率) size 比特率(kbps) 数据类型
output_test_free-30 无压缩类型(RGB24) 10 (640,480) 833126 uint8
output_test_mp42-30 MP42 10 (640,480) 18432 uint8
output_test_pim1-30 PIM1 10 (640,480) 18432 uint8
output_test_xvid-30 XVID 10 (640,480) 794 uint8

这些视频的时长和帧率都是相同的,拍摄的景象都是相同的,但是不同的编码方式最后得到的视频相差很多。XVID保存的视频最小,无压缩格式保存的视频最大,但视频的清晰度也是无压缩的最好。用空间换取了视频的质量。在同等条件下,比特率对视频质量以及存储大小的影响最大。


使用无压缩类型编码方式的方法:
out = cv2.VideoWriter('output_test_xvid-30.avi',-1,30,size) # 参数分别是:保存的文件名、编码器、帧率、视频宽高

将指令中的编码器对应的参数改为“-1”即可,就会出现一个对话窗口,可以手动选择编码器
这里写图片描述
Python+OpenCv--采用不同编码器保存的视频比较_第1张图片
其他的一些视频流的编码详细介绍请参考
- https://blog.csdn.net/baidu_39511645/article/details/78442819
- http://www.360doc.com/content/15/0215/23/14534301_448873274.shtml

你可能感兴趣的:(图像数据处理)