我想使用python opencv模块以特定的时间间隔保存视频帧

时间:2018-09-27 10:20:27

标签: python opencv video-capture opencv-python

我想使用python opencv模块按特定的时间间隔保存视频帧。

我必须将视频文件分成40张图像。 但是我没有想到算法。

我的想法是:

  1. 输入视频文件。
  2. 计算视频中的帧数和fps。
  3. 返回框架之间的间距。 (长度/ 40)
  4. 同时运行

计数帧数,fps和跳转间​​隔的方法:

length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
fps = cap.get(cv2.CAP_PROP_FPS)

计算完帧数,fps和跳数后(示例):

D:\UCF-101\ApplyEyeMakeup\v_ApplyEyeMakeup_g01_c01.avi's FPS :  25.0
D:\UCF-101\ApplyEyeMakeup\v_ApplyEyeMakeup_g01_c01.avi's Length :  164
D:\UCF-101\ApplyEyeMakeup\v_ApplyEyeMakeup_g01_c01.avi's Running time :  6.56
D:\UCF-101\ApplyEyeMakeup\v_ApplyEyeMakeup_g01_c01.avi's jump :  4 ( 4.1 )

这是while循环:

while count < length and save < 40:
    print("Count : ", count)
    success, frame = cap.read()
    cv2.imshow('Window', frame)
    if count % jump == 0:
        cv2.imwrite(save_path + LabelList[LabelNumber] + "\\" + FileList[FileNumber] + "_" + str(count) + ".jpg", frame)
        save = save + 1
        print("Saved! : ", save)
    cv2.waitKey(1)
    count = count + 1

我遇到了两个问题:

  1. 总长度少于30帧的视频
  2. 没有 3.25帧之类的帧(只有3帧,没有浮点数)

无论如何,如果您对我的问题感兴趣,我将详细教您。 我不知道该怎么说。

重要的是,无论图像的长度如何,我都希望定期保存40张图像。

请帮助我,兄弟...

3 个答案:

答案 0 :(得分:0)

  

没有3.25帧之类的帧(只有3帧,没有浮点数)

如果将jump设置为浮点数,则只需将条件更改为count % jump < 1。帧之间的间距会不均匀,但在每种情况下最终应为40帧。

  

总长度少于30帧的视频。

如果帧数为<= 40,只需将jump设置为1,您将获得所有可用的帧。

答案 1 :(得分:0)

cap = cv2.VideoCapture(vidoname)

time_skips = float(2000) #skip every 2 seconds. You need to modify this

count = 0
success,image = cap.read()
while success:
    cv2.imwrite("frame%d.jpg" % count, image)     
    cap.set(cv2.CAP_PROP_POS_MSEC,(count*time_skips))    # move the time
    success,image = cap.read()
    count += 1

# release after reading    
cap.release()

答案 2 :(得分:0)

如果要获取特定间隔的帧

import cv2

cap = cv2.VideoCapture("E:\\VID-20190124-WA0016.mp4")

count = 0

while cap.isOpened():

ret, frame = cap.read()

if ret:
    cv2.imwrite('D:\\out2\\frame{:d}.jpg'.format(count), frame)
    count += 30 # i.e. at 30 fps, this advances one second
    cap.set(1, count)
else:
    cap.release()
    break