读取 .bag 文件时帧未在 5000 以内到达 - pyrealsense2

Frame didn't arrived within 5000 while reading .bag file - pyrealsense2

我正在尝试使用 pyrealsense2 读取 .bag 文件中的帧。我关注了 Intel 的 read_bag_example。这是我正在使用的代码的完整示例。

import numpy as np
import pyrealsense2 as rs
import os
import time
import cv2

i = 0
try:
    config = rs.config()
    rs.config.enable_device_from_file(config, "D:/TEST/test_4.bag", repeat_playback=False)
    pipeline = rs.pipeline()
    pipeline.start(config)

    while True:
        frames = pipeline.wait_for_frames()
        depth_frame = frames.get_depth_frame()
        if not depth_frame:
            continue
        depth_image = np.asanyarray(depth_frame.get_data())

        color_image = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)

        cv2.imwrite("D:/TEST/image/" + str(i) + ".png", color_image)
        i += 1
finally:
    pass

代码有效。但是我通过 realsense-viewer 检查了帧数,它的输出是 890 帧。但是,此代码的输出始终在 500-770 的 范围内变化并引发错误:

RuntimeError: Frame didn't arrived within 5000

我搜索了很多小时,但找不到能够解决我的问题的解决方案。

我也在用

  • 英特尔固件版本 - 5.11.15.0
  • Python - 3.6.8
  • pyrealsense2 - 2.24.0.965
  • D435 848x480,90 FPS 图像

如果您需要,我可以添加更多信息。任何帮助或其他建议将不胜感激!

问题是关于 pyrealsense2 播放时间 。模块会自动分配它,就好像它们是 实时 一样。设置配置文件和设置播放时间解决了问题。以下是适用于 848x480-90FPS 的示例代码。

i = 0
try:
    config = rs.config()
    rs.config.enable_device_from_file(config, "D:/TEST/test_4.bag", repeat_playback=False)
    pipeline = rs.pipeline()
    profile = pipeline.start(config)
    playback = profile.get_device().as_playback()
    playback.set_real_time(False)

    while True:

        frames = pipeline.wait_for_frames()
        playback.pause()
        depth_frame = frames.get_depth_frame()
        if not depth_frame:
            continue
        depth_image = np.asanyarray(depth_frame.get_data())

        color_image = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)
        cv2.imwrite("D:/TEST/image/" + str(i) + ".png", color_image)
        i += 1
        playback.resume()

except RuntimeError:
    print("There are no more frames left in the .bag file!")


finally:
    pass

如上所示,while 循环略有变化,以确保在使用 playback.pause()playback.resume().

获取新帧之前首先处理收集到的帧

TL;DR:

如果 .bag 文件中的帧数不一致,您应该设置 playback.set_real_time(False)