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

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 要求把带有文件的上级文件夹改成文件的名字。要求BAT
  • ¥30 不会,学习,有偿解答
  • ¥15 SQL查询语句报错(检查)
  • ¥15 此表中公式应该怎么写
  • ¥15 求HI-TECH PICC 9.50 PL3安装包
  • ¥15 在Windows中运行ollama出现运行缓慢的情况
  • ¥15 下载ctorch报错,求解
  • ¥15 如何将这段css代码应用于wordpress的elementor的单个小部件中显示,而不是整个网站全局显示。
  • ¥15 如何入门学习c语言,单片机
  • ¥15 idea 编辑语言的选择