ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Rerun DepthMeter 组件深度解析:深度图单位与世界坐标的换算原理

Rerun DepthMeter 组件深度解析:深度图单位与世界坐标的换算原理 Rerun DepthMeter 组件深度解析深度图单位与世界坐标的换算原理【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun深度图DepthImage中的每个像素值本身只是一个数字只有结合 DepthMeter 组件才能换算成具有物理意义的真实深度。本篇文章以 Rerun 仓库中的depth_meter.md文档为骨架结合 Rust SDK 组件实现、Viewer 的默认值回退逻辑 以及 3D 点云反投影可视化器 等源码完整讲解 DepthMeter 的语义定义、编码方式、默认取值规则以及它在 2D/3D 视图中各自的作用原理。读完本文你将能准确为任意单位的深度数据毫米、厘米、自定义缩放配置正确的 meter 值并理解点云生成背后的换算关系。DepthMeter 是什么世界与深度图之间的缩放因子DepthMeter 是 Rerun 中一个不稳定unstable的组件类型其官方定义如下The world→depth map scaling factor. This measures how many depth map units are in a world unit.翻译过来就是DepthMeter 表示一个世界单位通常为 1 米中包含多少个深度图单位。如果一张深度图使用毫米mm作为单位、而世界坐标使用米m那么一个世界单位里有 1000 个深度单位DepthMeter的值就应该是1000如果深度图本身已经以米为单位例如某些浮点深度传感器输出那么DepthMeter的值就是1.0如果是 10 微米10⁻⁵ 米精度的传感器一个世界单位里包含 100000 个深度单位值就是100000。该语义同时被DepthImage原型 和EncodedDepthImage原型 使用两者文档中均明确指出每个像素对应一个以DepthMeter组件指定单位表示的深度值。需要特别说明的是该类型当前标记为 unstable类型定义文件 中声明#[rerun(state unstable)]意味着它可能在未来的版本中以不向后兼容的方式发生变化。2D 视图与 3D 视图中的不同效果DepthMeter 的核心文档明确区分了它对两类视图的不同影响这一点直接关系到你如何解读可视化结果2D 视图DepthMeter的唯一作用是改变鼠标悬停hover在深度图上时显示的物理深度数值。2D 视图本身不进行几何重建因此 meter 只影响读数不影响图像外观。3D 视图当深度图配合针孔相机Pinhole模型被反投影back-project成点云时DepthMeter直接决定每个点在世界坐标中的摆放位置。点云的空间尺度完全由 meter 值决定设置错误会直接导致点云整体被拉伸或压缩。这一2D 只影响读数、3D 影响几何的行为在 DepthImage 原型的 meter 字段文档 中被逐字重复属于官方明确约定。数据编码与 Arrow 类型DepthMeter 在 Rerun 中是一个单精度浮点包装类型Rerun encodingFloat32即单精度 32 位 IEEE 754 浮点数Arrow datatypeFloat32直接映射到 Arrow 的float32逻辑类型Rust 表示pub struct DepthMeter(pub crate::encodings::Float32)使用#[repr(transparent)]透明包装见 depth_meter.rs组件全名rerun.components.DepthMeter类型定义来源类型定义文件 depth_meter.def.rs 中声明了 Python 别名float以及 numpy 数组别名float | npt.NDArray[np.float32]即 Python 侧可直接传入普通float或np.float32数组。由于是Float32编码meter 的精度受限于单精度浮点对于极大或极小的缩放值应注意浮点误差。默认值与 Viewer 回退逻辑当你不显式设置DepthMeter时Viewer 不会报错而是根据深度图格式自动推断默认值。其实现位于 component_fallbacks.rs通过latest_at_component::components::ImageFormat查询深度图的格式若格式是浮点型format.is_float()默认DepthMeter 1.0即 1 单位 1 米若格式是整数型如uint16默认DepthMeter 1000.0即 1 单位 1 毫米。同样的规则也体现在 Rust SDK 的Default实现中depth_meter_ext.rsSelf(1.0.into()) // 1 unit 1 meter.——SDK 侧的默认值是1.0而整数深度图毫米的1000.0默认值由 Viewer 的 fallback 机制按需补上。对于EncodedDepthImage编码深度图如 PNG/RVL 格式回退逻辑component_fallbacks.rs更细致若 blob 的媒体类型为 RVL 且包含量化quantization元数据ROS 的32FC1编码则解码后本身就是以米为单位的浮点深度默认DepthMeter 1.0否则与DepthImage的整数默认保持一致默认DepthMeter 1000.01 单位 1 毫米。3D 反投影meter 的倒数如何驱动点云生成要理解 meter 在 3D 视图中的真正作用需要看 depth_images.rs 中的process_entity_view_as_depth_cloud函数。其核心换算只有一行第 191-193 行// Depth meter defines how many texture units we need for a single world unit. // Therefore, the scaling factor for texture depth - world depth is the inverse of that: let world_depth_from_texture_depth 1.0 / *depth_meter.0;也就是说纹理深度图深度 → 世界深度的缩放系数是DepthMeter的倒数。如果 meter 1000毫米那么 1000 个深度单位折算为 1 米点云深度即为像素值 / 1000。该函数随后把world_depth_from_texture_depth、针孔相机的内参image_from_camera、以米为单位的点半径、最小/最大世界深度范围min_max_depth_in_world world_depth_from_texture_depth * depth_texture.range一起打包进DepthCloud交给渲染器完成逐像素反投影与着色。这意味着点云的整体纵深尺度由 meter 唯一决定点的半径大小由FillRatio控制也以世界深度为基准计算间接受 meter 影响深度范围depth_range标注的是深度图原始单位下的取值范围转换为世界坐标时同样乘以1 / meter。各语言 SDK 使用示例Rustwith_meter构建器Rust SDK 通过DepthImage::with_meter(...)设置见 depth_image.rs例如 depth_image_3d 示例 中uint16深度图配合10000.0的 meterlet depth_image rerun::DepthImage::try_from(image)? .with_meter(10000.0) .with_colormap(rerun::components::Colormap::Viridis);注意这里10000.0意味着 1 米 10000 个深度单位即 0.1 毫米精度uint16的最大深度约 6.5 米65535 / 10000。Pythonmeter关键字参数Python 侧直接以关键字参数传入depth_image_3d.pyrr.log( world/camera/depth, rr.DepthImage(depth_image, meter10_000.0, colormapviridis), )DepthMeter在 Python 中的别名是float可直接传普通数字。C.with_meter(...)C 侧用法与 Rust 一致depth_image_3d.cpprerun::DepthImage(depth_image, {WIDTH, HEIGHT}).with_meter(10000.0)编码深度图的反向示例meter 0.001有趣的是encoded_depth_image.py 给出了一个方向相反的用法——深度以米为单位存储、需要转换到毫米刻度rr.log( depth/encoded, rr.EncodedDepthImage( blobdepth_png, media_typemedia_type, meter0.001, ), )当深度图数据本身以米为单位、而希望 Viewer 以毫米解释或反之时meter 也可以取小于 1 的值。这印证了 meter 只是深度图单位 / 世界单位的纯比率meter 深度单位数 ÷ 世界单位数因此既可以大于 1毫米、微米刻度也可以小于 1数据本身就是米、需要按其他世界单位解释。选择正确 meter 值的实用指南综合文档与源码可以归纳出以下选值规则深度图数据单位世界单位米DepthMeter 值米浮点深度如部分 ToF / LiDAR米1.0毫米绝大多数整数深度如 uint16米1000.00.1 毫米高精度传感器米10000.0厘米米100.0米数据以米存储毫米自定义场景0.001判断依据很简单meter 深度图原始像素单位数 ÷ 1 米。Viewer 的 fallback 逻辑浮点默认 1.0、整数默认 1000.0正好对应最常见的两种传感器输出因此在大多数浮点即米、整数即毫米的场景下即使不显式设置 meter 也能得到正确的可视化结果而一旦你的传感器单位特殊如 0.1 毫米精度、厘米单位、或自定义缩放就必须显式传入正确的 meter否则 3D 点云会发生整体缩放失真。进一步阅读组件参考文档DepthMeter、编码Float32使用它的原型DepthImage、EncodedDepthImage类型定义源头depth_meter.def.rsRust 组件实现与默认值depth_meter.rs、depth_meter_ext.rsViewer 回退逻辑component_fallbacks.rs3D 点云反投影可视化器depth_images.rs、编码深度图可视化器 encoded_depth_image.rs可运行的完整示例depth_image_3d.py、depth_image_simple.py、encoded_depth_image.py 及其 Rust、C 对应版本【免费下载链接】rerunVisualize, query, and stream to train on multimodal robotics data.项目地址: https://gitcode.com/GitHub_Trending/re/rerun创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表