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

 

posted @ 2022-07-06 16:40  谷小雨  阅读(1527)  评论(0编辑  收藏  举报