是否可以逐步从视频中读取帧(例如,我想读取视频流的每五帧)。目前我正在这样做作为一种解决方法,但它不是很有效。
bool bSuccess
int FramesSkipped = 5;
for (int a = 0; < FramesSkipped; a++)
bSuccess = cap.read(NextFrameBGR);
有什么建议让我不必遍历五个帧来获得所需的帧吗?
原文由 user3079474 发布,翻译遵循 CC BY-SA 4.0 许可协议
是否可以逐步从视频中读取帧(例如,我想读取视频流的每五帧)。目前我正在这样做作为一种解决方法,但它不是很有效。
bool bSuccess
int FramesSkipped = 5;
for (int a = 0; < FramesSkipped; a++)
bSuccess = cap.read(NextFrameBGR);
有什么建议让我不必遍历五个帧来获得所需的帧吗?
原文由 user3079474 发布,翻译遵循 CC BY-SA 4.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 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
恐怕您无能为力,这不仅仅是 OpenCV 的缺点。你看,现代视频编解码器通常是复杂的野兽。为了获得更高的压缩率,帧的编码通常取决于之前的帧,有时甚至是连续的帧。
因此,大多数情况下,即使您不需要它们,您也必须在所需帧之前解码帧。
专门编码视频文件有相当重要的技巧,因此获取每第 N 帧会很便宜,但在一般情况下这是不可行的。
也就是说,您可以尝试 OpenCV 提供的搜索功能(请参阅 OpenCV Seek Function/Rewind )。根据具体情况,它可能(也可能不会)工作得更快。但是,就个人而言,我不会打赌。