从 OpenCV 中的 VideoCapture 中读取每第 n 帧

新手上路,请多包涵

是否可以逐步从视频中读取帧(例如,我想读取视频流的每五帧)。目前我正在这样做作为一种解决方法,但它不是很有效。

 bool bSuccess
int FramesSkipped = 5;
 for (int a = 0;  < FramesSkipped; a++)
      bSuccess = cap.read(NextFrameBGR);

有什么建议让我不必遍历五个帧来获得所需的帧吗?

原文由 user3079474 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 848
2 个回答

恐怕您无能为力,这不仅仅是 OpenCV 的缺点。你看,现代视频编解码器通常是复杂的野兽。为了获得更高的压缩率,帧的编码通常取决于之前的帧,有时甚至是连续的帧。

因此,大多数情况下,即使您不需要它们,您也必须在所需帧之前解码帧。

专门编码视频文件有相当重要的技巧,因此获取每第 N 帧会很便宜,但在一般情况下这是不可行的。

也就是说,您可以尝试 OpenCV 提供的搜索功能(请参阅 OpenCV Seek Function/Rewind )。根据具体情况,它可能(也可能不会)工作得更快。但是,就个人而言,我不会打赌。

原文由 Sergei Nosov 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以通过阅读然后丢弃它来有效地“跳过”一帧。当然,这 并不 完全符合您的要求,但仍然可以作为一种解决方法。显然,这会对性能产生影响,但可能足以满足您的目的。

 vs = cv2.videoCapture('/my/clip.mp4')

for i in (thing):
    # Read a frame
    _, frame = vs.read()
    # Skip the frame you just read by reading another
    _, frame = vs.read()
    # Run a process on said frame
    cv2.imshow("Window", frame)


vs.release()

原文由 Johnny 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题