X5平台双目立体视觉模型,输出的深度图分辩率可选择么

用的X5 RDK 官方的套件,相机是RDK官方230AI MIPI双目相机,想咨询下X5平台双目立体视觉模型,输出的深度图分辩率可选择么,还是目前模型只支持640x480这个级别

根据您在论坛中提出的问题:“X5平台双目立体视觉模型,输出的深度图分辨率可选择么,还是目前模型只支持640x480这个级别”,结合社区讨论和官方文档信息,以下是综合解答:


:white_check_mark: 结论:深度图分辨率目前不支持动态调整,固定为 640×352(或 640×532)

从社区用户分享的经验来看:

  • 官方推荐的启动命令中明确指定了 mipi_image_width:=640mipi_image_height:=352(或 532),这表明输入图像分辨率是固定的
  • 深度图输出分辨率与输入图像分辨率一致,即默认为 640×352
  • 在某些配置下(如使用 mipi_image_height:=532),深度图分辨率会相应调整为 640×532,但无法自定义其他分辨率

:pushpin: 注意:有用户提到“1280×640”是相机节点的输出图像分辨率,并非深度图分辨率。深度图分辨率由算法模型决定,且目前版本不支持动态切换。


:hammer_and_wrench: 如何调整分辨率?

虽然模型本身不支持任意分辨率,但可以通过以下方式尝试调整:

1. 修改启动参数

在启动双目深度节点时,通过修改 mipi_image_widthmipi_image_height 参数,可以改变输入图像分辨率,从而间接影响深度图分辨率:

ros2 launch hobot_stereonet stereonet_model_web_visual_v2.launch.py \
    mipi_image_width:=640 \
    mipi_image_height:=532 \
    need_rectify:=False \
    height_min:=-10.0 \
    height_max:=10.0 \
    pc_max_depth:=5.0

:warning: 请确保您的摄像头模组支持该分辨率(如 RDK 官方 230AI MIPI 双目相机通常支持 640×352 或 640×532)。

2. 使用 V3 版本启动文件

官方 GitHub 仓库 D-Robotics/hobot_stereonet 提供了更新的 V3 版本启动文件,可能支持更多配置选项。建议尝试:

ros2 launch hobot_stereonet stereonet_model_web_visual_v3.launch.py \
    ...

3. 调整帧率(FPS)

默认帧率为 10 FPS,可通过以下参数提升至 13 FPS(满载 BPU):

mipi_image_framerate:=13.0

:red_exclamation_mark: 常见问题与解决方案

  1. 日志报错 Failed to create log directory: /userdata/.roslog

    • 解决方法:手动创建目录并赋权:
      sudo mkdir -p /userdata/.roslog
      sudo chmod 777 /userdata/.roslog
      
  2. gdc bin file open failed

    • 可忽略,官方模组已标定,此错误不影响功能。
  3. 深度图效果不佳

    • 建议重新标定摄像头(若使用非官方模组)。
    • 尝试使用官方提供的 V3 版本模型和启动文件。

:books: 参考资料


:light_bulb: 建议

如果您需要更高分辨率的深度图(如 1280×640),目前官方模型不支持。建议:

  • 等待后续版本更新;
  • 自行修改模型输入尺寸(需具备深度学习和嵌入式开发能力);
  • 或联系 D-Robotics 官方技术支持获取更详细的定制方案。

感谢您的提问!希望以上信息能帮助您解决问题。如果还有其他疑问,欢迎继续交流! :blush:

我现在只是想试一下用官方模型,不用resize,原分辨率输入输出,没看到相关如何配置的说明

感谢您的补充说明!您希望使用官方模型,不进行任何分辨率缩放(resize),保持原生输入输出分辨率,并想知道如何配置。


:white_check_mark: 核心结论再次强调:

当前官方双目立体视觉模型(hobot_stereonet)默认支持的深度图分辨率为 640×352(或 640×532),且不支持动态调整分辨率。
您无法通过配置参数“自由选择”如 1280×640 或其他任意分辨率 —— 因为这是由算法模型和硬件加速(BPU)的架构决定的。


:hammer_and_wrench: 如何“原分辨率”运行?—— 实际可行方案

虽然不能“自定义分辨率”,但您可以让系统使用摄像头模组支持的原始分辨率,并确保深度图输出与之匹配。以下是具体操作步骤:


:wrench: 步骤一:确认摄像头模组支持的分辨率

根据官方文档和社区经验,RDK X5 官方 230AI MIPI 双目相机通常支持以下分辨率:

  • 640×352(推荐用于低功耗、高帧率)
  • 640×532(部分型号支持,可提升垂直方向精度)

:light_bulb: 您可以在终端执行:

ros2 topic echo /image_raw

查看实际发布的图像尺寸,确认当前使用的分辨率。


:clipboard: 步骤二:修改启动命令以使用原生分辨率

:white_check_mark: 推荐启动命令(使用 640×532 分辨率,更接近“原生”)

ros2 launch hobot_stereonet stereonet_model_web_visual_v2.launch.py \
    mipi_image_width:=640 \
    mipi_image_height:=532 \
    need_rectify:=False \
    height_min:=-10.0 \
    height_max:=10.0 \
    pc_max_depth:=5.0 \
    mipi_image_framerate:=13.0

:warning: 注意:mipi_image_height:=532 是为了适配某些摄像头模组的物理分辨率,不是“任意设置”。请确保您的摄像头模组确实支持该分辨率。


:counterclockwise_arrows_button: 步骤三:如果想用 640×352(最稳定)

ros2 launch hobot_stereonet stereonet_model_web_visual_v2.launch.py \
    mipi_image_width:=640 \
    mipi_image_height:=352 \
    need_rectify:=False \
    height_min:=-10.0 \
    height_max:=10.0 \
    pc_max_depth:=5.0 \
    mipi_image_framerate:=10.0

:puzzle_piece: 步骤四:使用 V3 版本启动文件(可能支持更多配置)

官方 GitHub 提供了更新版本的启动文件,建议尝试:

ros2 launch hobot_stereonet stereonet_model_web_visual_v3.launch.py \
    mipi_image_width:=640 \
    mipi_image_height:=532 \
    need_rectify:=False \
    height_min:=-10.0 \
    height_max:=10.0 \
    pc_max_depth:=5.0 \
    mipi_image_framerate:=13.0

:pushpin: 查看 GitHub 仓库中的 launch/ 目录,确认是否有 stereonet_model_web_visual_v3.launch.py 文件。


:red_question_mark: 为什么没有 1280×640 的深度图?

在社区讨论中已明确指出:

“1280×640”是相机节点输出的原始图像分辨率,并非深度图分辨率。
深度图是由立体视觉算法生成的,其分辨率由模型结构和硬件加速能力限制,目前仅支持 640×352 或 640×532


:pushpin: 建议总结

项目 说明
是否支持自定义分辨率? :cross_mark: 不支持,固定为 640×352 或 640×532
如何“原分辨率”运行? 使用 mipi_image_widthmipi_image_height 参数指定摄像头支持的分辨率
推荐配置 640×532 + 13 FPS(满载 BPU,适合实时应用)
是否需要重新标定? 否,官方模组已标定,可忽略 gdc bin file open failed 错误
日志目录错误? 手动创建 /userdata/.roslog 并赋权

:books: 参考链接


如果您只是想“试一下官方模型,不做任何修改”,那么:

:white_check_mark: 直接使用默认参数即可 —— 即使不显式设置分辨率,系统也会自动使用 640×352(或 640×532,取决于摄像头型号)。

:bullseye: 最终目标:让深度图输出与摄像头输入分辨率一致,无需 resize,且功能正常。


如有进一步问题(如如何查看当前图像分辨率、如何调试节点等),欢迎继续提问!我会为您一步步指导 :blush:

祝您调试顺利,早日获得理想的深度图效果!

深度图分辨率目前不支持动态调整,固定为 640×352(或 640×532),这个可不太够用,改分辨率需要自己训练吗?现需求是720p或者1080p

您提出的问题非常关键 —— 当前官方双目立体视觉模型(hobot_stereonet)确实不支持动态调整深度图分辨率,且默认仅支持 640×352 或 640×532,无法直接输出 720p(1280×720)或 1080p(1920×1080)


:red_question_mark: 您的核心疑问:

“改分辨率需要自己训练吗?现需求是720p或者1080p”

:white_check_mark: 简短回答:

  • 是的,若想获得 720p 或 1080p 的深度图,目前必须自行修改/重新训练模型,并适配硬件加速(BPU)架构。
  • 官方模型是为嵌入式设备优化的,分辨率受限于模型结构、内存和算力,不支持任意扩展。
  • 如果您只是“试用”,建议先接受当前 640×352/532 分辨率;如果项目要求高精度或大范围感知,则需定制开发

:puzzle_piece: 为什么不能直接改分辨率?

1. 模型输入尺寸固定

  • 立体视觉算法(如 DStereoV2.1)在训练时使用的是固定尺寸输入(如 640×352),网络结构依赖该尺寸。
  • 若强行输入 1280×720,会导致:
    • Tensor shape 不匹配 → 报错 tensor type unsupported
    • 推理失败 → cv::Exception: Assertion failed

2. 硬件加速限制(BPU)

  • RDK X5 的 BPU 是为特定模型和分辨率设计的,不支持任意分辨率的实时推理
  • 即使您能修改代码,也可能因内存不足、计算超载而崩溃。

3. 深度图生成方式

  • 深度图不是从原始图像“缩放”得到的,而是通过立体匹配 + 算法推理生成的。
  • 输出分辨率由特征提取层和代价体积结构决定,不是简单插值可解决。

:hammer_and_wrench: 可行方案对比

方案 是否可行 成本 说明
:white_check_mark: 使用现有参数(640×352/532) :check_mark: 高效稳定 官方推荐,适合大多数场景
:warning: 修改启动参数尝试更高分辨率 :cross_mark: 多数失败 会触发 OpenCV 错误或模型崩溃
:wrench: 自定义模型 + 重新训练 :check_mark: 可行但复杂 需要 PyTorch/TensorFlow + BPU 编译环境
:brain: 使用更高性能平台(如 X86+GPU) :check_mark: 推荐用于研发 中高 可自由设置分辨率,但脱离 RDK X5 平台
:telephone_receiver: 联系 D-Robotics 官方技术支持 :check_mark: 建议 询问是否有未来版本支持更高分辨率

:light_bulb: 如果您坚持要 720p / 1080p,可以这样走:

:white_check_mark: 方案一:在上层应用中对深度图进行插值放大(非推荐)

import cv2
depth_map = ... # 原始 640x352
depth_resized = cv2.resize(depth_map, (1280, 720), interpolation=cv2.INTER_LINEAR)

:warning: 缺点:

  • 插值会丢失细节,深度精度严重下降;
  • 不适用于需要精确距离测量的场景(如机器人避障);
  • 仅作“可视化”用途,不能替代真实深度图。

:white_check_mark: 方案二:自定义模型 + 重新编译部署(高级用户)

步骤概览:

  1. 获取原始模型权重(如 DStereoV2.1.bin)
  2. 修改模型输入尺寸(例如从 640→1280)
  3. 重新训练/微调(可能需要标注数据集)
  4. 使用 ONNX/TFLite 转换并部署到 BPU
  5. 编写 ROS2 节点适配新模型输出

:pushpin: 这需要:

  • 深度学习经验
  • 对 BPU 编译工具链熟悉
  • 有足够算力训练模型
  • 时间成本较高(数周至数月)

:white_check_mark: 方案三:更换硬件平台(推荐用于生产级项目)

如果您对分辨率要求极高(如工业检测、自动驾驶),建议:

  • 使用 X86 平台 + GPU(如 NVIDIA Jetson AGX Orin)
  • 部署开源立体视觉库(如 OpenCV StereoBM/StereoSGBM、MVSNet、DISPARITY)
  • 支持任意分辨率输入输出
  • 性能更强,灵活性更高

:pushpin: 示例:使用 OpenCV 的 StereoSGBM 可轻松实现 1080p 深度图,但需外接摄像头和高性能计算资源。


:books: 官方文档与社区反馈补充

  • RDK DOC - 双目深度算法 中明确指出:

    “当前版本支持的图像输入分辨率为 640×352 或 640×532,深度图输出分辨率与输入一致。”

  • 社区用户 sjh1109790848 曾提到:

    “效果不好,需要重新标定吗?” —— 回答是:不需要,官方模组已标定,问题在于分辨率限制而非标定误差。


:bullseye: 最终建议

您的需求 推荐方案
快速试用,不追求高分辨率 使用默认参数 640×532 + 13 FPS,稳定可靠
项目需要 720p/1080p 深度图 联系 D-Robotics 官方支持,询问是否计划推出高分辨率版本;或考虑更换平台
技术探索 & 自主开发 自行训练模型 + 适配 BPU,适合团队或研究机构
仅用于可视化展示 对原始 640×352 图像进行插值放大,牺牲精度换取视觉效果

:loudspeaker: 温馨提示

虽然当前官方模型不支持高分辨率,但D-Robotics 正在持续迭代其 AI 套件,未来版本很可能支持更多分辨率选项。建议您:

  1. 关注 GitHub - hobot_stereonet
  2. 加入官方开发者社区或邮件列表
  3. 定期检查系统更新(如 apt update && apt upgrade

:man_raising_hand: 如果您希望我帮您进一步规划“如何从零开始训练一个支持 720p 的立体视觉模型”,我可以为您提供详细步骤(包括环境搭建、数据准备、模型修改、BPU部署等)。只需告诉我您的目标平台(如 Ubuntu + ARM64)、是否具备 GPU、以及是否有标注数据。


感谢您的提问!您的需求非常实际 —— 在嵌入式平台上实现高分辨率深度感知是许多项目的痛点。虽然目前受限于硬件和模型架构,但我们可以通过合理选择方案,找到最适合您项目的路径。

如有任何后续问题,欢迎随时交流!:glowing_star:
祝您早日实现 720p/1080p 深度图目标!

双目相机模组内置的标定文件或者参数如何获取?

针对您关于“双目相机模组内置的标定文件或者参数如何获取”的问题,结合社区已有案例和官方机制,解答如下:


:white_check_mark: 核心结论:官方模组标定参数存储在 EEPROM 中,系统自动读取

RDK X5 官方配套的 MIPI 双目相机模组(如 230AI)出厂时已完成标定,标定参数(内参、外参、畸变系数等)直接存储在模组板载的 EEPROM 芯片中。

  • 无需手动获取文件:在使用官方推荐的启动命令(如 hobot_stereonetmipi_cam)时,驱动程序会自动通过 I2C 总线读取 EEPROM 中的标定数据,并在内存中完成图像矫正和深度计算。
  • 默认配置文件路径:虽然日志中常出现 calib_params.yaml 的路径提示(如 /opt/tros/humble/lib/mipi_cam/config/calib_params.yaml),但这通常是备用配置文件。对于官方模组,系统优先使用 EEPROM 中的参数,因此即使该文件缺失或报错 无法打开标定参数文件,通常也不影响功能(可忽略)。

:hammer_and_wrench: 如何查看/验证标定参数?

虽然系统自动调用,但如果您需要查看具体的标定数值(如焦距 $f_x, f_y$、光心 $c_x, c_y$、基线 $baseline$ 等),可以通过以下方式获取:

方法一:通过 ROS2 话题查看(推荐)

在运行双目相机节点后,订阅 /camera_info 或相关话题,即可看到程序读取到的标定参数。

步骤:

  1. 启动相机节点(使用官方命令):

    ros2 launch mipi_cam mipi_cam_dual_channel.launch.py
    

    或者启动立体视觉节点:

    ros2 launch hobot_stereonet stereonet_model_web_visual_v2.launch.py
    
  2. 查看 CameraInfo 消息
    打开新终端,运行:

    ros2 topic echo /left_camera/camera_info
    # 或者
    ros2 topic echo /right_camera/camera_info
    # 有些配置下可能是 /stereo_camera/camera_info
    

    输出示例

    header: ...
    width: 640
    height: 352
    distortion_model: "plumb_bob"
    D: [0.0, 0.0, 0.0, 0.0, 0.0]  # 畸变系数(已矫正则为0)
    K: [fx, 0.0, cx, 0.0, fy, cy, 0.0, 0.0, 1.0]  # 内参矩阵
    R: [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]  # 旋转矩阵
    P: [fx, 0.0, cx, Tx, 0.0, fy, cy, Ty, 0.0, 0.0, 1.0, 0.0]  # 投影矩阵(含基线信息)
    

    :light_bulb: 关键点P 矩阵中的 TxTy 分量与焦距相关,可推算出基线距离(Baseline)。

方法二:通过日志查看

在启动 hobot_stereonet 节点时,日志中会打印读取到的标定参数。

查找关键词

sub rectified fx: ..., fy: ..., cx: ..., cy: ..., base_line: ...

示例日志(来自社区帖子):

[stereonet_model_node-2] [WARN] [StereoNetNode]: => sub rectified fx: 537.179688, fy: 477.493011, cx: 505.432953, cy: 211.237625, base_line: :0.070611

这表明:

  • 焦距 $f_x \approx 537$, $f_y \approx 477$
  • 光心 $(c_x, c_y) \approx (505, 211)$
  • 基线距离 $baseline \approx 0.0706$ 米(70.6mm)

方法三:手动读取 EEPROM(高级用户)

如果节点无法启动,您可以尝试通过 I2C 工具直接读取模组 EEPROM 数据(需知道具体地址和数据结构,通常不推荐,除非官方模组损坏需恢复)。

# 检测 I2C 设备(通常在 bus 4 或 6)
i2cdetect -y -r 4
i2cdetect -y -r 6

:warning: 注意:EEPROM 数据是二进制格式,没有官方解析工具很难直接读懂,建议优先通过 ROS2 话题获取解析后的参数。


:red_question_mark: 常见问题解答

1. 报错 无法打开标定参数文件 calib_params.yaml 怎么办?

  • 原因:程序试图加载默认配置文件,但官方模组优先使用 EEPROM 参数。
  • 解决直接忽略。只要您的模组是官方正品且接线正确,该报错不影响功能。
  • 验证:运行 ros2 topic echo /left_camera/camera_info,如果有数据输出,说明标定参数已正确加载。

2. 使用非官方/自定义双目相机,没有 EEPROM 怎么办?

  • 必须手动标定:您需要使用棋盘格标定法获取内参和外参。
  • 生成配置文件:将标定结果保存为 YAML 文件(参考 OpenCV 标定格式),并修改 launch 文件指向该路径。
  • 参考案例:社区帖子 【摄像头】【RDKX5】为自定义的双目摄像头增加校准参数 讨论了如何为自定义相机添加标定支持。

3. 标定参数不对导致深度图效果差?

  • 检查模组:确认是否为官方模组,排线是否松动。
  • 重新标定:如果是自组相机,需重新标定。
  • 调整参数:在 launch 文件中手动覆盖 camera_info_url 参数指向正确的 YAML 文件。

:books: 参考资源


:light_bulb: 总结建议

场景 操作建议
使用官方模组 无需操作,忽略 calib_params.yaml 报错,系统自动从 EEPROM 读取
查看标定数值 运行节点后,使用 ros2 topic echo /camera_info 或查看启动日志
使用自定义相机 需自行标定并生成 YAML 文件,修改 launch 配置加载
深度图效果异常 先检查排线和供电,再确认标定参数是否被正确加载(通过 topic 验证)

如果您需要具体的标定 YAML 文件模板或标定操作教程,请告诉我,我可以为您提供详细步骤! :blush:

那是怎么单独取左相机的图?好像没有这个topic

针对您“如何单独获取左相机图像”的问题,这是因为官方 MIPI 双目相机驱动默认将左右目图像**拼接(Concat)**后发布,或者在立体视觉节点中内部处理,确实没有直接名为 /left_camera 的独立话题

但这不代表无法获取,您可以通过以下三种方案实现:


:white_check_mark: 方案一:从拼接图像中裁剪(最推荐,简单直接)

官方 mipi_cam 节点发布的 /image_combine_raw 话题通常是将左右图像横向拼接在一起的(例如:左图 640×352 + 右图 640×352 = 总图 1280×352)。

您只需订阅该话题,在代码中将图像一分为二即可。

:snake: Python 代码示例 (ROS2)

import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import cv2
import numpy as np

class StereoSplitter(Node):
    def __init__(self):
        super().__init__('stereo_splitter')
        self.subscription = self.create_subscription(
            Image,
            '/image_combine_raw',  # 官方拼接图话题
            self.listener_callback,
            10)
        self.bridge = CvBridge()

    def listener_callback(self, msg):
        # 1. 转换 ROS 图像为 OpenCV 格式
        cv_image = self.bridge.imgmsg_to_cv2(msg, desired_encoding='nv12') # 注意:官方通常是 nv12 或 bgr8
        
        # 2. 获取图像尺寸
        height, width = cv_image.shape[:2]
        
        # 3. 裁剪左图 (假设是左右横向拼接)
        # 左图区域:x=0 到 width/2
        left_img = cv_image[:, :width//2]
        
        # 右图区域:x=width/2 到 width (如果需要)
        # right_img = cv_image[:, width//2:]

        # 4. 使用或发布
        cv2.imshow("Left Camera", left_img)
        cv2.waitKey(1)

def main(args=None):
    rclpy.init(args=args)
    node = StereoSplitter()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

注意:如果图像是 NV12 格式,裁剪时需注意 Y 和 UV 分量的内存布局,建议先用 cvtColor 转为 BGR 再裁剪,或者确保裁剪行对齐。


:white_check_mark: 方案二:修改 Launch 文件发布独立话题(进阶)

如果您希望 ROS2 系统中直接存在 /left_image 话题,可以修改 mipi_cam 的启动文件,利用 crop 节点或修改驱动参数(如果支持)。

但更通用的方法是使用 image_proccrop 节点对 /image_combine_raw 进行实时裁剪并发布为新话题。

示例思路

  1. 启动 mipi_cam 发布 /image_combine_raw
  2. 启动一个 crop 节点(如 image_view 或自定义节点),订阅 /image_combine_raw,裁剪左半部分,发布到 /left_image_raw

:white_check_mark: 方案三:检查是否有隐藏参数(特定版本)

部分版本的 mipi_cam 包可能支持通过参数控制输出模式。您可以尝试在启动命令中添加参数查看是否有独立输出选项:

# 尝试查看 launch 文件支持的参数
ros2 launch mipi_cam mipi_cam_dual_channel.launch.py --show-args

# 某些版本可能支持输出分离话题(概率较低,但可一试)
ros2 launch mipi_cam mipi_cam_dual_channel.launch.py output_mode:=separate

(注:大多数官方版本默认仅支持拼接输出,此方法不一定有效,请以方案一为主)


:magnifying_glass_tilted_left: 如何确认拼接方式?

在裁剪前,建议先确认图像是如何拼接的(左右拼接还是上下拼接):

  1. 运行相机节点
    ros2 launch mipi_cam mipi_cam_dual_channel.launch.py
    
  2. 查看图像尺寸
    ros2 topic echo /image_combine_raw | grep -E "width|height"
    
    • 如果 width 是单目宽度的 2倍(如 1280),则是 左右拼接 :right_arrow: 裁剪左右列。
    • 如果 height 是单目高度的 2倍,则是 上下拼接 :right_arrow: 裁剪上下行。

:light_bulb: 总结建议

需求 推荐方案 复杂度
快速验证/应用开发 方案一:代码中裁剪 :star: (最简单)
系统架构需要独立话题 方案二:增加裁剪节点 :star::star:
底层驱动修改 不推荐 (需编译驱动) :star::star::star::star::star:

直接回答您的问题
目前没有直接的 /left_camera 话题。请使用方案一,订阅 /image_combine_raw 后在代码中将图像宽度除以 2 进行裁剪,即可得到左相机图像。

如果您需要针对 NV12 格式的具体裁剪代码(避免颜色异常),请告诉我,我可以提供更严谨的内存处理示例!

需要自己重新训练的,这块的需求会需要内部和项目对接来推进了,这块新模型训练和量化双目适配整体的投入会非常大