ARTICLE DETAIL

资讯详情

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

基于YOLOv5与RealSense D455的单目测距系统:原理、实现与避坑指南

基于YOLOv5与RealSense D455的单目测距系统:原理、实现与避坑指南 简介面向计算机视觉与机器人感知方向的开发者这份源码将 YOLOv5 目标检测与 Intel RealSense D455 深度相机相结合实现单目测距功能。基于 YOLOv5-3.1 源码实现运行主程序 python realsensedetect.py 即可加载权重完成目标识别与距离估算适用于移动机器人避障、智能监控等场景。压缩包共47个文件体积约17.76MB包含18个Python脚本、8个YAML模型配置、预训练权重、环境依赖说明与 Dockerfile另附 Notebook 教程和演示视频。代码目录按照核心检测、模型配置、输出结果、权重存储等模块划分便于按需修改与二次开发。特别提醒训练自定义模型须使用 YOLOv5-3.1 源码环境高于该版本训练的权重无法直接调用。目前已有246人学习下载适合有一定深度学习基础、希望在真实相机平台上快速落地测距功能的开发者。1. 单目测距这个选题为什么偏要用 D455 当垫脚石停车场进出口的横杆、园区安防的越界预警、AGV 的防撞停止……这类场景要的不是“检测到人”而是“知道人和车离我还有多少米”。标题里的“基于 yolov5realsense-D455 的单目测距系统”本质是一套用普通 RGB 画面完成距离估计的完整工程YOLOv5 负责把目标框出来后面的测距模块只用针孔成像几何就能把像素尺寸换算成物理距离。和很多人直觉相反D455 那颗带双目深度模块的相机在这里通常只当 RGB 源和标定基准用——因为单目算法一旦依赖深度图就没法迁移到普通摄像头上成本就压不下去。这套方案适合想把车辆、行人测距做到 5~25 米范围、又不想每台设备都加激光雷达的开发者。2. 测距原理先立住针孔模型、地面投影和两种选型边界单目测距看起来像玄学单张 2D 图像里没有深度凭什么能算出距离其实它依赖的不是“从图像里读出深度”而是“用目标在图像里的几何关系和已知条件反推距离”。你手里至少握着三样已知量相机内参焦距、主点、目标实际尺寸或相机安装姿态、检测框的像素位置。YOLOv5 提供的就是最后一个量。这个章节把两种最常见的几何模型讲清楚你才知道源码包里那几行测距函数到底在算什么。2.1 两种几何模型尺寸先验法和地面投影法尺寸先验法的思路最直接。当目标垂直于光轴摆放时成像大小与距离成反比真实高度是 H、图像高度是 h像素、相机焦距是 f像素距离 d 近似等于 H * f / h。这是针孔模型的等比缩放也是很多车辆测距源码默认使用的主公式。它的成立条件有两个一是目标类别有稳定的真实尺寸可用比如轿车取 1.45 米、行人取 1.70 米二是检测框能稳定框住目标的全部高度框尺寸抖动会直接折算成距离抖动。从像素误差到距离误差不是线性的。对公式 d H * f / h 求导距离越远同样大小的框抖动会带来更大的距离波动。比如焦距 900、真实高度 1.7 米的目标在 10 米处占 153 像素框抖 2 像素换算成距离约 0.13 米到了 30 米处只占 51 像素同样抖 2 像素就变成 1.2 米。这个放大效应决定了测距代码必须限制最小 bbox 高度也决定了远景目标不能指望单目达到毫米波雷达级别的精度。地面投影法则更接近安防相机的实际情况。相机离地高度 h_cam 是知道的光轴相对水平面向下俯了一个角度 alpha当目标站在地面时把目标框底边的 y 坐标投影到地面平面就能用三角函数算出目标到相机脚点的水平距离。这个模型完全不依赖目标真实尺寸所以对行人、自行车混行的场景更实用代价是它的精度全压在相机安装姿态的标定上俯仰角偏 1 度20 米外就要差出 0.3~0.5 米。两套模型的对比如下。维度尺寸先验法地面投影法输入bbox 高度、目标真实高度、焦距bbox 底边 y、相机高度、俯仰角、焦距关键依赖目标类别先验尺寸相机安装姿态适用场景车、集装箱等尺寸固定目标监控俯视、地面上的行人与车辆2.2 为什么选 YOLOv5 当检测前端做检测前端不是没有别的选择YOLOv5 在这个场景里胜在三点首先是后处理链路成熟conf-thres 和 IoU-thres 这两个跟测距最相关的参数都有现成接口调起来不费劲其次是模型体积可控yolov5s 只有 14 MB 左右在树莓派、Jetson 这类边缘设备上也能跑最后是训练自己的数据集资料最多labelimg 标完转成 YOLO 格式就能直接训社区踩坑记录齐全。对测距系统来说检测器输出的 bbox 不只是给用户看框它直接决定后面距离计算的分子分母所以检测器的稳定性比花哨的指标更值钱。具体到 YOLOv5 源码的使用torch.hub 和官方 repo 两种加载方式都稳定源码包里通常会把网络结构、权重和后处理封装在一个 detector 类里。新手最容易忽略的是 conf 阈值阈值设太低0.1会出现大量抖动框测距结果跟着跳设太高0.7会漏检远处的模糊目标导致测距断档。我一般把 conf 设在 0.4~0.5iou 保持默认 0.45然后在测距端做时序平滑这个组合拳后面第 6 章会再展开。2.3 D455 在纯单目方案里到底承担什么角色这是最关键的一个认知。RealSense D455 是双目结构光深度相机出厂已经标定好 RGB 与深度内参按理说直接用深度图就能测距为什么源码偏要叫“单目测距”常见原因有三个。一是成本与可迁移性深度相机比普通摄像头贵一个数量级如果算法绑定深度图整套系统就别想降本单目几何模型用在哪颗摄像头都成立D455 在这里只是扮演一个内参稳定、RGB 和深度严格对齐的高质量相机。二是深度图自身有短板在 3 米以外的室外场景D455 的深度误差会随距离快速放大强阳光还会干扰 IR 投影仪而单目测距在 5~25 米这段反而表现得平滑。三是真值获取方便D455 的深度图和 RGB 是对齐的你完全可以用深度值给单目估计结果做交叉验证——这在研发阶段非常重要相当于有把尺子在旁边校着。记住这条主线后面看源码就不会纠结“有了深度为什么还算单目”这种问题。3. 把源码压缩包变成能跑的系统环境配置与最小推理链路拿到标题里这样的源码 zip第一反应别是直接解压双击 run.py。先冷静做三件事确认 Python 版本、确认有没有模型权重、确认依赖清单。单目测距工程的失败往往不在算法而在环境torch 装错版本、pyrealsense2 装不上、显卡驱动和 CUDA 对不上任何一个都能卡你一整天。这一章从解压开始按常见做法把环境搭到能出画面的程度。3.1 源码包常见目录结构长什么样一个用 YOLOv5 D455 做的测距工程不管最初是怎么打包的核心模块通常都逃不出这几块负责相机取流和读取内参的 realsense 模块、负责加载权重和推理的 detector 模块、负责距离换算的 distance 模块、以及一个把所有流程串起来的入口脚本。我一般习惯这样组织目录收到结构类似的包很快就能上手。yolov5_realsense/ ├── weights/ # 模型权重比如 yolov5s.pt ├── realsense/ # D455 取流、RGB/深度对齐、内参读取 ├── detector/ # YOLOv5 检测器封装输出 bbox 与类别 ├── distance/ # 尺寸先验或地面投影的测距实现 ├── config.yaml # 相机内参、安装高度、俯仰角、检测阈值 ├── run.py # 主流程取帧→检测→测距→可视化 └── requirements.txt # Python 依赖锁定收到源码包后不要把别人的目录当黑匣子重点看 config.yaml 里的参数是不是按你的安装环境填的。尤其是相机内参不同批次 D455 略有差异最好用后面 4.1 节的方法重新读一遍再回写。目录里的 run.py 只是演示脚本真正落地时要拿它当骨架去改加日志、加报警、加与下位机的串口通信。先把它跑通的意义是验证整条链路能出图像、能出框、能出距离。3.2 conda 配置 yolov5 环境torch、pyrealsense2 与依赖安装环境配置是最容易劝退新手的一步yolov5 官方要求 Python 3.8项目里还有 pyrealsense2、opencv、numpy 等一堆依赖。用 conda 隔离环境是常用做法避免把系统 Python 搞乱。下面是我在 Ubuntu 20.04 上跑这套系统常用的初始化命令。conda create -n yolo python3.8 -y conda activate yolo cd yolov5_realsense pip install -r requirements.txt pip install -U pip pip install pyrealsense2 opencv-python numpy # 有 NVIDIA 显卡时再装 GPU 版 torch纯 CPU 机器跳过 pip install torch2.0.1 torchvision0.15.2第一条命令创建名为 yolo 的 Python 3.8 环境避免和系统 Python 打架第三条安装源码包自带依赖pyrealsense2 是 Intel 官方 SDK 的 Python 接口配套 D455 固件直接装最新即可。最后一条装 torch 和 torchvisionCPU 版默认直接可用GPU 版需要按你的 CUDA 版本去 PyTorch 官网选择对应安装命令。装完之后可以用python -c import torch; print(torch.cuda.is_available())验证 GPU 是否可用。没有独显的机器用 CPU 版 torch 也能跑yolov5s 在 i5 上大概 6~8 帧测距够用实时视频会有压力。3.3 最小推理链路加载 yolov5s.pt让 D455 出画面环境就绪后的最小验证不是跑整个 run.py而是先用一个最小脚本确认“相机能出帧、模型能出框”。下面这段代码就是这套链路的核心骨架我会单独放一个 test_camera.py 跑它。import cv2 import numpy as np import torch import pyrealsense2 as rs pipe rs.pipeline() cfg rs.config() cfg.enable_stream(rs.stream.color, 1280, 720, rs.format.bgr8, 30) pipe.start(cfg) model torch.hub.load(ultralytics/yolov5, custom, pathweights/yolov5s.pt, force_reloadFalse) model.conf 0.5 model.iou 0.45 for _ in range(100): frames pipe.wait_for_frames() color frames.get_color_frame() if not color: continue img np.asanyarray(color.get_data()) results model(img) results.render() cv2.imshow(detect, img) if cv2.waitKey(1) 0xFF ord(q): break逻辑很简单先配 D455 的 RGB 流1280x72030 是它比较稳的组合然后用 torch.hub 加载自定义权重注意weights/yolov5s.pt这个路径要真实存在。yolov5 的 model.conf 和 model.iou 分别是置信度阈值和 NMS 的 IoU 阈值它们直接决定了 bbox 会不会跳。最后循环取帧、推理、渲染。如果这 100 帧里有稳定框住目标说明检测链路已经通了。cv2 的 waitKey 和 imshow 是 OpenCV 自带的 GUI按 q 退出。注意torch.hub.load 在第一次调用时需要联网去拉取 ultralytics/yolov5 的仓库文件。离线环境请把仓库下载到本地后指向本地路径否则会在这一步卡住。3.4 换自己的数据集重训data.yaml 和 yolov5 超参数怎么动默认 COCO 权重里的 person、car、truck 对多数测距场景够用但如果要识别特定物体比如园区里的电动三轮车、工地上的安全帽就得另训模型。这也是热话题“yolov5 训练自己的数据集”的标准流程。先用 labelimg 画框导出 YOLO 格式的 txt每行是类别、中心 x、中心 y、宽、高都是除以图片宽高的归一化值再建一个 data.yaml。train: ./datasets/train val: ./datasets/val nc: 3 names: [person, tricycle, helmet]训练命令如下。python train.py --data data.yaml --weights weights/yolov5s.pt \ --epochs 100 --batch-size 16 --img 640和测距相关的参数要盯住几个。--img 会影响 bbox 的像素高度训练用 640推理也用 640别训练 640 推理 1280内参和像素的对应关系会乱。--epochs 不是越大越好COCO 预训练权重微调 100 轮基本收敛继续加到 300 轮收益很小。yolov5 超参数默认在 data/hyps/hyp.scratch-low.yaml 里里面 lr0、momentum、weight_decay 直接影响收敛速度这是进阶玩法新手阶段改这个容易把模型训崩属于后悔药都找不到的那类问题。训练结束后第一件事不是看 mAP而是把 val 图片喂给模型目测 bbox 是否紧贴目标轮廓。测距系统最怕两种框一种是只框住车身上半部分导致高度偏小、距离偏大另一种是背景也包进来让高度偏大、距离偏小。想快速定量看可以跑 val 并记录每个类别的框尺寸分布框不紧的类别优先考虑补数据而不是调阈值。4. 写 D455 YOLOv5 的测距核心从内参读取到三个必调参数第 3 章跑通了“出框”接下来进入真正要写代码的部分把距离算出来。这一章的代码量不大但每一行的物理意义都得清楚因为后面所有标定和排错都围绕这几个参数展开。核心分四步读内参、取 bbox、选测距模型、标定三个关键参数。4.1 从 D455 读内参不要抄网上的 fx 值很多源码直接把焦距写在配置里这在 D455 上不算错但不稳。D455 出厂内参是逐台标定的你手上这台的 fx 和网上下载的源码里的 fx 可能差 1%~2%换算到 20 米距离就是 0.2~0.4 米的误差。所以正解是开机后用 pyrealsense2 把当前分辨率的内参读出来用多少分辨率就读多少分辨率的参数。import pyrealsense2 as rs pipe rs.pipeline() cfg rs.config() cfg.enable_stream(rs.stream.color, 1280, 720, rs.format.bgr8, 30) profile pipe.start(cfg) color_profile profile.get_stream(rs.stream.color) intr color_profile.as_video_stream_profile().get_intrinsics() print(ffx{intr.fx:.3f}, fy{intr.fy:.3f}, cx{intr.ppx:.3f}, cy{intr.ppy:.3f}) print(fdistortion model: {intr.model})pyrealsense2 的 intr 对象里fx、fy 是 x、y 方向的焦距像素单位ppx、ppy 是主点也就是针孔模型里的 cx、cy。这组值只在当前分辨率下有效1280x720 的内参直接套到 640x480 的帧上是错的要按分辨率比例缩放或者干脆在每个分辨率下读一次存进 config。如果后续要用 OpenCV 的畸变模型还要记录 intr.model 返回的畸变系数这套测距用的针孔模型一般只取 fx、fy、cx、cy 就够。4.2 从 YOLOv5 结果里取出测距要用的 bbox 数据YOLOv5 推理结果转成 pandas DataFrame 是最省事的取法每一行对应一个目标包括 class、confidence、x1、y1、x2、y2。测距代码只需要其中三个量类别名字、bbox 高度、bbox 底边 y 坐标前者给尺寸先验法当索引后两个给地面投影法当输入。取数代码如下。import torch model torch.hub.load(ultralytics/yolov5, custom, pathweights/yolov5s.pt, force_reloadFalse) model.conf 0.5 model.iou 0.45 results model(frame) df results.pandas().xyxy[0] for _, row in df.iterrows(): x1, y1, x2, y2 int(row[x1]), int(row[y1]), int(row[x2]), int(row[y2]) cls_name row[name] bbox_h y2 - y1 bbox_bottom_y y2 conf row[confidence]这里要强调两点。第一bbox_h 是像素高度在尺寸先验法里它直接进分母框越紧越好。第二bbox_bottom_y 是目标脚点的像素 y对行人这类直立目标它接近脚底但轿车目标上它其实是保险杠下沿和轮胎接地位置有十几厘米的高差。地面投影法默认把它当地面点必然带来固定偏置标定阶段要处理。4.3 尺寸先验法实现bbox 高度除以焦距再乘真实高度现在把公式落成代码。算法输入是上一节获得的 bbox_h 和类别名输出是目标到相机的距离。真实高度需要按类别建一张表下表是常见默认值实际部署时用你自己场景里的统计值替换。import math # 类别 真实高度米按场景统计不要直接照抄 CLASS_REAL_HEIGHT {person: 1.70, car: 1.45, truck: 3.20} def distance_by_height(bbox_h_pixel, cls_name, fy): real_h CLASS_REAL_HEIGHT.get(cls_name) if real_h is None: return None # bbox 高度太小意味着目标太远像素量化误差会被放大 if bbox_h_pixel 10: return None return real_h * fy / bbox_h_pixel这段代码背后的假设是目标垂直于光轴、成像高度完全来自目标真实高度。为什么用 fy 而不是 fx因为高度是 y 方向的像素差对应纵轴焦距 fyfx 只用于宽度。最小 10 像素的限制来自第 2 章的误差放大30 米处 1.7 米高人只有约 51 像素再远 bbox 本身就不稳定硬算没有可信度。为了让输出稳定实际项目里一般会对连续帧做滑动平均。简单做法是维护一个队列取最近 5~10 帧的有效距离求均值这比单帧抖动平滑很多。from collections import deque que deque(maxlen8) def smooth_distance(dist): if dist is None: return None que.append(dist) return sum(que) / len(que)que 的 maxlen 是滑窗大小数值越大越平滑、反应越迟钝对 30 帧相机来说 8 大约是 0.27 秒的窗口不会让人觉得测距值粘住不动。4.4 地面投影法实现用底边 y 和相机姿态算水平距离如果相机带俯角安装比如装在横杆上看路面尺寸先验法会因目标不垂直于光轴而失真这时改用地面投影法。已知相机离地高度 h_cam 和光轴俯仰角 alpha把 bbox 底边 y 坐标差换算成投影夹角再用三角函数把夹角转成地面距离。代码实现很短。import math def distance_by_ground(bbox_bottom_y, camera_height, pitch_deg, fy, cy_pix): delta_y (bbox_bottom_y - cy_pix) / fy angle math.radians(pitch_deg) math.atan(delta_y) if angle 0: return None return camera_height / math.tan(angle)这个函数里cy_pix 是图像主点 ydelta_y 表示目标底边在图像主点上方还是下方。目标在画面下方时 delta_y 为正夹角增大距离变近目标向远处走底边往上移delta_y 变小距离变远。angle 接近零时说明目标已经到无穷远判空返回 None。调用时传入第 4.1 节读取的 fy、cy以及第 4.5 节标定的 camera_height 和 pitch_deg返回单位是米。4.5 三个必调参数焦距缩放、相机高度、俯仰角真正要调的参数其实只有三个。第一个是焦距 fy虽然 D455 能读内参但如果你换过分辨率或者换过摄像头必须按新内参加载源码里写死的 fx 值在 1280x720 和 640x480 下完全不是一回事最常见错误就是分辨率降一半焦距没跟着缩。第二个是相机高度 camera_height测量位置是镜头光心到地面的垂直高度不是外壳底部别拿卡尺量外壳然后少算三五厘米这个误差会等比进距离。第三个是俯仰角 pitch这参数最玄学看图看不准推荐用水平仪或对标定板测量误差 1 度在 20 米处就会产生 0.3 米以上的偏差。这三个参数之外yolov5 的 conf-thres 和 iou-thres 算得上是系统级软参数它们不影响单个公式但影响 bbox 的像素高度和底边位置进而影响所有测距结果。我的经验是先固定 conf0.5、iou0.45 把测距链路跑通再回头微调。yolov5 后处理对测距的耦合很容易被忽略conf 降太低保出的框边缘会毛糙测距值跟着抖。想减小抖动与其继续降 conf不如换高分辨率输入或者换更大模型后处理阈值不是后悔药它只是取舍开关。5. 单目测距系统避坑最容易翻车的 5 个地方与排查顺序单目测距系统里真的能把人卡半天的往往不是深度学习部分而是相机、坐标和标定这些“老司机”也不太说得清的边角问题。这些坑多半是前人先踩出来的我把它们按排查优先级排成 5 条每条都是现象、原因、解决三段方便你在现场照着查别把半天花在重训模型上。5.1 先把最容易误判的两个坑排掉画面异常与远距离抖动现象 1D455 出图后画面很暗或者发灰目标在图上基本看不清。原因D455 的 RGB 自动曝光在室内或逆光下容易偏向低照度另外 1280x72030 的色彩流在某些 USB 3.0 扩展口上带宽分配不足会丢帧或压缩画面自然就糊了。 解决先用 640x48030 替换配置里的 1280x72030很多集线器带宽问题会立刻暴露如果还暗关掉自动曝光手动固定曝光值和增益比如在 pyrealsense2 里用 enable_auto_exposure(False) 硬编码曝光。画面正常了检测和测距才有意义否则后面全是白搭。现象 2近距离测距挺准到了 6 米开外距离开始跳来跳去。原因远距离目标 bbox 高度只有几十像素第 2 章那个误差放大关系决定了像素量化误差在远距离被成倍放大同时检测框本身受 conf 阈值影响也在小幅抖动两者叠加就是跳数。 解决三步走。第一步把 model.conf 提到 0.45~0.5减少抖动框第二步给测距结果加 8 帧滑窗平均4.3 节的 deque 方案肉眼可见地平了第三步接受现实单目在 25 米以上的误差就是比深度相机大这不是 bug是模型边界。真要做远距离优先考虑换长焦镜头而不是指望算法逆天。5.2 换摄像头、车底偏置和算力打满三个需要带参数排查的坑现象 3换了普通 USB 摄像头后测距整体偏大或者偏小而不是局部不稳定。原因你还在用 D455 的内参和畸变模型。普通摄像头没有出厂标定CMOS 靶面尺寸和视场角各不相同同样的 fx、fy 完全对不上。 解决用棋盘格对普通摄像头做一次标定把新的 fx、fy、cx、cy 写回 config。如果只换了分辨率没换镜头可以按分辨率比例粗算但正经落地不推荐。更省事的路线是既然源码目标是单目测距不如统一用 D455内参差异通过 4.1 节的读取逻辑自动覆盖省掉每次换相机的标定环节。现象 4行人距离看着还行车辆距离始终差一个固定数值。原因行人 bbox 底边是脚底基本贴地车辆 bbox 底边在保险杠或车尾下沿离地十几到几十厘米。第 2 章地面投影法的“目标底边等于地平面”假设对车不成立于是出现一个系统性偏置。 解决标定时给车辆类别加一个等效像素偏置把 bbox_bottom_y 人为往下挪一点或者按已知距离的偏差做一次一元线性拟合把 bias 写进 config。这个方法比在代码里硬凑公式干净换安装位置时只需改一个参数。现象 5加了深度对齐做验证后帧率掉到 10 帧以下CPU 打满。原因rs.align 要把深度映射到 RGB 坐标系跑在 CPU 上同时还要给 YOLOv5 推理腾算力两边抢资源。 解决深度对齐只在标定和验证阶段开运行时关掉推理改成 GPU 或 OpenVINO。yolov5 官方 export.py 可以把 pt 转 ONNX 再转 OpenVINO集成显卡上提速明显命令是python export.py --weights yolov5s.pt --include openvino。这个优化放到最后做先把链路跑对再谈帧率。5.3 这些坑的排查顺序上面 5 条按优先级排实际排查时从现象 1 开始因为它最容易确认也最快解决。现象 2 和现象 4 同时出现时先处理现象 4因为固定偏置会掩盖随机抖动偏置校完了再看跳数。现象 3 只会在换相机时出现属于配置问题单独处理。现象 5 不影响正确性只影响体验放到最后。如果你在现场同时遇到两三件事记住一个原则先保证每帧得到稳定可复现的距离值再追求帧率和外观这两件事别反过来。6. 用深度图给单目测距“校对”交叉验证与误差修正技巧最后讲一个我习惯在源码里额外加的验证模块它不参与运行时但每次改标定参数我都靠它判断自己是逼近了还是跑偏了。D455 的 RGB 和深度在出厂时对齐所以同一个像素坐标在 RGB 里看到的目标对应深度图里的深度值可以作为“真值”。做法是拿 YOLOv5 的 bbox 底边中心点直接去深度图查那个像素的深度和单目测距结果并排打印。import pyrealsense2 as rs align rs.align(rs.stream.color) def query_depth(pipe, pixel_x, pixel_y): frames pipe.wait_for_frames() aligned align.process(frames) depth aligned.get_depth_frame() dist depth.get_distance(pixel_x, pixel_y) if dist 0.1: return None return dist这里的 pixel_x、pixel_y 取 bbox 底边中心x1x2 的一半和 y2。D455 深度在 1~3 米段非常稳10 米内做真值够用。如果目标边缘正好被截断深度可能穿过目标旁边的空隙拿到莫名其妙的远值所以查询前最好在 bbox 内取 3x3 邻域的中位数而不是单个像素。交叉验证的流程是把车停在已知距离的 1、3、5、10、15 米处每个距离采 100 帧记录单目测距均值、深度图均值和相对误差。误差曲线通常会在 10 米后明显上扬10 米内能控制在个位数百分比再远就开始快速发散这是单目尺寸测距的物理边界不是代码 bug。如果近距离就有固定偏移优先怀疑相机高度和俯仰角而不是 bbox 检测。这套“深度校对 已知距离定点”的验证流程走完还能顺手得到一个更稳的落地方案把深度图只在短距离3~5 米内当作主要距离源远距离回退到单目估计中间做线性过渡。工程上叫传感器融合做起来不复杂效果却比任何一端都稳。我自己习惯在代码里留一个 debug_visual 开关把单目估计值和深度真值同时印在画面左上角现场调参不用反复切窗口省了很多冤枉时间。这个习惯帮我少走很多弯路也希望帮到你。本文还有配套的精品资源点击获取
返回列表