我必須使用包含在各個目錄中的大量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()
我很感謝您的迴應。我曾使用Handbrake將AVI轉換爲MP4。我認爲如果我沒有致力於AVI的話,你的ffmpeg解決方案將是最好的選擇。 – KRH 2014-09-25 12:39:00
ffmpeg可以轉換爲任何類型的容器(avi,mp4,...),甚至可以指定所需的編解碼器。這是夢幻般的。 – karlphillip 2014-09-25 14:25:53