April682 2024-04-18 18:45 采纳率: 33.3%
浏览 17

orbbec python sdk回放bag时,红外图像分辨率减半

我在使用orbbec python sdk进行bag录制的时候,启动了红外、彩色、深度三个数据流,其中红外分辨率设置的640×400,可以正常进行录制,但是在回放bag的时候,深度和彩色分辨率是正确的,唯独红外分辨率变成了320×400,并且弹出了警告,我换台电脑也是这种情况,就很奇怪,不管我把录制时的红外分辨率改成多少,回放之后的宽都会减半1280x800变640×800,640x400变320×400。我该怎么解决呢?
报错内容:[04/18 15:29:56.375922][warning][37672][RecorderPlayback.cpp:418] Playback frame datasize is different realloc buffer manager frame type:11,current buffer manager size:183068, get frame datasize:184516

录制代码:

img

回放代码:

img

深度帧转深度图、红外帧转红外图函数代码:

img

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-18 18:45
    关注

    引自免费微信小程序:皆我百晓生

    根据您提供的代码和描述,看起来在回放时红外图像的分辨率确实被减半。这可能是因为回放过程中数据缓冲区的大小与实际接收到的数据大小不符导致的问题。通常,这种错误提示意味着在回放时接收到的帧数据量比预期的要大。

    为了解决这个问题,您可以尝试更新您的Orbbec SDK到最新版本,因为这可能是由于驱动程序或库中的一个已知bug引起的。如果您已经使用的是最新版本,那么我们可以通过修改回放代码来动态地调整缓冲区大小来解决这个问题。

    首先,确保您的get_ir_image()函数能正确处理不同格式的红外图像。然后,在回放代码中添加一些额外的逻辑来检查红外帧的尺寸,并相应地调整缓冲区大小。下面是修改后的回放代码示例:

    import cv2
    import numpy as np
    
    def get_ir_image(ir_frame):
        # ... 略去其他部分,保持不变 ...
    
    def main():
        try:
            # 初始化回放
            # ...
            
            while True:
                frames = playback.read()
                
                if not frames:
                    continue
                
                # 获取深度帧
                depth_frame = frames.get_depth_frame()
                if depth_frame is not None:
                    depth_image = get_depth_image(depth_frame)
                    cv2.imshow("depth", depth_image)
    
                # 获取彩色帧
                color_frame = frames.get_color_frame()
                if color_frame is not None:
                    color_image = frame_to_bgr_image(color_frame)
                    cv2.imshow("color", color_image)
    
                # 获取红外帧
                ir_frame = frames.get_ir_frame()
                if ir_frame is not None:
                    width = ir_frame.get_width()
                    height = ir_frame.get_height()
    
                    # 根据红外帧的尺寸创建一个新的缓冲区
                    ir_data = np.zeros((height, width), dtype=np.uint8)
    
                    # 将原始数据复制到新缓冲区
                    ir_data[:height, :width] = np.frombuffer(ir_frame.get_data(), dtype=np.uint8).reshape(height, width)
    
                    ir_image = get_ir_image(ir_frame)
                    cv2.imshow("ir", ir_image)
    
        except Exception as e:
            print(f"Error: {str(e)}")
    
        finally:
            # 清理资源
            # ...
    
    if __name__ == "__main__":
        main()
    

    这段代码的主要变化在于获取红外帧后,我们先获取其宽度和高度,然后创建一个对应尺寸的新缓冲区。接着,我们将原始的红外数据复制到这个新缓冲区中。这样做的目的是为了避免因缓冲区大小不匹配而产生的错误。

    注意,这里假设红外帧的原始数据是以字节(uint8)存储的。如果不是这样,您需要相应地调整缓冲区的类型和大小。此外,如果红外帧的格式为 MJPG,您可能还需要在读取数据后解码它,就像在get_ir_image()函数中那样。

    如果上述方法仍无法解决问题,建议您联系Orbbec的官方支持,因为他们可能能提供更具体的帮助,包括查看日志文件,确认是否存在硬件兼容性问题或其他SDK相关问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月18日

悬赏问题

  • ¥30 STM32 INMP441无法读取数据
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境