【问题标题】:Parse video at lower frame rate以较低的帧速率解析视频
【发布时间】:2018-11-05 11:38:30
【问题描述】:

我目前正在做一个项目,我需要解析视频并将其传递给多个模型。视频以 60fps 的速度播放。我不需要通过模型运行每一帧。我在尝试跳过不需要的帧时遇到了一些问题。我尝试了两种相当慢的方法。

方法一代码sn-p: 这里的问题是我仍在阅读视频的每一帧。只有每 4 帧通过我的模型。

  cap = cv2.VideoCapture(self.video)    
    while cap.isOpened():
                    success, frame = cap.read()

                    if count % 4 !=0:
                        count += 1
                        continue

                    if success:
                        ''Run frame through models''
                    else:
                        break

方法2代码sn-p: 这种方法比较慢。在这种情况下,我试图避免阅读不必要的帧。

cap = cv2.VideoCapture(video)
count=0

while True:

    if count % 4 != 0:
        cap.set(cv2.CV_CAP_PROP_POS_FRAMES, count*15)
        count+=1
        success, frame = cap.read()

任何关于如何以最有效的方式实现这一目标的建议将不胜感激。

【问题讨论】:

    标签: python opencv computer-vision video-processing


    【解决方案1】:

    由于视频压缩的工作原理,通过更改 CV_CAP_PROP_POS_FRAMES 获取和设置帧并不准确(而且速度很慢):通过使用关键帧。

    完全不使用 read() 函数可能会有所帮助。而是使用grab() 并且只retrieve() 需要的帧。来自documentation(读取)方法/函数在一次调用中结合了 VideoCapture::grab() 和 VideoCapture::retrieve()。

    grab() 获取帧数据,retrieve() 对其进行解码(计算量大的部分)。您可能想要做的只是抓取您想要跳过的帧而不是检索它们。

    根据您的系统和 opencv 构建,您还可以使用硬件加速让 ffmpeg 解码视频。

    【讨论】:

      【解决方案2】:

      据我所知,您正在尝试每四帧处理一次。您正在使用条件:

      if count % 4 != 0
      

      而是在 4 帧中触发 3 帧(您正在处理第 1、2、3、5、6、7 帧等)!反其道而行之:

      if count % 4 == 0
      

      虽然代码 sn-ps 这两种方法似乎并不处理相同的帧。尽管在这两种情况下,您的计数器似乎在每一帧中都增加了 1,但您实际上在第二种情况下指向了该计数器的 15xframe (cap.set(cv2.CV_CAP_PROP_POS_FRAMES, count*15).

      您的代码中还有一些 cmets(也许我误解了一些东西):

      案例一:

      while cap.isOpened():
                      success, frame = cap.read()
                      if count % 4 !=0:
                          count += 1
                          continue
      

      在这里,您似乎只计算了一些帧(如前所述 4 帧中的 3 帧),因为跳过了 4 的倍数的帧:在这种情况下不满足条件 count % 4 !=0 并且尽管您读取了一帧,但您的计数器未更新.所以,你这里有一个不准确的计数器。它没有显示你如何以及在哪里处理你的框架来判断那部分。

      案例 2:

      while True:
          if count % 4 != 0:
              cap.set(cv2.CV_CAP_PROP_POS_FRAMES, count*15)
              count+=1
              success, frame = cap.read()
      

      只有在满足条件时才读取帧,因此在此代码 sn-p 中,您实际上并未读取任何帧,因为第 0 帧不会触发条件!如果您在 if 范围之外更新计数器,则此处不清楚。但如果你这样做,你也应该在那里阅读一个框架。无论如何,应该透露更多的代码。

      作为一般建议,您应该在每次读取帧时更新计数器。

      【讨论】:

      • 我为方法 1 编辑了上面的代码。我这样做的原因是“如果 count % 4 !=0”是因为我是“继续所有 count % 4 不等于零的情况”。这导致每 4 帧被分析一次。除非我弄错了。
      • 你应该把count += 1放在条件之前。计算每一帧,而不仅仅是跳过的帧。
      【解决方案3】:

      而不是对帧数设置阈值,这将使 opencv 处理所有帧(您正确指出,这会减慢视频处理速度),最好使用 CAP_PROP_POS_MSEC link 并将该处理卸载到 @987654323 @。通过使用此选项,您可以将cv2 配置为每 n 毫秒采样 1 帧。因此,在 vidcap.set(cv2.CAP_PROP_POS_MSEC, (frame_count * subsample_rate)) 中设置 subsample_rate=1000 将每 1 秒采样 1 帧(因为 1000 毫秒等于 1 秒)。希望这能提高您的视频处理速度。

      def extractImagesFromVideo(path_in, subsample_rate, path_out, saveImage, resize=(), debug=False):
          vidcap = cv2.VideoCapture(path_in)
          if not vidcap.isOpened():
              raise IOError
      
          if debug:
              length = int(vidcap.get(cv2.cv2.CAP_PROP_FRAME_COUNT))
              width  = int(vidcap.get(cv2.cv2.CAP_PROP_FRAME_WIDTH))
              height = int(vidcap.get(cv2.cv2.CAP_PROP_FRAME_HEIGHT))
              fps    = vidcap.get(cv2.cv2.CAP_PROP_FPS)
              print 'Length: %.2f | Width: %.2f | Height: %.2f | Fps: %.2f' % (length, width, height, fps)
      
          success, image = vidcap.read() #extract first frame.
          frame_count = 0
          while success:
              vidcap.set(cv2.CAP_PROP_POS_MSEC, (frame_count*subsample_rate))
              success, image = vidcap.read()
              if saveImage and np.any(image):
                  cv2.imwrite(os.path.join(path_out, "%s_%d.png" % (frame_count)), image)
              frame_count = frame_count + 1
          return frame_count
      

      【讨论】:

      • @dsBoulder 这对您的处理速度有帮助吗?你能在这里发布一些基准数字吗?会对其他人有所帮助。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 2020-11-12
      • 2018-08-13
      相关资源
      最近更新 更多