2017-04-20 79 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