使用python的cv2库完成图片转视频,解决灰度图片和中文路径问题
先上代码
img2video.py1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| import cv2 import numpy as np import glob import os
img_array = []
for filename in sorted(glob.glob(r'***\0X1AA30623C1AE4641\*.png'), key=lambda x: int(x.split('.')[0].split('_')[-1])): img = cv2.imdecode(np.fromfile(filename, dtype=np.uint8), 1) img_array.append(img)
height, width, channel = img_array[0].shape size = (width, height)
out = cv2.VideoWriter(r'***\0X1AA30623C1AE4641_predict.avi', cv2.VideoWriter_fourcc(*'I420'), 50, size)
for img in img_array: out.write(img)
out.release()
|
中文路径
cv2在读取带有中文路径图片的时候不能直接使用cv2.imread()
,读出来是None。需要使用cv2.imdecode(np.fromfile(filepath, dtype=np.uint8), -1)
,注意后面的数字带有具体含义,下面将灰度图的时候说明。
灰度图片
cv2.imdecode(np.fromfile(filepath, dtype=np.uint8), flag=-1)
此处的flag带有明确含义:
- flag = -1, 8位深度,原通道,此时读取的是原来的图像
- flag = 0, 8位深度,1通道,读取的是灰度图
- flag = 1, 8位深度,3通道彩图
- flag = 2, 原深度, 灰度
- flag = 3,原深度,彩图
- flag = 4, 8位深度, 3通道彩图
我最终的结果是一张灰度图,需要读成三通道彩图才能进行保存,注意cv2读出来的是BGR而不是RGB,只要中途不经过PIL之类的转化,直接再cv2.VideoWriter
的话其实不影响。