读取 .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)
。
我正在尝试使用 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)
。