Укажите качество сжатия в 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.
Каждое видео должно быть 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 КБ.