D455 采帧 → 原始场景帧(含轮廓观测列表) → 点簇分割/增强 → 点簇增强结果 → 结构体_存在观测 → 场景管理写入存在/特征
关键在于:把“轮廓观测”和“点簇分割”的融合点固定在一个位置,否则你会出现两套并行分支(轮廓一路、点簇一路),最后在存在提取处互相打架。
我建议你把融合点放在:
✅ 点簇分割类::分割点簇_增强 里完成统一
也就是让分割点簇_增强变成唯一的“候选生成器”,它的输出始终是:
std::vector<点簇增强结果>
后面存在提取只做一件事:
点簇增强结果 → 结构体_存在观测(生成轮廓金字塔、颜色金字塔、质量分等)
这样路径就只有一条主干,不会分叉。
统一后的职责分层(每层只干一件事)
1) D455 相机层
输出原始场景帧,其中包含:
- 深度/颜色/点云(全帧)
std::vector<结构体_轮廓观测> 轮廓观测列表(每帧快速候选,可为空)
它只负责“采”和“轻量预处理”,不负责“存在观测”。
2) 点簇分割/增强层(统一融合点)
输入:结构体_原始场景帧& 帧+帧.轮廓观测列表
输出:std::vector<点簇增强结果>
它做两种来源的融合:
A. 轮廓引导分割(每帧,快)
对每个结构体_轮廓观测直接构建一个点簇增强结果:
- 像素簇:由
掩膜+ROI转成点簇(u,v)(需要时) - 点云簇3D:优先用
轮廓观测.点云簇(如果已有且不降采样),否则用像素簇去帧点云里取 - 中心/尺寸/主方向:一律用点云簇统计/PCA(更可靠)
- 裁剪掩码/裁剪颜色:直接复用轮廓观测(用于外观和轮廓金字塔)
- 质量指标:有效点数、点云覆盖率、mask填充率等
然后做你之前提的两件事:
- 可疑就二次分裂(点数阈值、尺寸阈值更敏感)
分裂产生多个点簇增强结果 - 可选降采样(仅跟踪模式启用,SLAM 模式关闭)
B. 静态补扫(每 N 帧,稳)
按间隔触发一次“全帧聚类”:
- 用原来的 3D 聚类分割(不依赖轮廓)
- 得到点云簇3D,再投影/回填 ROI/掩码(掩码可以粗一点)
- 最后也输出成
点簇增强结果
并对 A 来源结果做 AABB 去重,避免重复候选。
这一步把静止物体找回来,解决轮廓提取“看不见不动的东西”的天然弱点。
3) 存在提取层(只负责:增强结果 → 存在观测)
输入:点簇增强结果
输出:结构体_存在观测
这里你要坚持你说的原则:
out.中心坐标 = in.中心; out.尺寸 = in.尺寸;保持- 点云稀疏阈值提升到 300~500(建议 400)
- 主方向一致性检查(>30° 降置信度)
- 轮廓金字塔 N=0…10 强制生成(保持)
- 颜色金字塔生成(已是你的王牌特征)
你会发现:存在提取层从此不需要关心“轮廓观测”这个结构体了,世界清净很多。
4) 三维场景管理层
输入:std::vector<结构体_存在观测>
做:空间占位匹配 + 特征写入(相对位置/尺寸 + 轮廓金字塔+颜色金字塔 + 可选点云簇引用)
哪些信息更准确?统一后就不纠结了
在统一方案里,你可以直接把“可信来源”写成硬规则:
- 几何(中心/尺寸/主方向):永远来自点云簇统计
原因:掩膜受光照/遮挡漂,点云簇更稳 - 外观(裁剪颜色/掩膜/轮廓编码/金字塔颜色):优先来自轮廓观测
原因:像素级更细,做再识别更强 - 点云簇(SLAM/ICP):优先用轮廓观测里收集到的完整点云簇,确保不降采样
轮廓观测缺失时,再由像素簇去帧点云回采
这样你不会出现“用掩膜算中心”的路径,定位飘的概率直接砍掉。
最小改动建议(你实现起来最顺手的一套接口)
把分割点簇_增强改成支持轮廓引导:
std::vector<点簇增强结果>分割点簇_增强(const结构体_原始场景帧&帧,const点簇分割参数&参数,conststd::vector<结构体_轮廓观测>*轮廓=nullptr,const混合存在提取参数*mix=nullptr);然后你的主循环就变成绝对统一的一条路:
auto帧=...// D455采集,已带轮廓观测列表autoenhanced=分割器.分割点簇_增强(*帧,分割参数,&帧->轮廓观测列表,&mix);std::vector<结构体_存在观测>obs;obs.reserve(enhanced.size());for(auto&e:enhanced){结构体_存在观测 o{};if(存在提取.从点簇增强提取存在观测(e,o,提取参数))obs.push_back(std::move(o));}场景管理.处理观测列表(obs);轮廓观测只在“分割增强层”出现一次,后面全都走增强结果和存在观测,路径统一 ✅
一个小小的“工程护符”
统一路径最怕的 bug 其实就两类:
- 单位/坐标系混用
建议你在点簇增强结果里强制加:
单位=mm坐标系=相机/世界
并且在存在提取里 assert 一下
- 点簇 vs 点云簇混用
你已经抓住这个坑了:
- 点簇:uv
- 点云簇:xyz(mm)
在增强结果里分别叫簇_uv和点云簇_xyz,能救命。