康耐视 VisionPro 机器视觉入门总结:Blob斑点工具 / Fixture定位 / 卡尺 / 几何工具 / 简单脚本

本文是对机器视觉课程中 Cognex VisionPro(QuickBuild 环境)相关知识的完整总结,涵盖 Blob 斑点分析工具、Fixture 定位工具、Caliper 卡尺工具、几何学工具(找圆等)以及 CogToolBlock 简单脚本,文末附课堂配套作业案例。内容基于课堂讲义与 VisionPro 官方文档整理,力求把每个参数"为什么这么设"讲清楚。


一、课程整体框架

机器视觉项目里,一个典型的 VisionPro 视觉流程大致是:

采集图像 → 定位(Fixture + PMA 模板匹配)→ 测量/检测(Blob / Caliper / 找圆等)→ 脚本逻辑(简单脚本)→ 输出结果

本课程围绕五块内容展开:

模块工具作用
斑点分析CogBlobTool按灰度分割图像,查找并分析二维形状(面积、质心、周长等)
定位CogFixtureTool建立跟随工件旋转平移的定位坐标系
卡尺CogCaliperTool在区域内找边缘/边缘对,测量位置与距离
几何工具CogFindCircleTool 等用卡尺结果拟合/查找圆、线、角等几何形状
简单脚本CogToolBlockSimpleScript / AdvancedScriptC# 业务逻辑扩展、流程控制

二、VisionPro 图像空间(坐标系)—— 理解 Fixture 的前提

在 VisionPro 中,图像可以有多个"坐标空间",理解这几个符号非常关键:

符号名称说明
·(点)当前空间图像当前选中的名字空间,即 CogImage.SelectedSpaceName 所指的空间
#像素空间坐标原点为图片左上角,坐标值仅为整数
@根空间默认坐标空间都基于根空间,原点为图片左上角,坐标值为浮点型
*控件像素空间主要用于显示控件(CogDisplay)上
自定义名Fixture 空间用户通过 Fixture 工具自定义建立的定位坐标系

例如在 Caliper 工具的"所选空间名称"下拉框里,就能看到 · 使用输入图像空间、# 使用像素空间、@ 使用根空间 以及自定义的 @Fixture 等选项。

image


三、Blob 斑点分析工具(CogBlobTool)

3.1 概述

Blob 分析(斑点分析) 用于探测并分析图像中的二维形状。它先根据用户设定好的灰阶(灰度)范围对图像进行分割,然后对目标进行查找和分析,报告斑点的多种属性:

  • 面积(Area)
  • 质心(Center of Mass)
  • 周长(Perimeter)
  • 主轴(Principal Axes)
  • 第二惯性矩、几何范围、拓扑关系等

3.2 适用场景与典型应用

Blob 分析非常适合以下场合:

  1. 对象在尺寸、形状和/或方向上差异很大(训练模板很难或不可能);
  2. 对象具有背景中找不到的截然不同的灰度;
  3. 对象没有重叠或者接触。

典型应用案例:

  • 检查环氧树脂点分配的数量、尺寸和形状;
  • 检查表示坏薄片模型的墨水点的正确位置和大小;
  • 检查药片的破碎和大小;
  • 根据对象的尺寸、形状或位置整理或分类对象。

一句话:2D 对象、高对比度、无叠加、尺寸形状不确定时,优先考虑 Blob。

3.3 运行一个 Blob 作业

在 QuickBuild 中添加 Blob 工具并运行,就能在"结果"标签页看到检测出的每个斑点/孔的面积、质心坐标、连通性等信息(下图左侧表格为斑点与孔的结果列表,右侧为 LastRun.BlobImage 分割结果可视化):

image

3.4 界面与关键参数

(1)极性(Polarity)
极性含义
白底黑点在光亮背景上的黑色斑点
黑底白点在黑色背景上的光亮斑点

注意:无论选择哪种极性,后续的形态学处理始终针对"白色区域"。也就是说,白底黑点时,形态学操作的对象是背景(白),这一点务必记住,否则容易把效果搞反。

(2)分段模式(分割算法)—— 本课最核心的知识点

Blob 使用时通常分为分割和分析两步,分割就是第一步,把 Blob 区域找出来。分割模式下拉框里可选:无 / 无映射 / 硬阈值(固定)/ 硬阈值(相对)/ 硬阈值(动态)/ 软阈值(固定)/ 软阈值(相对)/ 减影图像等:

image

各分割算法对比总结:

分割算法原理优点缺点/适用
固定硬阈值设一个绝对灰度值(0~255),按阈值一刀切速度快,适用于光照稳定、双峰分布的图像光照线性变化时会分割失败,无法适应光线
相对硬阈值按像素占比分割(如 40%),不依赖绝对灰度值抗光照变化能力强,亮度变化也能正确分割比固定阈值慢(需计算百分比对应灰度)
动态硬阈值根据输入图像直方图自动计算合适阈值,最小化阈值两侧像素的加权方差无需手动配置,双峰分布图像效果好非双峰分布图像可能分割不好
固定软阈值除目标/背景外,中间有一个过渡区,按权重计算归属适合边缘模糊的场景,减少误判参数多,比硬阈值慢
像素映射用查找表(LUT)精确指定每个灰度值对应的像素权重可处理阈值无法分割的图像(如含孔洞、背景与目标灰度有重叠)灵活性高但配置复杂
阈值(减影)图像与"无对象"的参考图像逐像素做差分割可处理背景像素与对象像素灰度相同的场景需要一张一致的参考图像

硬阈值 vs 软阈值(课堂总结):

  • 硬阈值就是"一刀切",根据阈值把图像分成两部分:背景和斑点;
  • 软阈值分成三部分:除了目标和背景,中间还有一个过渡区,对过渡区按权重值计算,算出它属于目标还是背景。

image

固定阈值的光照问题(重点理解):

下图三幅图从左到右由暗到亮。以固定阈值 100 分割:

  • 暗图像:目标 10、背景 90,都低于 100 → 分割不到;
  • 中间图像:目标 120、背景 160 → 能准确分割;
  • 亮图像:目标 200、背景 120 都高于 100 → 又分割不到。

也就是说,无论硬阈值还是软阈值,在光照亮度线性变化时都会出现无法分割的情况。

image

相对阈值为什么能解决?

相对阈值不是按绝对灰度值分割,而是按对应像素灰度值的占比分割。例如设定 40%:不管图像变亮还是变暗,目标像素个数占总像素个数的比例是固定的,以 40% 来分割就能始终正确分割。

  • 亮度变化时,直方图曲线整体平移:变暗曲线左移,40% 对应的阈值变小;变亮曲线右移,40% 对应的阈值变大——阈值跟着亮度自适应。

image

image

动态硬阈值:

动态硬阈值根据输入图像的直方图自动计算合适的阈值,阈值通过最小化阈值两边像素的加权方差得到。图像直方图呈双峰分布时分割效果很好;如果不是双峰分布,可能得不到好的分割结果。

image

软阈值:

在目标和背景之间存在一个过渡区域,过渡区域可以用"柔和度"设置权重,也就是中间部分属于目标还是背景,根据每个阶段的权重计算得到结果。

image

3.5 连通性(Connectivity)

一个 Blob 由一组连通的像素组成。 VisionPro 中:

  • 对象(目标)使用 8 邻域:上下左右 + 4 个斜对角,边贴边、角对角相接的都算连通;
  • 背景使用 4 邻域:只算上下左右,不算对角;
  • 标记连通性(Label)分析时使用 6 路连接。

image

理解 8 邻域 vs 4 邻域的意义:中间一个目标,以 8 邻域看是一个 Blob;以 4 邻域看可能是 8 个 Blob(因为对角像素不算连通)。连通性设置直接影响斑点数量和状态。

3.6 形态学操作(Morphology)

形态学操作可以突出或消除图像中特定类型的特征。Blob 工具支持在分割后叠加最多 8 个形态学操作(顺序执行)。常用操作:

操作效果用途
侵蚀(腐蚀)白色区域变小消除细微的毛刺、噪声点
扩大(膨胀)白色区域变大让特征更明显,填补小缺口
打开(开运算)先腐蚀后膨胀去毛刺,且保持面积基本不变
关闭(闭运算)先膨胀后腐蚀填充孔洞,保持轮廓

重要提醒:形态学操作处理的是白色像素区域——无论黑底白点还是白底黑点,操作的对象都是白色区域。

image

image

image

3.7 测得尺寸与筛选(过滤/排序)

Blob 运行后会输出所有斑点的测得尺寸(面积、质心 X/Y、连通性标签等)。实际项目中往往只关心某一部分目标,可以通过筛选实现:

  • 例如只保留面积 1000~5000 范围内的斑点:属性选择"面积",尺寸过滤选"包含",低阈值 1000、高阈值 5000;
  • 排除 0 或者包含 1:控制是否把孔也算进来;
  • 还可以启用排序(如按面积升/降序)。

image

image

注意:选择的测得属性越多,工具运行的时间就越长。生产环境中只勾选真正需要的属性,可以明显提升速度。

测得尺寸相关参数里还有一个重要的 拓扑 选项:用于辨别斑点、孔以及孔中的斑点(父子层级关系)。

image

3.8 Blob 属性体系(官方文档补充)

Blob 工具返回的度量值分为三类:

几何属性(斑点自身固有,移动/旋转不改变):

  • 面积:各非零像素加权像素值之和;
  • 周长:外边缘长度(带校正因子);
  • 质心:斑点的平衡点(可能不在斑点内部);
  • 主轴:第二惯性矩最小的轴为长轴,最大为短轴,长短轴合称主轴;
  • 绕主轴的第二惯性矩、几何范围(质心到主轴对齐包围矩形四边的距离)。

非几何属性(相对外部坐标系才有意义,随旋转/位置变化):

  • 斑点中位数、绕坐标轴的第二惯性矩、坐标范围、边界框。

拓扑属性:

  • 标签:该特征是斑点还是孔(灰度连通时 0 表示孔、1 表示斑点);
  • 层级位置:哪个特征包围哪个特征(父子/兄弟关系),可用树结构描述。

派生计算属性:非循环性(圆形为 1)、伸长率、纵横比等。

3.9 Blob 脚本示例(C#)

在 CogToolBlockSimpleScript 中写脚本,可以读取 Blob 结果做业务统计:

// CogToolBlockSimpleScript - ModifyOutputs 事件
using Cognex.VisionPro;
using Cognex.VisionPro.Blob;

public void ModifyOutputs(CogToolBlockSimpleScript host)
{
    // 取出工具块中的 Blob 工具
    CogBlobTool blobTool = (CogBlobTool)host.Tools["CogBlobTool1"];

    // 获取当前筛选条件下的所有斑点
    CogBlobResultCollection blobs = blobTool.Results.GetBlobs();

    // 统计面积在 1000~5000 之间的斑点个数
    int validCount = 0;
    foreach (CogBlobResult blob in blobs)
    {
        if (blob.Area >= 1000 && blob.Area <= 5000)
        {
            validCount++;
        }
    }

    // 输出到工具块的输出端,供后续脚本/界面使用
    host.Outputs["ValidCount"].Value = validCount;
}

四、Fixture 定位工具(CogFixtureTool)

4.1 需求场景

想象一个需求:测量工件的尺寸,用 Caliper(卡尺)工具测量宽度。但如果工件在相机视野里有旋转、平移(位置不固定),直接测量就会失败——这时候需要借助 Fixture 工具。

image

4.2 什么是 Fixture

CogFixtureTool 是一种建立定位坐标系的工具(最常用)。使用前,需要提前通过其他工具(如 PMA 模板匹配 CogPMAlignTool)获得一个 2D 转换关系(即目标点位的 X、Y 和角度信息 GetPose())。它的主要任务:

  1. 往坐标空间树中添加一个定位坐标系(需设定名称);
  2. 建立一个定位后的输出图像供其他工具调用——输出图像像素与输入完全相同,但坐标空间可以选为定位空间或非定位空间。

通俗理解:相当于给图像重新定义了一个坐标系,后续执行的找边、找圆等操作会跟随目标点位的旋转平移而变化。这个随工件旋转而旋转的坐标系就叫 Fixture 坐标系。

image

4.3 结合 PMA 工具建立连接

在 QuickBuild 中把 PMA(CogPMAlignTool)的运行结果传输给 Fixture:

  • 蓝色为每个工具的输出参数,紫色为工具的输入参数;
  • 选择 CogPMAlignTool1 的查找结果 GetPose() 参数(该参数包含了目标点位的 X、Y 和角度信息);
  • 与 PMA 中的结果一一对应。

image

4.4 参数说明

CogFixtureTool 中的参数一般都用默认值,仅需修改名称即可。在"图形"选项卡可以勾选显示坐标系,便于调试时直观看到定位结果。

image

4.5 Fixture 脚本示例

// CogToolBlockSimpleScript - 读取 Fixture 坐标系下的卡尺测量结果
using Cognex.VisionPro;
using Cognex.VisionPro.Caliper;
using Cognex.VisionPro.Fixture;

public void ModifyOutputs(CogToolBlockSimpleScript host)
{
    CogCaliperTool caliper = (CogCaliperTool)host.Tools["CogCaliperTool1"];

    // 卡尺可能返回多个结果,取第一个
    CogCaliperResult result = caliper.Results[0];
    if (result != null && result.GetEdgePairs().Count > 0)
    {
        // 取第一个边线对,Distance 就是边线对之间的距离(即宽度)
        double width = result.GetEdgePairs()[0].Distance;
        host.Outputs["Width"].Value = width;
    }
}

五、Caliper 卡尺工具(CogCaliperTool)

5.1 作用

游标卡尺工具用于辨别对象中的边缘或者边缘对,并报告:

  • 边线对中每条边线的位置;
  • 边线对之间的距离(如工件宽度)。

image

5.2 定义目标区域

卡尺区域指图像中探测到边线的区域,在图形上由输入图像中的蓝色方框表示。区域设置标准:

  1. 包含目标边线;
  2. 边线必须与投影方向平行(可能必须旋转区域);
  3. 在可能时,不包括目标边线以外的特征(可能必须倾斜)。

image

5.3 原理:投影与找边(重点)

投影:将二维图像减少到一维图像——沿规定方向用平行光线累加像素灰度值。好处是减少处理时间和存储,同时维持(部分情况下增强)边线信息。

image

找边原理:卡尺工具用一个筛选算子(滤波算子) 盘旋一维投影图像来执行筛选。

以 -1 0 +1 算子为例(滤波尺寸为 3):

投影图像:  0 0 0 5 10 15 15 15 10 5 0 0 0
筛选算子: -1 0 +1

第一个位置:  -1*0 + 0*0 + 1*0  = 0
第二个位置:  -1*0 + 0*0 + 1*5  = 5
第三个位置:  -1*0 + 0*5 + 1*10 = 10
第四个位置:  -1*5 + 0*10 + 1*15 = 10
...

筛选输出:   0 5 10 10 5 0 0 -5 -10 -10 -5 0

筛选输出图形上会出现边线峰值,峰值的位置就是边缘位置:

image

5.4 主要参数

参数说明
极性边线的方向(暗到亮 / 亮到暗 / 任意)
对比度阈值只有对比度超过该值的边线才被接受
过滤一半像素过滤掉一半像素以消除噪声
最大结果数限制返回的边线数量(也可以查找多个边缘)
边缘对把两条边线配对,报告距离
计分按计分分数曲线得到计分结果

计分(重点):默认单个边线只根据跨边线的对比度计分,边线对根据所测距离与预期距离的匹配程度计分。计分公式为:分数 = 对比度 / X0。

  • 例如某边线对比度 73.4551,X0=255 时:73.4551 / 255 ≈ 0.28 分;
  • 修改 X0 参数为 75,得分就接近 1 分——通过调整 X0 可以让目标边线稳定拿高分。

image

筛选尺寸:筛选尺寸接近边线尺寸时产生较强的边线峰值;筛选尺寸太大或太小都会减少峰值。

5.5 结果与文字标注

结果按照得分从高到低的顺序显示在结果表格中;位置是沿相对于输入区域中心的搜索方向的一维测量值。

image

CogCreateGraphicLabelTool(标注工具):用于标识或注释图像中的关键信息/区域,可以在图像上添加文本(坐标、测量值等)。其输入选择器支持:

  • InputGraphicLabelText 文本
  • InputBoolean 布尔值
  • InputDouble Double 类型
  • InputToolResultConstant 工具结果常量

Formatted(格式化):可以按字符串格式输出,例如 {D:F2} 表示十进制、小数点后保留两位小数。

image


六、几何学工具(Geometry Tools)

6.1 四大类工具

类别工具/作用
创建工具根据提供的输入创建指定的几何形状
查找和匹配工具查找工具用卡尺结果创建指定形状;匹配工具从其他工具的输入创建最佳匹配形状
交叉工具计算来自输入形状的交叉点
测量工具计算角度和/或输入形状之间的距离

image

image

6.2 举例:找圆工具 CogFindCircleTool

CogFindCircleTool 是实际项目中最常用的几何工具之一,由多个卡尺构成,通过卡尺搜索边缘并拟合出圆。使用原则:

  • 尽量不让卡尺重叠;
  • 卡尺要放在灰度值变化明显的区域,一定要让卡尺能够搜索到边;
  • 搜索方向代表扫描方向(向内/向外)。

image

主要参数:

参数说明
卡尺数量圆周上放置的卡尺个数(越多拟合越稳,但耗时增加)
搜索长度每个卡尺沿搜索方向扫描的长度
投影长度卡尺的宽度(投影方向)
搜索方向向内 / 向外
中心 X / Y预期的圆心位置(先粗定位,可结合 Fixture)
半径预期的圆半径
起始角度 / 角度范围0~180° 只找半圆,0~360° 找整圆
半径限制限制拟合圆的半径范围,过滤错误结果
忽略的点数忽略部分边缘点,提高拟合鲁棒性

image

image

运行后即可在结果中看到拟合出的圆(圆心、半径),如下图所示:

image

6.3 其他查找/拟合工具

工具说明
CogFindCornerTool卡尺拟合角度工具,默认两条直线卡尺一定会交互到一个最明显的点上(找角点)
CogFindEllipseTool椭圆查找工具
CogFitCircleTool拟合圆工具,最低要求是三个点成圆
CogMultiLineFinderTool多条线段查找工具

CogMultiLineFinderTool 使用步骤:

  1. 设置搜索范围:尽量小一点,这样抗干扰、更快速;
  2. 调整边缘查找参数:极性、阈值、最小长度。

image

6.4 找圆脚本示例

// CogToolBlockSimpleScript - 读取找圆结果
using Cognex.VisionPro;
using Cognex.VisionPro.Geometric;

public void ModifyOutputs(CogToolBlockSimpleScript host)
{
    CogFindCircleTool findCircle = (CogFindCircleTool)host.Tools["CogFindCircleTool1"];

    // 获取拟合圆(找不到圆时 GetCircle() 可能抛出异常,需判断)
    CogCircle circle = findCircle.Results.GetCircle();
    if (circle != null)
    {
        host.Outputs["CenterX"].Value = circle.CenterX;
        host.Outputs["CenterY"].Value = circle.CenterY;
        host.Outputs["Radius"].Value = circle.Radius;

        // 直径是否在允许范围内
        bool isOk = circle.Radius * 2 >= 90 && circle.Radius * 2 <= 110;
        host.Outputs["DiameterOK"].Value = isOk;
    }
}

七、简单脚本(CogToolBlock)

VisionPro 中脚本本质是 C#(或 VB.Net)语言,核心业务逻辑通过 VisionPro 底层对象模型实现。

CogToolBlock(工具块脚本)分类:

脚本类型适用场景
CogToolBlockSimpleScript(简单脚本)适合外部工具已经获取到值之后,把值传递到脚本中进行业务逻辑拓展(如统计、判断、计算)
CogToolBlockAdvancedScript(视觉逻辑脚本)适合流程控制(如条件分支、循环执行、工具间跳转),是工作中最常用的

配套常用工具:

  • CogImageConvertTool:图像转换工具,可以把彩色图像转成灰度图像;
  • CogHistogramTool:灰阶工具,查看图像的灰度直方图(要求输入灰度图像);
  • CogResultsAnalysisTool:结果集工具,主要用来提供计算能力。

AdvancedScript 流程控制示例:

// CogToolBlockAdvancedScript - 流程控制示例
// currentOp 表示当前执行的步骤序号,numOps 为总步骤数
public int AdvancedRun(CogToolBlockAdvancedScript host, int currentOp, int numOps)
{
    if (currentOp == 1)
    {
        // 第一步:判断 Blob 数量是否合格
        CogBlobTool blobTool = (CogBlobTool)host.Tools["CogBlobTool1"];
        int count = blobTool.Results.GetBlobs().Count;

        if (count < 3)   // 数量不足,直接失败
        {
            host.Outputs["Result"].Value = "NG";
            return 0;    // 停止后续步骤
        }
        else
        {
            host.Outputs["Result"].Value = "OK";
        }
    }
    return currentOp + 1;  // 继续下一步
}

八、配套作业案例(Blob 应用实战)

课堂作业把这些知识用在了真实图像上,正好是 Blob + 定位 + 几何工具的综合练习:

8.1 硬币计数

image

思路:硬币与背景对比度高、互不重叠,适合用 Blob 分割后按面积/质心统计数量。

8.2 标识出整张图中筛子的总点数

image

思路:白骰子黑点在黑背景上对比明显,先分割出骰子(大 Blob),再在每个骰子区域内分割点数(小 Blob),汇总所有点数。

8.3 零件瑕疵检测(Txu 瑕疵检测 / 找出瑕疵零件并标注)

image

思路:好的零件与有缺陷的零件在灰度/形状上有差异,用 Blob 的面积、周长等属性筛选出异常目标,再用 CogCreateGraphicLabelTool 或图形标注把瑕疵框出来。

image

8.4 手机电池正反面识别

image

思路:正反面在特征区域(如文字、电极)上有明显灰度差异,可先用 Fixture+PMA 定位,再在固定区域用 Blob/对比度判断是正面还是反面。

8.5 Mark 定位

image

思路:Mark 点是高对比度的标准特征,用 CogPMAlignTool 模板匹配做粗定位,输出 GetPose() 给 Fixture,为后续测量建立坐标系。


九、避坑指南与经验总结

  1. 阈值选择是 Blob 分析中最不可预测、最困难的环节。光照稳定 → 固定硬阈值(快);光照会变 → 相对阈值(按占比,抗光);要省配置 → 动态硬阈值(适合双峰直方图)。
  2. 固定阈值比相对阈值快(不必计算百分比对应的灰度),但固定阈值可以检测场景中是否有某特征,相对阈值始终会在场景中找到一个斑点——两种思路适用场景不同。
  3. 形态学操作始终作用于白色区域,设极性前想清楚自己要操作的是目标还是背景。
  4. 测得属性越多,运行越慢;生产环境只勾选必要属性,必要时禁用惯性/主惯量等计算以提速。
  5. 卡尺区域要包含目标边线、边线要平行于投影方向、尽量不包含无关特征;筛选尺寸接近边线尺寸时峰值最强。
  6. 找圆时卡尺要放在灰度变化明显的区域且尽量不重叠,角度范围 0~360° 找整圆、0~180° 只找半圆。
  7. Fixture 把"测量坐标系"固定到工件上,后续所有工具(卡尺、找圆)都跟随工件旋转平移,是尺寸测量的前提。
  8. 简单脚本(SimpleScript)适合"取数→算→出结果",AdvancedScript 适合"流程控制",两者配合 CogToolBlock 可以搭建完整的视觉逻辑。

十、参考资料

  • Cognex VisionPro 官方文档《斑点工具(Blob Tool)》
  • 课堂讲义《斑点工具.docx》《fixture与几何工具.docx》《Blob 知识点总结》

如果本文对你有帮助,欢迎点赞、收藏、评论交流~ 后续会继续更新 VisionPro 的 PMA 模板匹配、Caliper 高级计分、AdvancedScript 流程控制等进阶内容。

更多推荐