【问题标题】:I want to save the frames of video at certain time intervals using python opencv module我想使用 python opencv 模块以特定时间间隔保存视频帧
【发布时间】:2018-09-27 10:20:26
【问题描述】:

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

请帮帮我兄弟...

【问题讨论】:

    标签: python opencv video-capture opencv-python


    【解决方案1】:

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

    如果您将jump 设为浮点数,则只需将您的条件更改为count % jump &lt; 1。帧之间的间距会不均匀,但每种情况下应该有 40 帧。

    总长度小于 30 帧的视频。

    如果帧数 jump 设置为 1,您将获得所有可用帧。

    【讨论】:

    • 第二个问题,如果我设置jump = 1,那么我只能得到30张图片。我需要正好 40 张图片。
    • 制作 40 帧的目标是什么。你想重复一些帧吗?你想插入帧吗?你能重复最后一帧直到你达到 40 吗?从问题中不清楚
    • 感谢您的回答!我放弃了从那些视频中提取图像!
    【解决方案2】:
    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()
    

    【讨论】:

      【解决方案3】:

      如果您想获取特定间隔的帧

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-20
        • 2019-10-10
        • 1970-01-01
        • 2015-10-01
        • 2018-08-28
        • 1970-01-01
        • 1970-01-01
        • 2020-08-21
        相关资源
        最近更新 更多