ARTICLE DETAIL

资讯详情

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

RealSense D455 深度相机点云生成:从深度图像到三维点云的完整步骤

RealSense D455 深度相机点云生成:从深度图像到三维点云的完整步骤 RealSense D455 深度相机点云生成从深度图像到三维点云的完整步骤【免费下载链接】librealsenseRealSense SDK项目地址: https://gitcode.com/GitHub_Trending/li/librealsense深度相机每秒都能给你一张距离图但真正有用的信息藏在每个像素背后的三维坐标里。librealsense 是 Intel RealSense 相机的官方开源 SDK它的核心工作之一就是把这种二维深度图像变成可计算、可渲染的点云。下面我以 D455 为例带你在 Ubuntu 上用 Python 走通这条链路拿到深度帧、反投影出三维点、用 Open3D 画出来。环境准备按这个组合起步比较省心Ubuntu 20.04Windows 11 也可以librealsense2 SDK2.55 以上即可Python 3.8外加pyrealsense2和open3d两个库一台 D455 和足够短的 USB 3.0 线Linux 下有一条必须做的提醒装 SDK 时要确认 99-realsense-libusb.rules 这条 udev 规则落到了/etc/udev/rules.d/。规则缺失的典型症状是插上相机没反应跑一次sudo udevadm control --reload-rules再重新插拔设备就能解决。看懂深度数据单位与有效性过滤先搞清楚手里拿的是什么。D455 输出的深度图里每个像素存的是该点到镜头光心的距离单位是毫米像素值为 0 表示这一格没有测到超出量程、表面反光太强、或遮挡边缘都会产生 0。所以做任何几何计算之前第一件事就是把无效像素挑出来扔掉否则一堆 (0, 0, 0) 会挤在点云原点把结果弄脏。上面这张是 stepbystep 教程 里的真实深度图浅色区域更近。清洗逻辑就几行import numpy as np import pyrealsense2 as rs frames rs.pipeline().wait_for_frames() # 原始数据是 16 位无符号整数单位毫米 depth np.asanyarray(frames.get_depth_frame().get_data()).astype(np.float32) mask depth 0 # 0 代表未测到先标记出来像素坐标反投影到三维反投影back-projection听起来唬人其实就是小孔相机模型的逆运算。D455 的相机坐标系是x 向右、y 向下、z 沿光轴向前。内参里的 fx、fy 是以像素为单位的焦距(ppx, ppy) 是主点——即光轴打在像面上的位置。那么像素 (u, v) 处深度为 d 的点世界坐标就是x (u − ppx) × d / fxy (v − ppy) × d / fyz dD455 在 848×480 档位的典型内参大约是 fx ≈ fy ≈ 378ppx ≈ 427ppy ≈ 243每颗相机略有差异实际值可以从 SDK 的 intrinsics 接口里读出来。代码上就是生成一张像素网格再做一次除法h, w depth.shape u, v np.meshgrid(np.arange(w), np.arange(h)) # 用针孔相机模型把每个像素映射回相机坐标系 pts np.stack([(u - ppx) * depth / fx, (v - ppy) * depth / fy, depth], axis-1) valid pts[mask] # 只保留有效深度的点渲染出来Open3D 构建点云的最小流程三维坐标有了剩下的交给 Open3Dimport open3d as o3d pcd o3d.geometry.PointCloud() pcd.points o3d.utility.Vector3dVector(valid) o3d.visualization.draw_geometries([pcd])窗口里能拖动旋转看到的人形轮廓和 示例截图里 viewer 的效果是一回事。有两点值得提前知道RealSense 的相机坐标系y 下、z 前和 Open3D 默认的右手系y 上、z 后方向相反入库前套一个旋转矩阵把 y、z 翻号即可不必在推导里背两套公式另外如果你只是想要点云而不想自己写反投影SDK 自带rs2::pointcloud模块C 示例见 examples/pointcloud/Python 里对应rs.pointcloud()一行就能把深度帧转成结构化点云。提升点云质量的实用技巧分辨率848×480 是精度与帧率的常见平衡点追求密度再上 1280×720但注意高宽比变了之后主点和焦距都会变内参要重新读。滤波后处理滤波器里空间滤波负责抹掉边缘毛刺时域滤波负责跨帧去闪烁空洞填充负责补洞。一般建议时域 空间两个一起挂。HDR弱光和高光混合的场景里普通单曝光深度图会顾此失彼D400 系列的 HDR 用两档曝光的帧融合暗部亮部都能保住效果演示见 HDR 示例。坐标系对齐点云要进 SLAM 或 CAD 流程时统一成右手系y 上、z 后能省掉后面无数符号错误。排障清单点云稀疏怎么办先确认目标是否在 D455 的可靠测距范围约 0.4~20m内再提高分辨率最后考虑开启红外投影器对无纹理表面有帮助并加上空间滤波。重建精度不足距离越远误差越大能拉近就拉近对精度要求高时用 SDK 的片上标定接口做一次校准确认内参是从设备读出来的而不是文档抄的。设备识别失败Linux 下九成是 udev 规则的锅检查规则文件是否在/etc/udev/rules.d/udevadm重载后重插设备Windows 下则看设备管理器里有没有驱动告警。应用场景与收尾工业上拿它做尺寸测量和表面检测机器人方向则常见于避障和 SLAM 建图普通开发者的第一个点云项目往往也是从这里开始。把上面四步跑通后剩下的就是按自己的场景调分辨率、选滤波器、定坐标约定——精度和帧率之间没有免费午餐取舍权在你手里。【免费下载链接】librealsenseRealSense SDK项目地址: https://gitcode.com/GitHub_Trending/li/librealsense创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表