首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenCV/Python -获得特定的帧范围,CAP_PROP_POS_FRAMES不能工作

OpenCV/Python -获得特定的帧范围,CAP_PROP_POS_FRAMES不能工作
EN

Stack Overflow用户
提问于 2022-09-27 13:36:58
回答 1查看 55关注 0票数 0

我需要从一个视频中得到几组连续的帧。这些组都是由相同数量的帧组成的,它们是连续的,因此类似于:

代码语言:javascript
运行
复制
[10, 11, 12, 13, 14, 15],
[32, 33, 34, 35, 36, 37],
[123, 124, 125, 126, 127, 128]

--这只是一个例子,在我的例子中,我事先不知道索引的范围,它们是在代码执行过程中提供的!

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

代码语言:javascript
运行
复制
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可能会失败,事实上,在使用这种方法读取某些视频帧时,我遇到了一些错误。

另一种简单的方法是每次逐帧浏览视频,并选择我需要的视频:

代码语言:javascript
运行
复制
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帧一直浏览到当前的帧范围(有些视频可能很长)。考虑到帧范围总是连续的,是否有任何方法让视频.“挂起”,这样我至少可以从前一帧范围内使用的最后一个位置重新开始吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-27 14:49:20

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

代码语言:javascript
运行
复制
for frame_id in frames_range:
    video_capture.set(cv2.CAP_PROP_POS_FRAMES, frame_ind)

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

如果这不是问题所在,那么是的,通过'CAP_PROP_POS_FRAMES‘设置框架索引并不一定是可靠的。在回答你的问题时,如果你能让video_capture‘悬着’,答案是肯定的。您应该能够做到以下几点:

代码语言:javascript
运行
复制
cap = cv2.VideoCapture(video_path)
frames = get_required_frames(frames_range, cap)

当你再次读到“帽子”的时候,它应该是你离开它的地方。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73868563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档