Кадр не прибыл в течение 5000 при чтении файла .bag - pyrealsense2 - PullRequest
0 голосов
/ 21 октября 2019

Я пытаюсь прочитать кадры в файлах .bag с pyrealsense2. Я последовал за read_bag_example от Intel. Вот полный пример кода, который я использую.

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: кадр не поступил в пределах 5000

Я искал много часов, но не смог найти решение, которое решило бы мою проблему.

Я также использую

  • Версия прошивки Intel - 5.11.15.0
  • Python - 3.6.8
  • pyrealsense2 - 2.24.0.965
  • D435 с 848x480, 90 FPS images

Я мог бы добавить больше информации, если вам нужно. Любая помощь или другие предложения будут очень ценны!

1 Ответ

0 голосов
/ 31 октября 2019

Проблема связана с временем воспроизведения из 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

Как можно видеть выше, в то время как цикл немного изменился, чтобы гарантировать, что собранный кадр сначала обрабатывался довзятие нового кадра с playback.pause() и playback.resume().

TL; DR:

Вам следует установить playback.set_real_time(False), если вы получаете непоследовательное количество кадровв файле .bag.

...