2014-09-23 462 views
2

我必须使用包含在各个目录中的大量jpeg图像创建低分辨率AVI视频。我有近一百个目录,每个目录可能包含成千上万的图像。在Python中为OpenCV视频对象指定压缩质量

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

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

cv2.VideoWriter.open(文件名,FOURCC,帧,框架尺寸[,isColor])

我们可以指定使用 “四个字符代码” 内cv2.VideoWriter的压缩代码(即FOURCC )。

FOURCC = cv2.cv.CV_FOURCC( 'M', 'S', 'V', 'C')#Microspoft视频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() 

回答

2

对不起! OpenCV没有界面让您配置压缩率。

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

这将一个100MB的文件变成小于900KB的

+0

我很感谢您的回应。我曾使用Handbrake将AVI转换为MP4。我认为如果我没有致力于AVI的话,你的ffmpeg解决方案将是最好的选择。 – KRH 2014-09-25 12:39:00

+0

ffmpeg可以转换为任何类型的容器(avi,mp4,...),甚至可以指定所需的编解码器。这是梦幻般的。 – karlphillip 2014-09-25 14:25:53