在Python中为OpenCV视频对象指定压缩质量

13

我需要使用许多包含个别目录中的jpeg图像创建低分辨率AVI视频。我有近100个目录,每个目录可能包含数千个图像。

为了自动化这个过程,我编写了一个使用OpenCV的Python脚本来创建一个视频对象,从给定目录加载每个图像,并将每个图像写入该目录的特定视频文件。所有这些都很好地实现了。我的问题是如何控制视频对象的压缩质量。

VideoWriter模块接受5个参数。第二个参数“fourcc”设置压缩代码。

  

cv2.VideoWriter.open(filename,fourcc,fps,frameSize [,isColor])

我们可以在cv2.VideoWriter中使用“四字符代码”(即fourcc)指定压缩代码。

  

fourcc = cv2.cv.CV_FOURCC('M','S','V','C')#Microspoft Video 1

这种方法可行,但视频对象的压缩质量总是设置为最大值。

如果让fourcc = -1,则会打开Windows视频压缩对话框,允许用户选择视频压缩并将压缩质量(或时间质量比)设置为0到100之间。

此Windows视频压缩对话框的屏幕截图

每个视频必须是AVI格式,并且必须满足某些文件大小要求。如果使用最大的压缩质量,则视频文件太大。但是,要求用户为每个视频选择视频压缩和压缩质量会破坏脚本的自动化。

那么,如何在不使用Windows视频压缩对话框的情况下指定视频对象的压缩质量呢?

我所有的代码都在下面发布了:

import cv2, os

Workspace = "J:\jpg to AVI test"
year = "2014"
file_extension = "avi"
Image_file_dir = Workspace + "\\12 - ECD-BONNETT CREEK Y INT (" + year + ")"
print Image_file_dir
Image_file_list = os.listdir(Image_file_dir)
print "Image_file_list: " + str(Image_file_list)

img_cnt = 0

for Image_file in Image_file_list:

    if Image_file.split(".")[-1] == "jpg":

        Image_file_path = Image_file_dir + "\\" + Image_file
        print Image_file_path

        img1 = cv2.imread(Image_file_path)

        height , width , layers =  img1.shape

        break

fourcc = cv2.cv.CV_FOURCC('M','S','V','C') #Microspoft Video 1
##fourcc = -1
video_object = Workspace + "\\12 - ECD-BONNETT CREEK Y INT (" + year + ")." + file_extension
video = cv2.VideoWriter(video_object,\
                        fourcc,\
                        9,\
                        (width,height))

for Image_file in Image_file_list:

    if Image_file.split(".")[-1] == "jpg":

        img_cnt += 1
        Image_file_path = Image_file_dir + "\\" + Image_file
        print str(img_cnt) + ") " + Image_file_path

        img1 = cv2.imread(Image_file_path)

        video.write(img1)

cv2.destroyAllWindows() 
video.release()
1个回答

14

抱歉! OpenCV没有界面让您配置压缩比率。

最近我需要做类似的事情。 我采取的措施是以编程方式调用ffmpeg并使用它将OpenCV创建的AVI转换为MP4文件。

这将把一个100MB的文件压缩到不到900KB。


感谢您的回复。我曾使用Handbrake将AVI转换为MP4。如果我不坚持使用AVI,我认为您提供的ffmpeg解决方案将是最佳选择。 - KRH
1
ffmpeg 可以将视频转换为任何类型的容器(AVI、MP4 等),甚至可以指定所需编解码器。这太棒了。 - karlphillip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接