opencv 视频处理
若视频读取时出现问题如:[mov,mp4,m4a,3gp,3g2,mj2 @ 0x563f33f78780] moov atom not found, VIDIOC_REQBUFS Inappropriate ioctl for device ,很可能是视频文件本身有问题,条件允许的话,重新生成视频就能解决问题。
1. 读取视频,并抽帧
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
print('the video does not exist.')
return False
h, w = 256, 256
fps = int(cap.get(cv2.CAP_PROP_FPS))
ret, frame = cap.read()
while ret:
img = np.array(cv2.resize(img, (w, h))) # resize
ret, frame = cap.read()
cap.release()
print('video read ended.')
* 每隔 k 帧抽帧的逻辑
f_No = 0
ret = cap.grab()
while ret:
if 0 == f_No%k: # here, check the frame number that grabbed last time
ret, frame = cap.retrieve() # if condition satisfied, retrieve the frame that last grabbed
...
ret = cap.grab() # grab every interation
f_No += 1
2. 从图片集中合成视频
# 1. 'save_path' is path to save generated video, recommond to end with '.mp4'(format); 2. set the fourcc format as 'mp4v' (suit with '.mp4')
video = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (width, height))
for img in frames: # frames is of type list; frame in frames is object that same to object read by cv2.imread(), BGR
video.write(img )
video.release()
frames.clear()
* 这种合成方式是有损的,读取的帧数据和源图像的数据间有差别, 参考stackoverflow,或许可以用 'png '的编码格式;但更推荐使用ffmpeg合成视频,最稳当的为:图片无损保存为png格式,从png图片用ffmpeg生成无损视频,参考
可以使用的部分编码格式 ——参考博客
cv2.VideoWriter_fourcc(*'X264'), 该参数是较新的MPEG-4编码,产生的文件较小,文件扩展名应为.mp4
cv2.VideoWriter_fourcc(*'PIMI'), 该参数是较旧的MPEG-1编码,文件名后缀为.avi
cv2.VideoWriter_fourcc(*'MP42'), 该参数是MPEG-2编码,产生的文件不会特别大,文件名后缀为.avi
cv2.VideoWriter_fourcc(*'DIV3'), 该参数是MPEG-3编码,产生的文件不会特别大,文件名后缀为.avi
cv2.VideoWriter_fourcc(*'DIVX'), 该参数是MPEG-4编码,产生的文件不会特别大,文件名后缀为.avi
cv2.VideoWriter_fourcc(*'XVID'), 该参数是较旧的MPEG-4编码,产生的文件不会特别大,文件名后缀为.avi
cv2.VideoWriter_fourcc(*'MP4V'), 该参数也是较旧的MPEG-4编码,产生的文件不会特别大,文件扩展名应为.m4v
cv2.VideoWriter_fourcc(*'THEO'), 该参数是Ogg Vorbis,产生的文件相对较大,文件名后缀为.ogv
cv2.VideoWriter_fourcc(*'FLV1'), 该参数是Flash视频,产生的文件相对较大,文件名后缀为.flv
cv2.VideoWriter_fourcc(*'MJPG'), 该参数是motion-jpeg编码,产生的文件较大,文件名后缀为.avi
cv2.VideoWriter_fourcc(*'I420'), 该参数是未压缩的YUV编码,4:2:0色度子采样,这种编码广泛兼容,但会产生特别大的文件,文件扩展名应为.avi