1. 项目概述:当VisionPro遇上地面裂痕检测
最近在做一个挺有意思的项目,客户那边需要对大面积的水泥路面、机场跑道或者大型厂区的地坪进行定期的自动化裂痕检测。传统的人工巡检效率低、主观性强,还容易漏检。我们团队接到的任务,就是基于康耐视的VisionPro视觉平台,开发一套能够自动识别、定位并量化地面裂痕的视觉检测系统。这个项目的核心,就是如何利用VisionPro强大的图像处理能力,特别是其Blob分析工具,来精准地“揪出”地面上那些或明或暗、或粗或细的裂纹。
VisionPro作为工业视觉领域的标杆软件,其优势在于提供了丰富、成熟且高度优化的视觉工具库,以及灵活的二次开发接口。而“地面裂痕检测”这个场景,本质上是一个典型的缺陷检测和模式识别问题。裂痕在图像中通常表现为比背景更暗(或更亮,取决于光照)、形状不规则、具有连续性的线状或网状区域。Blob分析,即斑点分析,正是处理这类“连通区域”特征的利器。它通过设定灰度阈值,将图像二值化,然后分析所有连通区域的几何特征(如面积、周长、长宽比、圆度等),从而筛选出符合裂痕特征的区域。
这个项目听起来简单,但实际落地时挑战不少。比如,室外光照变化剧烈,早上和下午拍出来的图像灰度可能天差地别;地面本身可能存在油污、水渍、修补痕迹等干扰;裂痕的宽度、对比度差异很大,有些细如发丝,有些则宽如沟壑。这就要求我们的方案不能是简单的“一刀切”阈值处理,而需要一套结合了图像预处理、动态阈值分割、特征筛选和逻辑判断的完整流程。接下来,我就结合这次项目的实战经验,拆解一下从方案设计到具体实现的各个环节,希望能给正在或打算做类似视觉检测的朋友一些参考。
2. 核心思路与方案设计:构建稳健的裂痕检测流水线
面对地面裂痕检测这个任务,我们的核心目标是:在各种复杂环境下,稳定、准确地找出裂痕,并尽可能减少误报和漏报。基于VisionPro,我们设计了一套模块化的处理流水线(Job)。这个流水线不是单个工具的粗暴应用,而是多个工具协同工作的结果。
2.1 整体处理流程设计
我们的核心流水线结构如下,它模拟了一个视觉工程师在VisionPro QuickBuild环境中搭建作业的逻辑:
- 图像采集与输入:接收来自工业相机(通常是面阵相机配合线性光源或穹顶光)的原始图像。对于大范围检测,可能需要配合运动控制进行图像拼接。
- 图像预处理:这是提升后续处理稳定性的关键。主要目的是增强裂痕与背景的对比度,同时抑制噪声和无关干扰。
- 滤波去噪:使用
CogIPTwoImageSubtract工具配合高斯滤波,或直接使用CogIPOneImageFilter工具进行中值滤波、均值滤波,消除图像传感器噪声和微小的纹理干扰。 - 对比度增强:对于光照不均的图像,使用
CogIPOneImageHistogram工具分析灰度分布,然后可能采用CogIPOneImageLookupTable进行灰度拉伸,或者使用CogIPOneImageMorphology工具中的顶帽运算(Top-Hat)来增强暗背景下的亮细节(或底帽运算增强亮背景下的暗细节),这对凸显裂痕非常有效。
- 滤波去噪:使用
- 感兴趣区域(ROI)设定:并非整张图都需要处理。我们可以通过
CogRectangle、CogPolygon等图形交互工具,在图像上划定需要检测的区域,排除边缘、固定设施等无关区域,大幅提升处理速度。 - 核心分割:Blob分析:在预处理后的图像和设定的ROI内,使用
CogBlobTool工具。这是我们的核心武器。- 分割(Segmentation):选择合适的分割方法。对于裂痕,常用的是“动态阈值”(如基于局部灰度统计的
CogBlobSegmentationPolarity)或“硬阈值”。我们更倾向于使用“软阈值”或结合预处理后的边缘强度图像进行分割,以应对光照变化。 - 特征提取:配置需要计算的Blob特征,如
Area(面积)、Perimeter(周长)、Aspect(长宽比)、Circularity(圆度)、PrincipalAxisAngle(主轴角度)等。裂痕通常具有面积适中、周长面积比较大(形状复杂)、长宽比很高(细长)、圆度很低的特点。
- 分割(Segmentation):选择合适的分割方法。对于裂痕,常用的是“动态阈值”(如基于局部灰度统计的
- 特征筛选与分类:在
CogBlobTool内部或通过后续的CogBlobFilter工具,根据上一步提取的特征设置过滤条件。例如:Area > 50ANDArea < 5000(排除过小的噪声点和过大的非裂痕区域)Aspect > 5(筛选出细长的形状,这是裂痕的典型特征)Circularity < 0.3(排除圆形或近似圆形的干扰物,如石子、污点) 通过“与”、“或”逻辑组合这些条件,可以初步筛选出候选裂痕Blob。
- 后处理与逻辑判断:单纯的Blob筛选可能还不够。
- Blob合并:对于断断续续的裂痕,可能会被分割成多个小Blob。可以使用
CogBlobMerge工具,根据距离和方向将相邻的、特征相似的Blob合并成一个,更真实地反映裂痕的连续形态。 - 几何关系判断:有时需要结合
CogLine、CogCircle等几何查找工具,或者使用CogBlobTool输出的Blob位置(CenterX,CenterY)和角度,进行更复杂的空间逻辑判断,比如裂痕是否沿着某个方向延伸、是否与某些基准线相交等。
- Blob合并:对于断断续续的裂痕,可能会被分割成多个小Blob。可以使用
- 结果输出与可视化:将最终判定为裂痕的Blob区域坐标、尺寸、特征值输出,可以通过
CogDisplay控件在UI上高亮显示(如用红色轮廓勾勒),同时生成检测报告(OK/NG,裂痕数量、最大长度、总面积等)。
注意:这个流程不是固定的。对于极其细微的裂痕,可能需要先进行边缘检测(如
CogIPOneImageEdge),将边缘强度图作为Blob工具的输入图像。对于网状裂纹,可能需要调整特征筛选策略,更关注区域的“枝状”程度。
2.2 为什么选择VisionPro和Blob分析?
市面上视觉库很多,OpenCV也很强大。但我们选择VisionPro进行二次开发,主要基于以下几点考量:
- 工具成熟稳定:VisionPro的
CogBlobTool是经过无数工业场景验证的,其算法效率和稳定性极高,特别是对于连通区域的分析和特征计算,比自己用OpenCV从头实现要可靠得多。 - 开发效率:QuickBuild图形化环境可以快速搭建和调试算法流程,所见即所得。确定方案后,再通过C#或VB.NET进行二次开发封装,效率远高于纯代码开发。
- 硬件兼容性与性能:VisionPro对康耐视及主流工业相机、采集卡的支持最好,图像采集和显示的底层优化到位。其工具大多支持GPU加速,处理高分辨率图像时优势明显。
- Blob工具的强大与灵活:
CogBlobTool提供了多达数十种特征值,并且分割方式多样(硬阈值、软阈值、动态阈值、基于对比度等),过滤条件可以灵活组合,几乎能满足所有基于连通区域的检测需求。
3. 关键工具详解与参数调优实战
在这一部分,我们深入CogBlobTool的内部,看看那些关键的参数如何影响我们的检测结果。调参的过程,其实就是让工具“理解”什么是裂痕的过程。
3.1 CogBlobTool 核心参数拆解
输入图像与ROI:
- 输入图像:通常接预处理后的图像。有时,直接使用原始图像的灰度图或某个颜色通道(如V通道)效果更好,需要测试。
- ROI:支持多种形状。对于地面检测,常用
CogRectangle或CogPolygon。技巧:可以在代码中动态调整ROI,比如根据图像中地平线或固定标志物的位置,实时移动检测区域。
分割(Segmentation)参数:这是成败的关键。
- 极性(Polarity):指定寻找比背景亮(LightBlobs)还是暗(DarkBlobs)的斑点。地面裂痕通常是暗的,所以选择
DarkBlobs。但如果打光是低角度背光,裂痕也可能显得更亮,需要根据实际成像确定。 - 分割模式(SegmentationMode):
HardFixedThreshold: 固定阈值。最简单,但受光照影响大。Threshold值需要谨慎设置。SoftFixedThreshold: 软阈值。指定一个阈值范围(LowThreshold到HighThreshold),在此范围内的像素被视为“可能属于Blob”,通过模糊边界来减少噪声影响。比硬阈值更稳健。HardDynamicThreshold: 动态阈值。基于ROI内局部区域的灰度统计(如均值、中值)来计算阈值,能很好地适应光照不均。需要设置ThresholdRange(相对于局部统计值的偏移量)。这是我们最推荐用于室外场景的模式。
- 预处理(Preprocessing):在分割前对ROI内的图像进行二次处理。例如,选择
Median(中值滤波)可以进一步平滑噪声,但可能模糊细微裂痕。需要权衡。
- 极性(Polarity):指定寻找比背景亮(LightBlobs)还是暗(DarkBlobs)的斑点。地面裂痕通常是暗的,所以选择
连通性(Connectivity)与清理(Cleaning):
- 连通性:定义像素如何被认为是连通的,
Four(四连通)或Eight(八连通)。八连通更宽松,容易将斜向的裂痕连接起来,但也可能将本不连通的区域连上。通常先尝试八连通。 - 清理:
FillHoles(填充孔洞):如果裂痕内部有亮斑,勾选此项会使Blob更完整。ExcludeBlobsOnROIBoundary(排除边界Blob):通常勾选,避免ROI边缘不完整的Blob干扰。
- 连通性:定义像素如何被认为是连通的,
3.2 特征筛选条件的设置艺术
在CogBlobTool的“运行参数”中,可以设置“包含”或“排除”过滤器。我们的目标是写出一组“裂痕特征画像”。
- 面积(Area):设置一个下限(如>30像素)过滤噪声,设置一个上限(如<10000像素)排除大面积污渍或阴影。这个值需要根据图像分辨率和实际裂痕大小换算。
- 长宽比(Aspect):裂痕是细长的。我们可以设置
Aspect > 4。但要注意,非常弯曲的裂痕其外接矩形的长宽比可能不高,这时需要结合其他特征。 - 圆度(Circularity):计算公式为
4π * Area / (Perimeter^2)。完美圆形为1,线状物体接近0。裂痕的圆度通常很低,可以设置Circularity < 0.4。 - 实积比(Solidity):Blob面积与其凸包面积之比。衡量“紧凑度”。有分支的裂痕实积比较低。可以设置
Solidity < 0.6来排除实心的块状物。 - 对比度(Contrast):Blob与周围背景的平均灰度差。真正的裂痕应该有明显的对比度。可以设置
Contrast > 20(灰度值范围0-255)。
实操心得:不要试图用一组苛刻的条件一次性筛出完美结果。应该采用“逐步排除法”。先设置宽松的条件,让工具找出所有可能的候选Blob。然后在QuickBuild中查看这些Blob,分析误报的Blob(如石子、阴影)和漏报的裂痕在特征上有何不同。据此调整或增加过滤条件。例如,发现某些阴影虽然细长但面积巨大,就加上面积上限;发现某些污点实积比高,就加上实积比上限。
3.3 与其它工具的联动技巧
单一工具能力有限,组合拳才威力大。
- 预处理 + Blob:如前所述,使用顶帽运算预处理,能极大增强暗裂痕。在
CogIPOneImageMorphologyTool中,选择TopHat操作,结构元素(StructuringElement)的大小要略大于裂痕的宽度。 - 边缘检测 + Blob:对于对比度极弱的裂痕,先用
CogIPOneImageEdgeTool(如Sobel算子)提取边缘,得到一幅边缘强度图。然后将这幅图作为CogBlobTool的输入图像,此时寻找的就是“高边缘强度的连通区域”。这种方法对微弱裂痕非常敏感。 - Blob + 几何查找:用
CogBlobTool找到候选区域后,可以将其中心点或边界点作为输入,传递给CogLineFinderTool或CogCircleFinderTool,来拟合裂痕的整体走向或判断其是否构成特定几何形状,用于更高级的分类。
4. 二次开发实现:从QuickBuild到独立应用
在QuickBuild中调试好流程后,我们需要将其移植到一个独立的C# WinForms或WPF应用程序中,实现参数配置、批量处理、数据保存等功能。这里涉及到VisionPro的二次开发API。
4.1 开发环境搭建与引用
首先,在Visual Studio中创建项目,并添加必要的VisionPro程序集引用。最核心的是Cognex.VisionPro.dll和Cognex.VisionPro.Core.dll。如果用到图像处理模块,还需要引用Cognex.VisionPro.ImageProcessing.dll。确保你的开发机安装了对应版本的VisionPro。
4.2 核心代码结构:封装一个裂痕检测类
一个好的做法是将整个检测流程封装成一个类,例如CrackDetector。
using Cognex.VisionPro; using Cognex.VisionPro.Blob; using Cognex.VisionPro.ImageProcessing; // ... 其他命名空间 public class CrackDetector { private CogBlobTool _blobTool; private CogIPOneImageMorphologyTool _morphologyTool; private CogRectangle _roi; // 可配置的参数 public double DynamicThresholdOffset { get; set; } = -20.0; // 动态阈值偏移量 public double MinAspect { get; set; } = 4.0; public double MaxCircularity { get; set; } = 0.4; public CrackDetector() { InitializeTools(); } private void InitializeTools() { // 1. 初始化形态学工具(顶帽增强) _morphologyTool = new CogIPOneImageMorphologyTool(); _morphologyTool.RunParams.Operation = CogIPOneImageMorphologyOperationConstants.TopHat; _morphologyTool.RunParams.StructuringElement = new CogIPOneImageMorphologyStructureElement( CogIPOneImageMorphologyStructureElementConstants.Square, 5, 5); // 5x5方形结构元素 // 2. 初始化Blob工具 _blobTool = new CogBlobTool(); // 2.1 配置分割参数 - 使用硬动态阈值 CogBlobSegmentationHardDynamicThreshold seg = new CogBlobSegmentationHardDynamicThreshold(); seg.ThresholdRange = DynamicThresholdOffset; // 低于局部均值20灰度值的像素被选中 seg.Polarity = CogBlobSegmentationPolarityConstants.DarkBlobs; _blobTool.SegmentationParams = seg; _blobTool.SegmentationParams.Mode = CogBlobSegmentationModeConstants.HardDynamicThreshold; // 2.2 配置连通性 _blobTool.ConnectivityCleanup = CogBlobConnectivityCleanupConstants.FillHoles; _blobTool.ConnectivityMode = CogBlobConnectivityModeConstants.Grayscale; _blobTool.ConnectivityEightConnected = true; // 2.3 配置特征过滤器(示例:长宽比和圆度) CogBlobFilter filter = new CogBlobFilter(); filter.Filter = CogBlobFilterConstants.Aspect; filter.Mode = CogBlobFilterModeConstants.IncludeBlobsInRange; filter.Low = MinAspect; filter.High = 1000; // 设置一个很大的上限 _blobTool.RunParams.BlobFilters.Add(filter); filter = new CogBlobFilter(); filter.Filter = CogBlobFilterConstants.Circularity; filter.Mode = CogBlobFilterModeConstants.IncludeBlobsInRange; filter.Low = 0; filter.High = MaxCircularity; _blobTool.RunParams.BlobFilters.Add(filter); // 3. 初始化ROI(可在运行时调整) _roi = new CogRectangle(); _roi.SetCenterLengthsRotation(320, 240, 600, 480, 0); // 示例:中心(320,240),宽600,高480 _blobTool.Region = _roi; } public List<CrackInfo> Detect(ICogImage inputImage) { List<CrackInfo> results = new List<CrackInfo>(); try { // Step 1: 图像预处理 _morphologyTool.InputImage = inputImage; _morphologyTool.Run(); ICogImage processedImage = _morphologyTool.OutputImage; // Step 2: 设置ROI(这里可以动态更新ROI) // _blobTool.Region = GetDynamicROI(inputImage); // Step 3: 执行Blob分析 _blobTool.InputImage = processedImage; _blobTool.Run(); // Step 4: 解析结果 if (_blobTool.Results != null && _blobTool.Results.GetBlobs() != null) { foreach (ICogBlob blob in _blobTool.Results.GetBlobs()) { // 将Blob结果转换为自定义的数据结构 CrackInfo crack = new CrackInfo { CenterX = blob.CenterX, CenterY = blob.CenterY, Area = blob.Area, Perimeter = blob.Perimeter, Aspect = blob.Aspect, BoundingBox = blob.BoundingBox }; results.Add(crack); } } } catch (Exception ex) { // 记录日志 System.Diagnostics.Debug.WriteLine($"检测失败: {ex.Message}"); } return results; } } // 自定义的裂痕信息类 public class CrackInfo { public double CenterX { get; set; } public double CenterY { get; set; } public double Area { get; set; } public double Perimeter { get; set; } public double Aspect { get; set; } public ICogRectangle BoundingBox { get; set; } }4.3 界面集成与结果显示
在窗体上,你需要放置一个CogDisplay控件来显示图像和结果。
// 在窗体加载或检测完成后调用 private void DisplayImageAndResults(ICogImage image, List<CrackInfo> cracks) { // 清空显示 cogDisplay1.Image = null; cogDisplay1.InteractiveGraphics.Clear(); cogDisplay1.StaticGraphics.Clear(); // 设置图像 cogDisplay1.Image = image; // 创建图形集合 CogGraphicCollection graphics = new CogGraphicCollection(); // 为每个检测到的裂痕绘制红色边界框 CogColorConstants highlightColor = CogColorConstants.Red; foreach (var crack in cracks) { if (crack.BoundingBox != null) { CogRectangle graphicRect = new CogRectangle(crack.BoundingBox); graphicRect.Color = highlightColor; graphicRect.LineWidthInScreenPixels = 2; graphics.Add(graphicRect); // 也可以绘制中心点 CogPointMarker graphicCenter = new CogPointMarker(); graphicCenter.X = crack.CenterX; graphicCenter.Y = crack.CenterY; graphicCenter.Color = CogColorConstants.Green; graphicCenter.SizeInScreenPixels = 8; graphics.Add(graphicCenter); } } // 将图形添加到Display的静态图层 cogDisplay1.StaticGraphics.AddList(graphics, "Cracks"); }重要提示:VisionPro的对象(如
ICogImage,CogRectangle)使用了非托管资源。在长时间运行或处理大量图像的应用中,务必注意及时释放。可以使用using语句或在适当的时机调用Dispose()方法,避免内存泄漏。
5. 避坑指南与性能优化
在实际部署中,我们踩过不少坑,也总结了一些优化经验。
5.1 常见问题与排查
检测不到裂痕(漏检):
- 可能原因:预处理过度,裂痕被平滑掉了;阈值设置过高;Blob面积下限设得太大;光照太暗,裂痕与背景对比度不足。
- 排查:在
CogDisplay中逐步查看预处理后的图像,确认裂痕是否可见。暂时移除所有Blob过滤器,看工具是否能找到任何Blob。如果找不到,问题出在分割之前(图像/预处理/阈值)。如果能找到但不是裂痕,问题出在特征过滤上。
误报太多(将石子、阴影等识别为裂痕):
- 可能原因:特征过滤条件太宽松;预处理未能有效抑制干扰;ROI包含了过多复杂背景。
- 排查:查看误报的Blob特征。如果误报Blob面积大但形状紧凑,加强
Circularity或Solidity过滤。如果是阴影,其灰度值可能和裂痕不同,可以尝试在预处理阶段使用颜色信息(如果是彩色相机)或尝试不同的分割极性。
处理速度慢:
- 可能原因:图像分辨率过高;ROI过大;计算的特征过多;未启用硬件加速。
- 优化:
- 降低分辨率:如果裂痕宽度在像素级可接受,可以在采集后或预处理时对图像进行降采样(如使用
CogIPOneImageResize工具)。 - 缩小ROI:精确限定检测区域。
- 精简特征:在
CogBlobTool的“运行参数”中,只勾选你真正需要用于过滤和输出的特征。计算不必要的特征会消耗时间。 - 启用GPU:确保VisionPro的GPU加速功能已开启(在QuickBuild的“作业”属性或API中设置),并确认你的显卡驱动支持。
- 降低分辨率:如果裂痕宽度在像素级可接受,可以在采集后或预处理时对图像进行降采样(如使用
Blob断裂:
- 可能原因:裂痕本身不连续;分割阈值不合适,导致中间部分灰度值未达到阈值;连通性设置(四连通)导致斜向连接断开。
- 解决:尝试使用“软阈值”(Soft Threshold)或更宽松的动态阈值。将连通性改为八连通。或者,如前所述,在Blob分析后使用
CogBlobMerge工具,根据距离和角度合并相邻的Blob。
5.2 针对室外场景的专项优化
室外光照变化是最大挑战。
- 采用动态阈值:这是必须的。
HardDynamicThreshold或SoftDynamicThreshold能跟随图像局部亮度变化。 - 结合多种特征:不要只依赖灰度。裂痕的纹理与完好地面不同。可以尝试在预处理中提取纹理特征(如使用
CogIPOneImageTexture工具生成纹理能量图),再对此图进行Blob分析。 - 多模型或自适应参数:如果一天中光照条件变化有规律,可以训练多个参数集(例如,上午一套,中午一套,下午一套),系统根据时间自动切换。更高级的做法是,在图像中找一个“参考区域”(一块肯定没有裂痕的好地面),实时计算该区域的灰度统计值,并以此为基础动态调整全局或局部阈值。
- 利用先验知识:裂痕通常有方向性(如平行于道路方向)。可以在特征筛选中加入
PrincipalAxisAngle(主轴角度)的条件,只保留方向在特定范围内的Blob。
5.3 脚本(Script)的巧妙应用
在VisionPro QuickBuild中,可以使用VB.NET或C#脚本工具(CogScript)来实现复杂的逻辑判断,这比单纯用图形化工具连线更灵活。
例如,我们可以写一个脚本,对CogBlobTool输出的Blob集合进行后处理:
' 假设输入是一个Blob结果集合 Sub Main(ByVal blobResults As Object, ByRef outputMessage As String) Dim totalCrackArea As Double = 0 Dim maxCrackLength As Double = 0 Dim crackCount As Integer = 0 If Not blobResults Is Nothing Then For Each blob As ICogBlob In blobResults ' 这里可以添加更复杂的逻辑,比如判断多个Blob是否在同一条直线上 totalCrackArea += blob.Area ' 估算长度:用周长或主轴长度 Dim estimatedLength As Double = blob.Perimeter / 2 If estimatedLength > maxCrackLength Then maxCrackLength = estimatedLength End If crackCount += 1 Next End If ' 设置用户结果,可以在界面显示或用于流程判断 CogScript1.UserResult = "发现裂痕: " & crackCount & " 条, 总面积: " & totalCrackArea.ToString("F1") & " px², 最长约: " & maxCrackLength.ToString("F1") & " px" ' 也可以根据面积总和判断NG/OK If totalCrackArea > 1000 Then CogScript1.TerminationCode = CogScriptTerminationCodeConstants.Fail Else CogScript1.TerminationCode = CogScriptTerminationCodeConstants.Pass End If End Sub这个脚本工具可以接在Blob工具后面,实现对检测结果的综合评判,而不仅仅是单个Blob的特征过滤。
6. 项目扩展与高级应用思考
基础的地面裂痕检测实现后,我们可以根据需求进行功能扩展。
- 裂痕分类与评级:通过分析Blob的形态特征(如枝状程度、弯曲度)、分布特征(集中或分散),可以对裂痕进行分类(线性裂纹、网状龟裂、块状破碎)。进一步,可以设定评级标准,例如根据裂痕的总面积占ROI面积的比例,将地面状况划分为“优、良、中、差”等级。
- 三维信息获取:如果使用双目相机或激光轮廓传感器,可以获得地面的三维点云数据。裂痕在三维上表现为凹陷或凸起。可以将2D图像检测到的裂痕区域映射到3D点云上,计算裂痕的深度和体积,这对于评估结构损伤程度至关重要。
- 与GIS系统集成:对于道路、机场等大面积检测,通常需要结合GPS或编码器获取位置信息。可以将检测到的每一处裂痕的图像、特征数据和地理坐标绑定,生成一张“裂痕病害地图”,方便养护部门精准定位和规划维修。
- 深度学习辅助:对于极其复杂、传统算法难以定义的裂痕(如伴随渗水、修补的复杂纹理),可以引入深度学习。例如,用VisionPro的
CogDeepLearning工具进行语义分割,直接像素级标注出裂痕区域。或者,用传统方法(Blob)进行初筛,再用一个小型分类网络对候选区域进行“真伪”判别,可以显著降低误报率。
这个项目让我深刻体会到,工业视觉项目成功的关键,往往不在于使用了多么高深的算法,而在于对应用场景的深刻理解,以及将成熟可靠的工具进行巧妙、稳健的组合。VisionPro的Blob工具就像一个强大的积木,而我们的任务,就是根据“地面裂痕”这幅蓝图,搭出最坚固、最适用的房子。参数调优是一个需要耐心和经验的“手艺活”,没有一成不变的配方,最好的老师永远是实际拍摄的图像和不断的测试迭代。