ARTICLE DETAIL

资讯详情

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

pyrealsense2深度相机实战:从安装配置到点云导出全攻略

pyrealsense2深度相机实战:从安装配置到点云导出全攻略 做了几年计算机视觉落地项目接触过的深度相机方案不算少从早期的结构光到后来的双目、ToF各有各的脾气。但如果你问我在实验室和实际工程里最省心、文档最全、社区最活跃的会是哪个Intel RealSense 绝对排得上号。而它背后的 Python 接口pyrealsense2更是把深度相机的上手门槛拉低了一大截几乎成了 CV 方向学生和算法工程师的标配工具。这篇内容不是官方文档的翻译也不是 API 的罗列。我会从一个实际使用者的角度带你搞清楚 pyrealsense2 到底怎么用、核心概念是什么、哪些坑是真坑以及怎么用 Python 快速把深度数据、彩色数据、甚至点云玩起来。不管你是刚接触深度相机还是已经在写采集代码但被各种报错折磨过这篇内容应该都能给你一些参考。1. 项目背景与核心概念解析1.1 深度相机到底解决了什么问题先说个比较基础的认知。普通 RGB 相机拿到的是二维像素每个像素是一个颜色值比如 RGB 三通道的 0-255。它没有“距离”的概念所以从单张图像里你无法精确知道一个物体离镜头有多远。这在很多场景下是致命的——比如做机器人避障时你得知道障碍物在空间中的三维坐标做体积测量时你得知道箱子边缘离相机的物理距离做三维重建时你需要每个点的真实深度值。深度相机就是来解决这个问题的。它能输出一张深度图depth map每个像素的值不再是颜色而是该像素对应空间点到相机平面的距离通常以毫米为单位。这样一来你就有了“每个像素在 3D 空间中的位置”的基础信息后续不管是做目标定位、抓取位姿估计、还是 SLAM 建图都有了可靠的输入。Intel RealSense 系列比如 D435、D435i、L515 等之所以在开发者中流行有几个很现实的原因价格相对亲民、有主动红外投影所以在弱纹理环境也能工作、SDK 覆盖面广C、Python、ROS 都有、同时提供彩色流和深度流且支持硬件级对齐。而 pyrealsense2 则是 librealsense 的官方 Python 绑定API 设计和 C 版几乎一一对应这意味着官方文档和社区例子你都能直接拿来用不用在“Python 版是不是阉割版”这件事上担心。1.2 pyrealsense2 在整个开发流程中扮演的角色你可能会问既然 RealSense 官方有 RealSense Viewer 这个图形化工具可以直接看到深度图和彩色图为什么还要用 pyrealsense2因为 Viewer 是给人看的你没法把它嵌到自己的项目里。真实的开发流程是这样的你写一个 Python 脚本通过 pyrealsense2 打开相机、配置分辨率/帧率/像素格式、按帧循环读取数据、再做后续处理比如转成 OpenCV 图像、生成点云、输入神经网络。在这条链路里pyrealsense2 是一个和硬件打交道的“数据接口层”。它屏蔽了 USB 通信、固件指令、传感器同步这些底层细节给你暴露的是一套相对清爽的 Python 对象Pipeline、Frame、PointCloud 等。你可以理解为它像一个翻译官把相机底层的原生数据流翻译成容易理解的图像帧和点云格式让你可以把精力集中在视觉算法上而不是纠结“为什么 depth 帧取出来是 uint16 但显示出来一片黑”这种问题。2. 环境准备与安装配置2.1 Python 环境与依赖安装先解决最基础但又最容易卡住的环节怎么把 pyrealsense2 装进你的环境。安装本身不复杂但有几个前置条件没满足的话后面跑起来会非常痛苦。首先是 Python 版本。pyrealsense2 官方轮子对 Python 3.6 以上版本支持都算积极我建议你直接用 3.8 到 3.11 之间的版本太老或太新都可能出现找不到对应 wheel 的情况。这里有一个很常见的现实问题很多同学电脑上装了多个 Python或者用 Anaconda 创建了虚拟环境结果在终端里 pip 安装的包和 IDE 里爬到的环境不是同一个导致import pyrealsense2直接 ModuleNotFoundError。所以第一步我强烈建议先在终端里确认当前 Python 环境python --version pip --version如果你用的是虚拟环境比如 conda 或 venv记得先激活再安装。然后直接用 pip 安装pip install pyrealsense2正常情况下这会拉取编译好的轮子文件装完就能import pyrealsense2。但如果你用的是某些特殊架构的设备比如 ARM 板子或者老的 Python 版本没有预编译包pip 会尝试从源码编译那就容易连环踩坑缺 cmake、缺 libusb、编译超时……这种情况下我一般推荐直接下载源码编译或者搜索对应架构的预编译 wheel但更省事的方案是直接换一台 x86_64 的电脑或使用官方推荐的 Docker 镜像。安装这一步的成功率很大程度上取决于你的系统环境和包源是否干净所以不要嫌我啰嗦环境干净是第一生产力。另外在 Windows 上还需要注意 RealSense 驱动。插上相机后打开设备管理器如果能看到一个“Intel RealSense Depth Camera”之类的设备且没有黄色感叹号说明驱动正常。如果没有任何反应需要到 Intel 官网下载安装最新的 RealSense 驱动通常装完 SDK 后驱动也会跟着装上。而在 Linux 上麻烦点在于权限和 udev 规则稍后我会在问题排查部分详细说。2.2 验证相机是否被正常识别安装完库之后别急着写几百行代码先做一个最基础的“设备连通性测试”。如果这一步过了整个项目的信心就有了。下面这段代码是检测当前有多少 RealSense 设备连接import pyrealsense2 as rs ctx rs.context() devices ctx.query_devices() print(f检测到 {len(devices)} 台 RealSense 设备) for dev in devices: print(f 名称: {dev.get_info(rs.camera_info.name)}) print(f 序列号: {dev.get_info(rs.camera_info.serial_number)}) print(f 固件版本: {dev.get_info(rs.camera_info.firmware_version)})如果打印出来检测到 0 台设备先不要怀疑代码先查硬件层面USB 线是不是 3.0、接口是不是直接插在机箱后置、供电够不够。很多时候我排查半天发现是线的问题——RealSense 对 USB 带宽要求高2.0 的线或劣质线材会导致设备完全不上线。验证通过后可以用官方推荐的“最短 5 行代码”来抓取第一帧深度画面import pyrealsense2 as rs # 创建 pipeline这是 pyrealsense2 的核心流处理对象 pipeline rs.pipeline() pipeline.start() try: while True: # 等待一帧数据timeout_ms 是超时时间 frames pipeline.wait_for_frames() depth_frame frames.get_depth_frame() if not depth_frame: continue # 目前先不做可视化打印一下分辨率确认数据真的来了 print(f深度图尺寸: {depth_frame.get_width()}x{depth_frame.get_height()}) break finally: pipeline.stop()走通这一步说明相机工作、库安装正确、基本的数据流转也没问题。接下来你再开始玩深度图、点云都行。这也是我一直强调的做硬件相关的开发先打通“最小链路”再逐步加需求是最稳的调试策略。3. 核心 API 与数据流解析3.1 相机配置Pipeline、Config 与 Profilepyrealsense2 的设计里Pipeline是一个高层封装它负责管理数据流、内部线程和帧同步你不需要自己手动去open/close设备只要定义好配置然后启动即可。与之配套的是Config用来指定要开启哪路流、分辨率多少、帧率多少。这里有一个新手常见的误区以为pipeline.start()不传参数就是默认配置了但其实那种方式只开启了相机内部预设的一组流一般是左右红外流 深度流 彩色流具体取决于型号和内置默认。更可控的做法是显式指定配置import pyrealsense2 as rs pipeline rs.pipeline() config rs.config() # 开启深度流分辨率 640x480格式为 Z1616位深度值单位毫米帧率 30 config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) # 开启彩色流分辨率 640x480格式为 BGR8兼容 OpenCV帧率 30 config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) profile pipeline.start(config)关于分辨率和帧率的选择我要多说一句。很多同学一上来直接开 1280x720 甚至更高觉得“分辨率越高越好”结果发现帧率上不去或者深度图边缘有很多空洞。这是因为深度计算本身很吃计算资源分辨率越高、参与计算的像素越多对 USB 带宽和 GPU/CPU 的要求也越高。实际项目里 640x48030fps 是一个性价比很高的配置既能保证足够的空间分辨率也能让帧率稳定。如果耗时还超标可以考虑降到 424x240 或把帧率调到 15fps。启动后返回的profile对象里藏着一个重要信息相机内参。不管你做三维重建、坐标映射还是把深度图投影到彩色图内参都是绕不开的。你可以通过下面这种方式取出来depth_profile profile.get_stream(rs.stream.depth) intrinsics depth_profile.as_video_stream_profile().get_intrinsics() print(ffx{intrinsics.fx}, fy{intrinsics.fy}, cx{intrinsics.cx}, cy{intrinsics.cy}) print(f畸变系数: {intrinsics.coeffs}, 畸变模型: {intrinsics.model})这些参数后续做像素坐标到相机坐标的转换时会直接用到。我在项目里经常遇到有人把这些数值当常量写死一旦换一台相机就全部错乱——正确做法是每次启动相机时动态读取因为即使是同一型号不同个体之间也存在极小的差异。3.2 对齐Align与坐标系转换深度相机和彩色相机在硬件上是两个独立的镜头物理位置不同视场角FOV也有细微差异所以同一时刻的深度图和彩色图并不是像素一一对应的——深度图里 (x1, y1) 这个点对应到彩色图里可能是 (x2, y2)位移量还和距离有关。这种不一致在做融合任务时比如把彩色信息贴到深度图上做 RGB-D 识别会产生很大的麻烦。pyrealsense2 提供的解决方案是rs.align。它可以把深度图重新投影到彩色视角下或者反过来把彩色图对齐到深度视角下。你只需要指定要对齐到的流类型align_to_color rs.align(rs.stream.color) # 拿到 frames 后直接做对齐 aligned_frames align_to_color.process(frames) aligned_depth aligned_frames.get_depth_frame() color_frame aligned_frames.get_color_frame()这样一个简单的操作就让深度图和彩色图的每个像素一一对应了。这背后的原理是SDK 利用两个摄像头已标定的内参和相对位姿外参把深度图的每个像素反投影到三维空间再重新投影到彩色图坐标系下从而完成像素级对齐。你不需要自己实现任何标定算法但你必须理解“对齐后”是什么含义否则在编写下游算法时很容易对坐标系产生误判。这里有几个使用心得对齐是有性能开销的如果你不在乎像素级对应关系比如只是单独用深度或单独用彩色没必要做对齐。对齐时会引入一些边缘空洞因为视角变化后有些区域在另一幅图里没有对应信息这是正常现象。在近距离高精度场景比如抓取位姿估计前很多人会先用 RealSense Viewer 里的选项把“深度到彩色”的对齐验证一遍确认目标物体的边缘在两个视图中没有明显错位再开始采集数据集。3.3 点云生成的基础流程深度相机最迷人的输出之一就是点云。点云的每个点是三维坐标 (x, y, z)可以由深度图结合相机内参直接计算出来[ x \frac{(u - c_x) \cdot z}{f_x}, \quad y \frac{(v - c_y) \cdot z}{f_y} ]其中 (u, v) 是图像像素坐标(z) 是该像素的深度值(f_x, f_y, c_x, c_y) 是内参。手动写这个映射并不难但 pyrealsense2 直接提供了点云生成接口省得自己处理边界条件import pyrealsense2 as rs import numpy as np pipeline rs.pipeline() config rs.config() config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) pipeline.start(config) pc rs.pointcloud() # 点云生成器 colorizer rs.colorizer() # 深度上色方便可视化 frames pipeline.wait_for_frames() depth_frame frames.get_depth_frame() color_frame frames.get_color_frame() # 把彩色图传给点云生成器让点云带颜色 pc.map_to(color_frame) points pc.calculate(depth_frame) # vertices 是 Nx3 的 float32 数组保存着三维坐标 vertices np.asanyarray(points.get_vertices()).view(np.float32).reshape(-1, 3) print(f点云点数: {vertices.shape[0]})点云的每个顶点还可以对应颜色值因为pc.map_to(color_frame)会在计算点云时把彩色像素映射到对应的三维点上。这一步非常简单但实际效果非常直观——你会看到物体的轮廓变成了三维空间中一堆彩色的点这是很多第一次接触深度相机的人觉得“哇塞”的时刻。当然用接口生成点云只是第一步后续要做的还包括点云滤波去掉孤立噪点、下采样降低点数、法线估计、曲面重建等。这些通常会交给 Open3D 或 PCLpyrealsense2 本身不做这些事。所以实际操作中你往往是把 pyrealsense2 生成的点云转成 Open3D 的PointCloud对象然后继续下游处理。4. 实操案例实时深度图与点云导出4.1 同时读取并显示 RGB 与深度图前面讲了 API 层面的核心对象现在我用一个相对完整的示例串起来。这个例子做的是实时读取相机彩色流和深度流用 OpenCV 显示并且把深度图做一些可视化增强。import cv2 import numpy as np import pyrealsense2 as rs # 初始化 pipeline 和 config pipeline rs.pipeline() config rs.config() config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) # 创建对齐对象让深度图与彩色图对齐 align rs.align(rs.stream.color) # 创建颜色映射器把深度值映射成彩色图便于观察 colorizer rs.colorizer() profile pipeline.start(config) try: while True: frames pipeline.wait_for_frames() aligned_frames align.process(frames) aligned_depth_frame aligned_frames.get_depth_frame() color_frame aligned_frames.get_color_frame() if not aligned_depth_frame or not color_frame: continue # 深度图转成 8 位彩色图用于显示 depth_color_frame colorizer.colorize(aligned_depth_frame) depth_image np.asanyarray(depth_color_frame.get_data()) color_image np.asanyarray(color_frame.get_data()) # 拼接显示 images np.hstack((color_image, depth_image)) cv2.imshow(RGB-D, images) if cv2.waitKey(1) 0xFF ord(q): break finally: pipeline.stop() cv2.destroyAllWindows()这里有个细节colorizer.colorize()返回的帧是 8 位 3 通道的可以直接交给 OpenCV 显示。如果直接把原始深度帧Z16即 uint16转成 numpy 数组显示大概率是一片乌黑因为深度值几百到几千毫米的变化在 [0, 255] 的显示范围里根本看不出层次。这也是新手最容易困惑的地方“为什么我明明拿到了深度图但显示出来是黑的”说一下我在这个环节经验总结先确认帧类型和位深再做可视化再谈算法。4.2 保存单帧图像与原始深度数据在实际项目里经常需要保存一批 RGB-D 图像作为数据集。这里要特别注意深度图的正确保存格式不是 JPG/PNG 这种 8 位图而应该保存成 16 位的 PNG 或直接存 Numpy 数组否则深度精度会丢失。import cv2 import numpy as np import pyrealsense2 as rs from datetime import datetime pipeline rs.pipeline() config rs.config() config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) pipeline.start(config) try: # 等待几帧稳定后再保存 for _ in range(10): frames pipeline.wait_for_frames() depth_frame frames.get_depth_frame() color_frame frames.get_color_frame() timestamp datetime.now().strftime(%Y%m%d_%H%M%S) # 保存原始深度图16bit PNG depth_image np.asanyarray(depth_frame.get_data()) cv2.imwrite(fdepth_{timestamp}.png, depth_image) # 保存彩色图 color_image np.asanyarray(color_frame.get_data()) cv2.imwrite(fcolor_{timestamp}.png, color_image) print(图像已保存) finally: pipeline.stop()保存后的深度图每个像素值代表毫米距离。如果你用 OpenCV 的imread读取要注意它默认按 8 位读你需要显式指定cv2.IMREAD_UNCHANGED才能读到完整的 16 位深度值depth_img cv2.imread(depth_20250101_120000.png, cv2.IMREAD_UNCHANGED) print(depth_img.dtype, depth_img.shape) # 应该是 uint16 (480, 640)如果第二次读取时发现 dtype 是 uint8说明你被默认的读图方式坑了深度数据已经损失。这个细节在我见过的数据采集脚本中反复出现踩坑率极高。4.3 从深度图生成并导出彩色点云 PLY点云的一个经典玩法是导出为 PLY 文件这样可以用 MeshLab、CloudCompare 等软件打开做进一步处理。基于刚才的代码我们加上保存 PLY 的逻辑import pyrealsense2 as rs import open3d as o3d import numpy as np pipeline rs.pipeline() config rs.config() config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) pipeline.start(config) pc rs.pointcloud() points None try: for _ in range(20): frames pipeline.wait_for_frames() depth_frame frames.get_depth_frame() color_frame frames.get_color_frame() pc.map_to(color_frame) points pc.calculate(depth_frame) finally: pipeline.stop() if points is not None: # 获取顶点坐标和颜色 vertices np.asanyarray(points.get_vertices()).view(np.float32).reshape(-1, 3) # 提取 rgb 信息需要转换 colors np.asanyarray(points.get_texture_coordinates()).view(np.float32).reshape(-1, 2) # 用 Open3D 构建彩色点云 pcd o3d.geometry.PointCloud() pcd.points o3d.utility.Vector3dVector(vertices) # 从彩色图采样颜色 color_image np.asanyarray(color_frame.get_data()) h, w color_image.shape[:2] uv np.asanyarray(points.get_texture_coordinates()).view(np.float32).reshape(-1, 2) # uv 坐标归一化到 [0,1]需要还原成像素坐标 u (uv[:, 0] * w).astype(int) v (uv[:, 1] * h).astype(int) # 越界保护 valid (u 0) (u w) (v 0) (v h) pcd_colors np.zeros((len(vertices), 3), dtypefloat) if valid.any(): pcd_colors[valid] color_image[v[valid], u[valid]] / 255.0 pcd.colors o3d.utility.Vector3dVector(pcd_colors) # 下采样减少文件体积 pcd pcd.voxel_down_sample(voxel_size0.005) o3d.io.write_point_cloud(output.ply, pcd) print(点云已保存 output.ply)注意纹理坐标texture coordinates是从点云对象里取出来的它记录了每个三维点对应于原始彩色图的归一化 UV 坐标。但这种方式有个踩坑点如果你没有在calculate之前调用过map_to(color_frame)纹理坐标就是空的。而且如果深度图和彩色图没有做对齐UV 坐标和颜色图的位置可能对不上。最稳妥的做法是先align再做map_to这样就保证深度图和彩色图是像素对齐的纹理坐标才可靠。这个例子引出了实践中很常见的一个流程采集数据 → 点云可视化 → 下采样 → 输出/继续处理。很多机器视觉项目的预处理管线和这个套路非常接近所以值得好好吃透。5. 常见问题与排查技巧实录5.1 深度图出现大面积黑色或空洞深度图里黑色像素通常代表该点深度无效。常见原因有三个一是目标物体距离过近或过远。RealSense 的有效深度范围不是无限的比如 D435 的最佳范围大概在 0.3 米到 3 米之间超过这个范围深度置信度急剧下降甚至直接变成无效值。如果你把相机贴到物体表面 10 厘米处看到的深度图基本都是黑的。对策是调整相机到目标的距离使它处于有效深度范围内。二是环境光照太强或物体表面反光严重。主动红外相机容易受到强光干扰比如阳光直射、强光灯照射。高反光物体镜面、抛光金属会把红外条纹打散导致该区域无法匹配出深度。对策是遮挡强光、只开室内灯、切换到更适合的预设模式比如高密度模式。三是相机初始化的时候还没稳定。刚启动相机的前十几帧曝光、对比度和深度计算策略都还在自动调整容易出现大面积无效区。对策是丢弃前 20~30 帧等相机稳定后再取数据。5.2 帧率达不到设定值有时候明明配置了 30fps但实际跑起来只有 10fps。这里要区分“相机输出帧率”和“算法处理帧率”。如果你的循环里有很耗时的操作比如生成点云 Open3D 可视化那整体跑 10fps 很正常相机本身没毛病。可以用下面这个方式单独量一下相机输出的帧间隔import time import pyrealsense2 as rs pipeline rs.pipeline() config rs.config() config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) pipeline.start(config) start time.time() count 0 while time.time() - start 5.0: frames pipeline.wait_for_frames() count 1 print(f5 秒内收到 {count} 帧实际帧率约 {count / 5.0:.2f} fps) pipeline.stop()如果这里能稳定跑到 30fps说明瓶颈在你的处理逻辑如果达不到检查 USB 带宽。RealSense 比较挑剔 USB 3.0 以上接口有些笔记本前后面板 USB 是 2.0 的或者转接器不支持 xHCI 直通都会导致带宽不足。另外如果同时开启多路高分辨率流默认开启红外流也会加剧带宽占用。可以尝试降低某个流的帧率或分辨率或者把不需要的红外流关掉来腾给深度流用。RealSense Viewer 里有“偏好模式”选项如最小功耗/最大分辨率等实际上就是帮你在不同配置组合之间做权衡可以作为参考。5.3 深度图与彩色图之间的错位如果你在调试时发现物体边缘在深度图和彩色图上明显错位最常见的原因是没有做对齐align或者对齐方向选错了。深度图和彩色图出自两个不同的镜头天然存在视差越靠近边缘视差越明显。如果你需要像素级对应关系必须在拿到 frames 后对齐。还要注意对齐之后你取出来的深度帧和彩色帧坐标参考系已经统一了此时再做投影映射才是对的。另一个容易被忽略的点是对齐需要依赖准确的内外参标定。虽然出厂已标定但如果相机经历了剧烈撞击、温度骤变比如长时间对着发热设备标定结果可能漂移。这时候你可能需要做手动的相机标定或者到 RealSense Viewer 里运行自校准某些型号支持On-chip calibration。一般情况下出厂标定足够用了但真要较真的时候这个因素值得排查。5.4 Linux 下常见权限问题与 udev 规则在 Ubuntu 上第一次插 RealSense可能遇到DeviceNotFoundException或者无法打开设备。这通常不是驱动没装好而是当前用户没有访问 USB 设备的权限。最简单的临时解决方法是sudo chmod 777 /dev/bus/usb/***但这种做法重启后失效。永久方案是配置 udev 规则把 Intel RealSense 的 vendor ID0x8086加入白名单。官方提供的规则文件路径在/lib/udev/rules.d/或源码包的scripts/目录下,你可以执行sudo cp ~/librealsense/scripts/99-realsense-libusb.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules sudo udevadm trigger配好之后重新插拔 USB再运行前面的设备检测代码大概率就通了。如果仍然不行可以用lsusb查看是不是能看到 Intel 的设备节点。我在实际项目中踩过好几次的典型场景是在嵌入式设备上如 NVIDIA 的某些开发板需要安装的是定制内核模块和固件直接用通用方案常常失败。这时建议到 Intel RealSense 官方 GitHub 的 “RealSense Self-Hosted Jetson” 相关说明里找对应内核补丁比起盲目折腾要可靠得多。6. 后续扩展与实战心得当你把上面的例子跑通之后你会发现pyrealsense2 其实只是引子真正好玩的是它背后的完整数据链条从深度传感器到单帧数据、从单帧数据到三维点云、从点云到几何模型或位姿估计。很多同学会把它和 Open3D、ROS、OpenCV 组合起来做完整的视觉系统这也是我推荐的学习路线先掌握单帧采集和对齐再尝试离线保存和点云导出最后再往 SLAM、位姿估计等上层算法延伸。根据我个人经验后面再深入时最值得研究的方向有两个。一个是多相机同步multi-camera sync)RealSense 支持把多台相机的帧同步对齐这在人体重建、大范围扫描等场景几乎是刚需但配置复杂度会明显提升另一个是深度滤波器的使用尤其是空间滤波和时间滤波的组合能显著改善深度图的连续性和精度。我自己在实际项目里通常会这样调先开空间滤波把孤立噪点抹掉再开时间滤波让帧间深度保持稳定。这两个滤波器直接挂在 pipeline 上代码量不大但效果立竿见影——尤其是在低纹理墙面前深度图的“灰白雪花”会明显减少。最后我也想提醒一点深度相机不是万能的。玻璃、纯黑物体、强反光表面、细小的铁丝网格……这些依然是深度感知的“死角”。如果项目里避不开这些材质考虑一下结构光之外的技术路线——比如 ToF、激光雷达或者干脆做多传感器融合。技术选型这件事往往比你后面花多少时间调参更能决定项目能不能落地。我在实际项目里踩过的最大一个坑是过于相信相机回传的深度值没有做时间同步就拿着深度图和彩色图去训练网络结果模型在离线评测时指标漂漂亮亮一上真机就原形毕露。后来花了一天时间把对齐、同步、保存逻辑全部重写了一遍重新标定了深度值与真实距离的映射关系效果才稳下来。所以如果你打算把 pyrealsense2 用到生产环境建议从第一天起就养成分步验证的习惯每一步输出都存盘、可视化和量化对比而不是等到最后才发现数据源本身就是错的。实话说深度相机的开发并不难难的是把每一个环节都验证扎实。等你把这套基本功练熟再回头看官方文档里那些参数就会有一种“原来如此”的通透感。
返回列表