42  3D 检测

检测篇(章节 26 所在的第六部分)把缺陷检测的范式锤成了一句话:缺陷(defect)就是对”正常”的偏离——先定义唯一的正常,再量化千变万化的偏离。那一篇的舞台是二维灰度图,正常与偏离都写在像素亮度里。本章把同一范式搬到三维:被测对象不再是一幅灰度图,而是一张距离图(range image / height map)——每个像素存的不是亮度,而是物体表面在该点的真实高度(mm)。范式一字未改,可量纲变了:缺陷在 3D 里第一次有了高度、体积、平面度这些二维灰度根本看不见的维度。一个比背景暗 25 个灰度级的墨渍,在 2D 里要靠对比度才能分辨;而一道高 0.99 mm 的台阶、一座高 7 mm 的圆台,在 3D 里就是 0.99 mm、7 mm,不多不少——量纲即物理量,这是 3D 检测相对 2D 最深刻的红利,也是本章贯穿始终的线索。

本章用一幅真实的 Smart3 距离图贯穿全部实验(图 42.1,来自 Smart3 1.9.2.2 “三维多轮廓检测示例方案”的 001.srt):被测件是一块多层级注塑/机加工件,俯视视场 32 mm×50 mm,横向分辨率 0.02 mm/px(1600×2500),高度分辨率 ResolutionZ 仅 0.01 µm/count(量化极细)。它名副其实地”多轮廓”——表面分上、下两级平台(台阶约 1 mm),其上分布若干高度迥异的轮廓特征:一座高耸的中央圆台(boss,高出参考面约 7 mm)、下台面上一个矮圆台、上台面顶端一圈下沉的腰圆形凹槽及其围出的抬起平台,以及高圆台顶面上几处微小凹点图 42.1 用 jet 高度编码把层级一眼摊开:深蓝是下台面、浅蓝是上台面,中央那座染成深红的圆台拔地而起,底部青色的矮圆台居中,顶端的腰圆轮廓清晰可辨。值得一提的是全图仅 41.3% 像素有效:其余 58.7% 被标记为无效(原始计数 INT_MIN),对应陡壁、深孔与激光无回波区——这是真实 3D 数据与合成数据最大的不同,后文的每一步都要先回答”这个像素有没有数”。

图 42.1: 真实距离图(001.srt,1600×2500,jet 高度编码)。被测件分上下两级平台;中央深红为高出参考面约 7 mm 的圆台,其顶面可见微小凹点;底部青色为矮圆台;顶端腰圆轮廓是一圈下沉凹槽围出的抬起平台。白色为无效像素(陡壁/无回波,占 58.7%)。横向 0.02 mm/px,视场 32×50 mm。

距离图也叫 2.5D 数据:它在规则的 \(x,y\) 栅格上存单值高度 \(z(x,y)\),介于 2D 图像(无高度)与完整 3D 点云(章节 37,每点可有任意 \(x,y,z\),能表达悬垂与封闭面)之间。激光三角测量(章节 33)、结构光(章节 32)等设备的原生输出大多正是距离图——本章假定它已生成,专注于”拿到距离图之后怎么判轮廓、判缺陷”。陡壁与深孔处激光无回波,传感器只能把该像素标成无效(本图用 INT_MIN),有效像素率随工件起伏剧烈变化。

42.1 多轮廓分割:3D Blob 分析

二维的 Blob 分析(章节 23)是”阈值分割 + 连通域 + 特征度量”的三段式:先把图像二值化,再把白色像素堆组织成一个个对象并度量。三维检测的第一把工具几乎是它的逐字对应,只是分割的依据从”灰度过阈”换成了”高度偏差过阈”——这正是”多轮廓检测”的核心:把一张距离图切成一个个高度迥异的轮廓区域,再逐一度量。

具体地,先估一个参考面(reference surface)——全图有效高度的中位数是稳健的基准(实测 \(h_\text{ref}=-1.694\) mm,恰落在面积最大的上台面上,中位数对少量高耸特征像素免疫);再逐像素算偏差 \(\Delta h(x,y)=h(x,y)-h_\text{ref}\);凡 \(\Delta h\) 高于 \(+\tau\) 的像素归”凸起候选”、低于 \(-\tau\) 的归”凹陷候选”,分别做连通域分析(凸、凹分开,避免相邻的凸区与凹区在边界处误并成一团)。容差取 \(\tau=0.35\) mm,最小面积取 1500 px(0.6 mm²)以滤除碎屑。

3D 轮廓比 2D blob 多出的,正是高度带来的新判据。每个轮廓除了 2D 那套面积、重心、外接框,还能算:带符号的高度偏差(均值符号区分凸起 \(\Delta h>0\) 与凹陷 \(\Delta h<0\),这是 2D 二值图天然丢失的信息)、等效直径、以及体积 \(V=\sum_{(x,y)}\Delta h(x,y)\cdot A_\text{px}\)\(A_\text{px}=0.02\times0.02=4\times10^{-4}\) mm² 为像素面积,单位 mm³,直接回答”这个轮廓凸出/凹进了多少材料”)。

实测从这幅真实距离图分割出 5 个轮廓特征表 42.1图 42.2):最醒目的是中央圆台——等效直径 11.76 mm、高出参考面 7.15 mm、体积 776 mm³,是全件的几何主角;下台面上的矮圆台等效直径 6.23 mm、高 2.22 mm(外接框 7.8×4.8 mm,略呈腰圆);顶端腰圆凹槽围出的抬起平台面积 54.7 mm²、仅高 0.47 mm;而整个下台面作为一片大面积凹陷轮廓(247 mm²、均值 −0.89 mm)也被如实分出——它就是那道约 1 mm 台阶的低侧。

表 42.1: 多轮廓分割结果(参考面 \(h_\text{ref}=-1.694\) mm,\(\tau=0.35\) mm,最小面积 1500 px)
# 类型 面积 mm² 等效直径 mm 中心 (x,y) mm 均值 Δh 峰值 Δh 体积 mm³
1 凸起 108.6 11.76 (16.3, 24.0) +7.145 +7.696 +775.9
2 凹陷 247.0 17.74 (16.6, 37.3) −0.892 −3.868 −220.3
3 凸起 54.7 8.34 (15.9, 5.1) +0.465 +0.917 +25.5
4 凸起 30.5 6.23 (16.2, 41.9) +2.222 +2.428 +67.8
5 凸起 2.6 1.81 (16.0, 6.2) +0.367 +0.406 +1.0
图 42.2: 多轮廓分割结果(高度灰度底图)。红框=凸起轮廓(\(\Delta h>0\):中央圆台、矮圆台、顶端抬起平台),蓝框=凹陷轮廓(\(\Delta h<0\):下台面台阶区)。中央圆台顶面两处白点即后文要查的微小凹点。

这里浮现出 3D 检测的根本优势:判据更接近物理量。2D Blob 用面积、圆形度这些像素几何量分类,它们随分辨率、视角变化;3D 轮廓的高度(mm)、体积(mm³)、等效直径(mm)则是标定后的真实尺寸(正是 章节 41 强调的”3D 量测直接给物理单位”)。一句”圆台高度须在 7±0.1 mm、台阶须 1±0.05 mm”可原样写进工艺规范,无需翻译成像素——量纲的统一让规则书与算法说同一种语言。

体积判据在实践中常比高度判据更鲁棒:一个又尖又高的毛刺(高度大、体积小)与一片又浅又广的鼓包(高度小、体积大)危害往往不同,单看峰高会把两者混为一谈。把高度与体积双判据并用——“高度超 A 或体积超 V 即 NG”——比任何单判据都更贴合”这处轮廓会不会引发失效”的真实问题。本件中央圆台 776 mm³ 与矮圆台 67.8 mm³ 的体积差,远比直径差更直观地反映了两者的体量悬殊。

42.2 剖面测量

Blob 分析回答”哪里有轮廓、多大体积”,但产线常常还要一个更锋利的问题:沿某条指定直线,表面的高度廓形到底长什么样?这就是剖面测量(profile measurement / cross-section)——沿距离图上一条线段抽取高度序列,得到一条一维廓形曲线。它是三维世界里的卡尺(章节 20):卡尺沿一条搜索线在灰度图上找边、量距,剖面则沿一条线在距离图上读高、量台阶与峰谷。二者同构——都是把二维/三维数据沿一条线降到一维,再用经典的一维信号工具去解析。

实验沿 \(x=16.1\) mm 这条穿过高、矮两圆台的竖直中心线抽取剖面(图 42.3)。这条线一气走过全部层级:上台面、顶端凹槽、抬起平台、拔地而起的中央圆台顶(含顶面两处凹点的下凹缺口)、跌落到下台面的台阶、再爬上矮圆台。实测剖面 2054 个有效点,高度范围 [−6.562, 5.987] mm:圆台顶峰高 5.987 mm(位于 \(y=22.2\) mm),相对上台面(−1.668 mm)高出 7.66 mm;上、下台面落差即台阶高 0.988 mm图 42.3 里这一切清晰可读:两条水平参考线标出上下台面,中央那段陡然抬起的高台就是圆台顶(红点标峰),台顶上两个向下的尖缺口正是后文要查的凹点,右侧半高的小台是矮圆台。

图 42.3: 沿 \(x=16.1\) mm 竖直中心线的高度剖面(黑线)。从左到右依次穿过上台面、中央圆台顶(峰 5.987 mm,红点)、台阶、下台面与矮圆台;两条水平线为上/下台面参考。圆台顶上的两个向下缺口即顶面凹点。

值得专门一记的是:本章三个 SDK 3D 检测模块里,唯一实测可用的就是剖面测量。SciSv3DProfileMeasure::ExtractData 沿同一条线返回 rc=02054 个采样点、Z 范围 [−6.562, 5.987] mm,与手写逐行读列的结果逐点一致——它无状态、只是”沿线读数 + 插值”,因而稳健可用。剖面的价值还不止于”读廓形”:把 2.5D 数据沿线降回 1D 后,章节 14 那套一维亚像素工具就全部可用了——抛物线拟合峰顶得亚像素峰位、边沿模型量台阶宽度与坡度、直线拟合基线段估倾斜。剖面是连接三维数据与经典一维量测工具的桥

剖面线该画在哪里,是个工程决策而非算法问题。穿过缺陷最深处的剖面给出最大偏差,沿工件棱边的剖面查台阶与塌边,垂直于划痕的剖面量沟槽深宽。实践中常先用 小节 42.1 的轮廓重心,再自动在重心处布一条(或一束)剖面线做精测——轮廓负责”找到”,剖面负责”量准”,分工与 2D 的”先 Blob 定位、再卡尺精测”如出一辙。本章那条中心线之所以信息密度高,正因为它一线串起了全部层级。

42.3 局部缺陷与表面质量

前两节回答了”有哪些轮廓、各自多大”,但检测还有一层更细的问题:某个本该平整的面,它自己平不平、有没有局部瑕疵?这就把检测的尺度从”轮廓之间”收进了”单个轮廓之内”。本节以中央圆台顶面为舞台——它名义上是一块平整的圆形台面,正是”定义唯一的正常、再量化偏离”这一范式最纯粹的一次演练:先把顶面本身拟合成”正常”,再把偏离它的局部下凹揪出来。

做法分两步。第一步,把顶面拟合成基准平面。先用高度阈(\(z>1.5\) mm)连通域取出圆台,再向内腐蚀 14 圈剔除斜壁与边缘(只留干净的内部顶面,96.85 mm²),对其做最小二乘平面拟合 \(z=ax+by+c\)。拟合出的顶面带约 1.4° 的装夹倾斜(\(a,b=-0.0074,-0.0230\));扣除倾斜后,顶面残差的平面度 RMS 仅 15.4 µm——在 0.01 µm 量化、7 mm 高的圆台顶上,这是一块相当平的面。第二步,把偏离基准面的局部下凹标为缺陷:残差低于 \(-0.25\) mm 的像素即”凹点候选”,连通域统计。实测检出 2 个凹点:一个面积 0.440 mm²、深 644 µm,一个面积仅 0.014 mm²、深 818 µm。图 42.4 是顶面残差的发散色标热图(蓝=下凹、红=上凸、白=贴合基准面):整片顶面以白为主(证明它确实平),唯中央那个蓝心红边的斑块是 0.44 mm² 凹点,其下方黑框框住的小点是 0.014 mm² 的微凹点;顶部那个白色空洞则是顶面上一处激光无回波的深孔(无效像素,不计入凹点)。

图 42.4: 中央圆台顶面残差热图(扣除装夹倾斜后,发散色标 ±300 µm;蓝=下凹、白=贴合基准面)。整片以白为主——平面度 RMS 仅 15.4 µm;中央蓝斑为 0.44 mm²/644 µm 凹点,黑框为 0.014 mm²/818 µm 微凹点;顶部白色空洞为无回波深孔(无效像素)。

这一节把缺陷检测的范式推到了它的逻辑终点:“正常”不必是图纸上的标称值,可以是从数据里现拟合出来的一块基准面。顶面平整度 RMS 15.4 µm 与凹点深度 644/818 µm 是两个量纲一致、可直接对图纸公差设阈的物理量——前者答”这面够不够平”,后者答”有没有伤”。一句话收束本节,也收束整个检测篇的方法论:缺陷的定义决定了用什么量、相对什么基准去测它

SDK 里有一个名为”浓度/密度检测”(SciSv3DConcentrationDetection)的模块,本意是检测统计型缺陷——均值正常、只是局部方差异常的瑕疵(磨砂面的局部抛光、涂层的桔皮、烧结件的疏松),靠局部高度方差而非高度阈值来揪。可它在本机静默无输出(见 小节 42.5),故本章以几何路线(残差平面度 + 凹点)演示同一范式。统计型与几何型缺陷的共性都是”先定义正常、再量化偏离”,只是前者的”偏离”写在方差里、后者写在高度里——用错了尺,再好的算法也只是把零误差精确地算出来。

42.4 检测极限与最小可检尺寸

小节 42.3 检出的两个凹点尺寸悬殊:一个 0.440 mm²,一个仅 0.014 mm²(约 35 像素、3–4 像素宽)。后者已经贴到了这套系统的检测极限上——它逼问的不再是”深不深”,而是”小到多大就检不出了”。

先把极限的性质看清。两个凹点都深 600–820 µm,远高于顶面 15 µm 的平面度噪声底(信噪比约 40),所以”检不检得到”与深度无关;真正的瓶颈是横向尺寸与连通域的最小面积下限。于是把凹点检测的最小面积 \(A_\text{min}\) 扫过紧、默认、松三档(深度阈固定 0.25 mm),结果如下:

表 42.2: 凹点检测的最小可检尺寸(固定深度阈 0.25 mm,扫描最小面积)
档位 最小面积 检出凹点 零散小斑(≥1 px)
6 px 2 0
默认 25 px 2 0
200 px 1 1

这张表给出一个与合成数据截然不同、也更诚实的结论。在 章节 26 的二维世界里,阈值的两难是”紧档误报、松档漏检”——收紧阈值,噪声尖峰就成片越界。可这幅高质量真实扫描的顶面太干净了:哪怕把最小面积放到 6 px,也没有任何噪声小斑被误报(虚警 = 0)。换句话说,这里没有误报与漏检的两难,只有一条单边的尺寸下限:松档(200 px)把 0.014 mm² 的微凹点直接漏掉(只剩 1 个检出),而真正决定”最小能检多小”的,是 0.02 mm 的横向分辨率本身——一个 3–4 像素宽的凹点已逼近”单像素掉点 vs 真实凹坑”难以分辨的边界。图 42.5 把两档并排:左图(紧档 6 px)两个凹点都框出,右图(松档 200 px)只剩中央大凹点,微凹点所在处一片空白。

图 42.5: 检测极限:紧/松两档最小面积对比(中央圆台顶面残差灰度图,红框=检出凹点)。左:紧档 6 px,两个凹点全检出且无虚警;右:松档 200 px,0.014 mm² 微凹点被漏检(仅余中央大凹点)。顶部白斑为无回波深孔。

整定方法仍与 章节 26 的”两端夹逼”一脉相承:用已知最小的真实缺陷验证检出得上界(尺寸下限),用良品压虚警得下界——只是这幅干净扫描的虚警本就为零,下界宽松,瓶颈全在上界(横向分辨率)。若要把这条尺寸下限再往下压,该换的不是面积阈值,而是采集方案:用更高横向分辨率的镜头与更密的扫描行距(章节 30 的传感器选型本就是为拉开这条窗口)。而 3D 检测在这道题上仍握有 2D 没有的牌:深度判据用的是物理单位(µm)——“凹点深度须 < 100 µm”是一个绝对的、可跨设备复现的工艺量,不随光照、曝光漂移,这让 3D 的阈值整定比 2D 灰度阈值更稳、更可移植。

真实数据的”检测极限”常常不在算法、而在采样:58.7% 的无效像素(陡壁/深孔无回波)才是最先撞上的墙。顶面那个无回波深孔就是例证——它不是缺陷,却是一片彻底的数据空洞,任何顶面平整度评定都得先把它排除。3D 检测工程师的第一道功课,往往是”哪里没数”,其次才是”有数的地方判得准不准”。

42.5 SciVision 实现

本章如实记录 SciVision 三个 3D 检测模块在本机、对这幅真实距离图的实测状态——这本身就是全书方法论的最后一次践行:商用库的每一个承诺都要过黄金实验

// 真实距离图载入(链 Sci3DFileOperation.lib;rc=0 即成功;
// 它会向 stderr 打一句无害的 "Directory does not exist.")
SciRangeImage ri;  SCIMV::Sci3DFileOperation fop;
long rc = fop.LoadRangeImage(SciVar("sample\\001.srt"), &ri, false);
double z = ri.GetValue(r, c) * ri.ResolutionZ();   // 原始计数×Z分辨率 = 物理高度 mm
// 无效像素以 INT_MIN(-2147483648) 标记(陡壁/无回波),须显式剔除

// ① 剖面测量(实测可用!沿线抽取高度数据)
SciROI line;  line.GenLine(SciPoint(805,120), SciPoint(805,2380));
SCIMV::SciSv3DProfileMeasure pm;  SciFloatArray wz; /* ... */
rc = pm.ExtractData(ri, line, shield, 0, 0, &wxy, &ixy, &wz, NULL, &idxZ, &dist, NULL);
// rc=0, wz.Length()==2054, Z∈[-6.562,5.987]mm —— 与手写逐行剖面逐点一致

// ② 3D Blob 分析(实测静默:rc=0 但 blobs.Length()==0)
SCIMV::SciSv3DBlobAnalysis ba;  SciRegionArray blobs;  SciMatrix res;
rc = ba.BlobAnalysis3D(ri, roi, base, lo, hi, mn, mx, ft, rt,
                       false, false, &blobs, &res);   // rc=0, blobs=0, res 0×0

// ③ 浓度/密度检测(实测静默:rc=0 但 dst 为 0×0 空图)
SCIMV::Sci3DConcentrationDetection cd;  SciImage dst; /* ... */
rc = cd.DetectConcentration(ri, roi, 0.05, 9,
         SCI_CONCENTRATION_FILTER_MEAN, 4, 4, &diff, &dst, &reg);   // dst 0×0

实测结论分明:SciSv3DProfileMeasure::ExtractData 可用——沿指定线段返回 2054 个采样点、Z 范围 [−6.562, 5.987] mm,与手写剖面逐点一致,是三个模块里唯一能直接用于生产的 3D 检测原语。而 SciSv3DBlobAnalysis::BlobAnalysis3DSci3DConcentrationDetection::DetectConcentration静默无输出——返回码 rc=0(标称成功),但前者 blobs 长度为 0、后者 dst 为 0×0 空图,没有任何实际输出。这与 Part IX 多个 3D 模块的”静默无输出”签名一致,故本章主算法全部手写兜底:高度偏差连通域分析做多轮廓分割(小节 42.1)、最小二乘顶面 + 残差做平面度与凹点检测(小节 42.3)。为隔离静默/崩溃风险,三个 SDK 模块都以子进程探针调用——主流程先 system() 起子进程跑探针、记录其返回与输出,再走手写算法,任何 SDK 异常都不会拖垮主流程。这个工程姿态本身就是一条结论:当前 3D 检测的 SDK 成熟度显著低于 2D,多数检测算子仍需自研——这并不意外,3D 检测是机器视觉里最年轻的一块,标准化的算子库尚在成形。

为什么剖面可用、blob 与浓度静默?一个合理的猜测:剖面只是”沿线读数 + 插值”,无状态、无外部资源依赖;而 blob 与浓度涉及分割、滤波的内部流水线,与本机若干 3D 模块共享了”Directory does not exist.”的资源缺失签名(见全书 Part IX 实测记录)。无论根因如何,工程上的应对都一样——实测为准,静默即自研。

工业案例:精密结构件的多轮廓在线检测

某连接器/结构件厂用激光线扫传感器对类似本章的多层级注塑件做 100% 在线 3D 检测。检测项不是单一缺陷,而是一整套多轮廓尺寸:圆台高度(7±0.1 mm)、台阶落差(1±0.05 mm)、矮圆台直径、顶面平整度、以及顶面有无凹点/异物。逐项对应本章的三把工具——高度偏差连通域分出各轮廓量高度/直径/体积(小节 42.1),中心剖面量台阶与峰高(小节 42.2),顶面残差平面度查局部瑕疵(小节 42.3)。真正的工程难点有两个:一是无效像素——陡壁与深孔处激光无回波,58% 的像素没有数据,所有评定都要先做”有效性掩膜”,否则空洞会被误当成深凹陷;二是商用 3D 算子参差不齐——像本章实测的那样,剖面可用而 Blob/浓度静默,项目排期必须为”逐一实测验证每个 SDK 算子、不可用就自研”预留预算。教训:3D 检测项目的第一性原则是先问”哪里有数”,再谈”判得准不准”——这是 2D 检测里几乎不必操心、到了 3D 却绕不过去的一课。

42.6 小结

  • 3D 检测沿用”缺陷=对正常的偏离”范式(章节 26),但量纲升级为物理量:轮廓在三维里有了高度(mm)、体积(mm³)、平面度(µm)这些 2D 灰度看不见的维度,规则书与算法第一次说同一种语言。
  • 多轮廓分割 = 高度偏差阈值 + 连通域 + 物理特征章节 23 的三维对应):从真实距离图分出 5 个轮廓,中央圆台 Ø11.76 mm/高 7.15 mm/体积 776 mm³、矮圆台 Ø6.23 mm/高 2.22 mm、台阶 0.988 mm 一一量出;凸/凹分开连通域以免误并。
  • 剖面测量是 3D 的卡尺章节 20):沿中心线把 2.5D 降回 1D,一线串起全部层级;SciSv3DProfileMeasure::ExtractData 实测可用,2054 点与手写逐点一致,圆台峰 5.987 mm。
  • 局部缺陷把”正常”现拟合成一块基准面:中央圆台顶面最小二乘平面度 RMS 仅 15.4 µm,残差揪出两个凹点(0.440 mm²/644 µm、0.014 mm²/818 µm)——缺陷的定义决定了用什么量、相对什么基准去测它。
  • 检测极限在真实高质量扫描里是单边的尺寸下限:凹点深 600+ µm 远高于 15 µm 噪声底、无虚警两难,0.014 mm² 微凹点(3–4 像素宽)逼近 0.02 mm 横向分辨率;而 58.7% 的无效像素(无回波)才是 3D 检测最先撞上的墙。

更系统的工业三维表面检测论述(含缺陷分型、纹理与统计模型)可进一步阅读 Steger 等人的著作 (Steger, Ulrich, 和 Wiedemann 2018)。本章”缺陷=对正常的偏离”这一自动光学检测范式,连同基于距离图/2.5D 的检测路线,在 Newman 与 Jain 的自动视觉检测综述中有完整的历史与方法梳理 (Newman 和 Jain 1995)


行至此处,全书四十二章合上最后一页。我们从第一章的数字图像出发——光被传感器采样成一格格灰度(章节 1),到这最后一章的三维检测——算法在物理高度上判定一座 7 mm 的圆台、一道 1 mm 的台阶、一处 644 µm 的凹点合不合格。这中间铺开的,是机器视觉完整的一条工程链:成像决定了信息的上限,光打不出来的对比度、激光照不到的陡壁,再强的算法也变不出来;预处理为后续每一步铺路;定位、测量、检测、识别各司其职,把像素一层层翻译成”它是什么、在哪里、有多大、合不合格”;而从 2D 到 3D,则是给这一切又添了一个维度,让轮廓有了高度与体积,让测量有了真实的毫米。

但若要在这四十二章里只留下一句话,那不会是任何一个具体算法。Otsu 会被更好的阈值法取代,手写的连通域会被更快的实现替换,今天静默的 SDK 明天或许就修好了。真正贯穿全书、值得带走的,是一套工程方法论理解物理——知道光、镜头、传感器如何决定你能看见什么,包括那 58.7% 根本没有回波的像素;量化误差——每个数字都配一个误差棒,15 µm 的平面度比”很平”两个字诚实得多;诚实面对失效边界——无回波的数据空洞、跨陡壁的盲区、静默无输出的商用库,把它们如实写下来,比掩盖它们有用一百倍;以及用实验验证一切——包括、尤其是,验证你所依赖的商用库,因为文档是承诺,而只有已知行为的对照实验(剖面可用、Blob 与浓度静默)才是真相。这套方法论不属于 2D 或 3D,不属于某个 SDK 或某家厂商;它属于每一个要让算法在真实产线上日复一日做出可信判定的工程师。

算法会更新,方法论长存。愿你带着它,去看更广阔的世界。