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

Posted

技术标签:

【中文标题】在 Python 中为 OpenCV 视频对象指定压缩质量【英文标题】:Specify Compression Quality in Python for OpenCV Video Object 【发布时间】:2014-11-17 21:04:43 【问题描述】:

我必须使用包含在各个目录中的大量 jpeg 图像来创建低分辨率 AVI 视频。我有近百个目录,每个目录可能包含数千张图像。

为了自动化这个过程,我使用 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 视频 1

此方法有效,但视频对象的压缩质量始终设置为最大值。

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

每个视频都必须是 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】:

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

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

这将一个 100MB 的文件变成了不到 900KB

【讨论】:

感谢您的回复。我曾使用 Handbrake 将 AVI 转换为 MP4。如果我不致力于 AVI,我认为您的 ffmpeg 解决方案将是最佳选择。 ffmpeg 可以转换成任何类型的容器(avi, mp4, ...),你甚至可以指定你想要的编解码器。太棒了。

以上是关于在 Python 中为 OpenCV 视频对象指定压缩质量的主要内容,如果未能解决你的问题,请参考以下文章

以指定的时间间隔录制视频,然后将它们保存到文件 OpenCv Python

如何在OpenCV中为InRange阈值选择颜色的最佳HSV值

Python-视频

基于python + opencv的视频播放调节功能

OpenCV—读取视频,显示视频,保存视频

使用Python,OpenCV的Meanshift 和 Camshift 算法来查找和跟踪视频中的对象