3

我想使用 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 张图像。

请大哥帮帮我...

4

3 回答 3

1

没有像 3.25 帧那样的帧(只有 3 帧,不是浮点数)

如果您进行jump浮动,则只需将您的条件更改为count % jump < 1. 你会得到帧之间的不均匀间距,但在每种情况下都应该有 40 个帧。

总长度小于 30 帧的视频。

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

于 2018-09-27T10:33:34.140 回答
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()
于 2020-01-15T10:46:29.663 回答
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
于 2020-06-27T06:15:38.137 回答