如何在外部应用读取Realsense bag文件时判断读取已完成?
问题根因
你使用的实例分割仓库默认将RealSense输入视为实时在线流处理,读取bag文件时默认开启了重复播放参数,因此读完整个bag文件后会自动重头加载,导致无限循环。
修改实现步骤
- 关闭bag重复播放配置
找到仓库中RealSense bag文件加载的代码段,修改enable_device_from_file方法的入参,关闭重复播放:
# 原代码一般为 rs.config.enable_device_from_file(bag_path),添加第二个参数即可 config.enable_device_from_file(bag_path, repeat_playback=False)
- 添加bag读取结束判断逻辑
在pipeline初始化完成后获取playback对象,用于判断文件是否读取完成,同时可以关闭实时播放模式避免处理速度慢导致丢帧:
pipeline = rs.pipeline() config = rs.config() config.enable_device_from_file(bag_path, repeat_playback=False) profile = pipeline.start(config) # 获取播放控制对象 playback = profile.get_device().as_playback() # 关闭实时播放,保证所有帧都会被处理 playback.set_real_time(False)
在逐帧读取的循环中添加状态判断,检测到播放停止时直接跳出循环:
while True: # 原有帧读取、推理代码 # 新增结束判断 if playback.current_status() == rs.playback_status.stopped: break
- 新增MP4输出逻辑
在帧循环开始前初始化OpenCV的视频写入对象,每处理完一帧就写入,循环结束后释放资源即可:
import cv2 # 输出参数按需调整,fps可和bag文件的录制帧率对齐,frame_size为你推理输出图像的宽高 fps = 30 frame_size = (1280, 720) video_writer = cv2.VideoWriter("output.mp4", cv2.VideoWriter_fourcc(*'mp4v'), fps, frame_size) # 帧处理循环中,推理绘制完成后写入帧 video_writer.write(result_frame) # 循环结束后释放 video_writer.release()
内容的提问来源于stack exchange,提问作者Akshay Acharya
相关产品推荐
相关产品推荐

