繁体   English   中英

OpenCV/Python - 获取特定的帧范围,CAP_PROP_POS_FRAMES 不起作用

[英]OpenCV/Python - get specific frame ranges, CAP_PROP_POS_FRAMES not working

我需要从一个视频中获取一些连续帧组。 这些组都是由相同数量的帧组成的,它们是连续的,所以像:

[10, 11, 12, 13, 14, 15],
[32, 33, 34, 35, 36, 37],
[123, 124, 125, 126, 127, 128]

这只是一个例子,就我而言,我事先并不知道索引的范围,它们是在代码执行期间提供的!

每次我必须提取给定范围内的帧时,我都尝试使用(例如,如建议的here )此代码

video_capture = cv2.VideoCapture(video_path)
for frame_id in frames_range:
    video_capture.set(cv2.CAP_PROP_POS_FRAMES, frame_ind)
    success, image = video_capture.read()
    if not success:
        logging.warning(f"Error reading frame {frame_id}", frame_ind)
    # do something with frames

但这不起作用,我通常总是得到视频的前 N 帧(N 是范围的长度,在我的示例中为 6)。
我读到 video_capture.set 在某些情况下可能由于视频压缩而失败,事实上,在使用这种方法读取某些视频帧时我遇到了一些错误。

另一个简单的方法是 go 每次通过视频逐帧,select 是我需要的:

def get_required_frames(frames_range: list, video_cap) -> list:
    frames = []
    frame_counter = 0
    while True:
        ret, frame = video_cap.read()
        if not ret:
            return []
        # collect frames in selected range
        if frame_counter in frames_range:
            frames.append(frame)
        # after selected range, stop loop
        if frame_counter > frames_range[-1]:
            break
        frame_counter += 1
    return frames 

# every time I get the required range, I call this function
frames = get_required_frames(frames_range, cv2.VideoCapture(video_path))
# do something with frames

第二种方法工作正常,但有点慢,因为我必须从第 0 帧开始遍历整个视频,直到每次都达到当前帧范围(有些视频可能很长)。 考虑到帧范围总是连续的,有没有办法让视频......“挂起”,这样至少我可以从上一个帧范围中使用的最后一个 position 重新开始?

我不确定这是否是在简化本文代码时创建的错字,但这似乎是错误的:

for frame_id in frames_range:
    video_capture.set(cv2.CAP_PROP_POS_FRAMES, frame_ind)

您从“frames_range”获取“frame_id”,但随后将 video_capture 的索引设置为“frame_ind”。

如果这不是问题,那么是的,你是对的 - 通过 'CAP_PROP_POS_FRAMES' 设置帧索引不一定可靠。 在回答您的问题时,如果您可以让 video_capture '挂起',答案是肯定的。 您应该能够执行以下操作:

cap = cv2.VideoCapture(video_path)
frames = get_required_frames(frames_range, cap)

当你再次阅读“cap”时,它应该是你离开它的地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM