2017-04-20 77 views
1

我有這個功能,獲取視頻,提取一幀並保存爲圖像,如果我使用cv2.write它完美地工作(但我無法設法使它與py2exe或Pyinstaller一起工作),所以我現在嘗試使用PIL,當我用PIL保存幀時,圖像顏色是錯誤的,通常綠色和紅色都有藍色酊劑。無法使用正確的顏色設置PIL保存創建的圖像

from PIL import Image 
# import cv2 

def getThumbnail(video): 
    cap = cv2.VideoCapture(video) 
    cap.set(1, 150) 
    ret, frame = cap.read() 
    im = Image.fromarray(frame) 
    print (im, im.format, "% dx%d" % im.size, im.mode) 
    im.save(video.split(".")[0] + '.mp4' +'.jpg', icc_profile=im.info.get('icc_profile')) 
    # cv2.imwrite(video.split(".")[0] + '.mp4.jpg', frame) 

感謝您的幫助。

回答

1

終於來了!我發現解決方案在:http://blog.extramaster.net問題是cv2和PIL處理圖像編碼的方式。

def getThumbnail(video): 
    #Image._initialized = 2 
    cap = cv2.VideoCapture(video) 
    cap.set(1, 150) 
    ret, frame = cap.read() 
    array = cv2.cvtColor(numpy.array(frame), cv2.COLOR_RGB2BGR) 
    im = Image.fromarray(array) 
    print (im, im.format, "% dx%d" % im.size, im.mode) 
    im.save(video.split(".")[0] + '.mp4' +'.jpg', "JPEG", icc_profile=im.info.get('icc_profile')) 

由於我發現了一些文檔,我在此留下這些信息,希望它能幫助某人。

1

添加第二個參數 - "JPEG"

im.save(v_files[i].split(".")[0] + '.mp4.jpg', "JPEG", icc_profile=im.info.get('icc_profile')) 
+0

相同的結果,根據手冊: 格式 - 可選的格式覆蓋。如果省略,則使用的格式由文件擴展名確定。如果使用文件對象而不是文件名,則應始終使用此參數。 所以,即使我不添加「JPEG」,它仍然應該使用正確的參數作爲結尾是.jpg – Angrod

+0

您嘗試省略第三個參數('icc_profile = ...')嗎? – MarianD

+0

是的,我添加它,因爲這個元數據瀏覽器:http://exif.regex.info/exif.cgi說,它沒有色彩空間元數據,沒有嵌入顏色配置文件,所以我可能是問題是它錯過了數據,但它沒有任何區別...... – Angrod