Укажите качество сжатия в Python для видеообъекта OpenCV

Я должен создавать видео AVI с низким разрешением, используя большое количество изображений JPEG, содержащихся в отдельных каталогах. У меня есть около ста каталогов, и каждый каталог может содержать много тысяч изображений.

Чтобы автоматизировать этот процесс, я написал скрипт на Python, используя OpenCV для создания видеообъекта, загрузки каждого изображения из данного каталога и записи каждого изображения в определенный видеофайл для этого каталога. Все это прекрасно работает. Моя проблема в том, как контролировать качество сжатия видео объекта.

Модуль VideoWriter принимает 5 параметров. Второй параметр 'fourcc' устанавливает код сжатия.

cv2.VideoWriter.open (имя файла, fourcc, fps, frameSize[, isColor])

Мы можем указать код сжатия в cv2.VideoWriter, используя "четырехсимвольный код" (то есть fourcc).

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

Этот подход работает, за исключением того, что качество сжатия видеообъекта всегда установлено на максимум.

Если мы допустим fourcc = -1, откроется диалоговое окно Windows Video Compression, которое позволяет пользователю выбрать сжатие видео И установить качество сжатия (или временное соотношение качества) в диапазоне от 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 ответ

Решение

Сожалею! OpenCV не имеет интерфейса, позволяющего вам настраивать степень сжатия.

Недавно мне нужно было сделать подобное. Мой курс действий был призвать ffmpeg программно и использовать его для преобразования AVI, созданного OpenCV в файл MP4.

Это превратило файл размером 100 МБ в менее чем 900 КБ.

Другие вопросы по тегам