2014-09-23 5 views
2

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

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

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

cv2.VideoWriter.open (имя файла, FourCC, кадров в секунду, FrameSize [, isColor])

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

FourCC = cv2.cv.CV_FOURCC ('М', 'S', 'V', 'C') #Microspoft Видео 1

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

Если мы позволим FourCC = -1, диалоговое окно Windows, Сжатие видео открывается, что позволяет пользователю выбрать компрессию видео и установить качество сжатия (или Temporal Соотношение качества) от 0 до 100.

(я бы разместите снимок экрана этого диалогового окна Windows Video Compression, но я здесь новый, и моя репутация не была установлена.)

Каждое видео должно быть 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

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

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

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

+0

Я ценю ваш ответ. Я использовал Handbrake для преобразования AVI в MP4. Я думаю, что ваше решение ffmpeg было бы лучшим вариантом, если бы я не был привержен AVI. – KRH

+0

ffmpeg может конвертировать в любой тип контейнера (avi, mp4, ...), и вы даже можете указать нужный кодек. Это невероятно. – karlphillip