康耐视 VisionPro 机器视觉入门总结:Blob斑点工具 / Fixture定位 / 卡尺 / 几何工具 / 简单脚本
康耐视 VisionPro 机器视觉入门总结:Blob斑点工具 / Fixture定位 / 卡尺 / 几何工具 / 简单脚本
本文是对机器视觉课程中 Cognex VisionPro(QuickBuild 环境)相关知识的完整总结,涵盖 Blob 斑点分析工具、Fixture 定位工具、Caliper 卡尺工具、几何学工具(找圆等)以及 CogToolBlock 简单脚本,文末附课堂配套作业案例。内容基于课堂讲义与 VisionPro 官方文档整理,力求把每个参数"为什么这么设"讲清楚。
一、课程整体框架
机器视觉项目里,一个典型的 VisionPro 视觉流程大致是:
采集图像 → 定位(Fixture + PMA 模板匹配)→ 测量/检测(Blob / Caliper / 找圆等)→ 脚本逻辑(简单脚本)→ 输出结果
本课程围绕五块内容展开:
| 模块 | 工具 | 作用 |
|---|---|---|
| 斑点分析 | CogBlobTool | 按灰度分割图像,查找并分析二维形状(面积、质心、周长等) |
| 定位 | CogFixtureTool | 建立跟随工件旋转平移的定位坐标系 |
| 卡尺 | CogCaliperTool | 在区域内找边缘/边缘对,测量位置与距离 |
| 几何工具 | CogFindCircleTool 等 | 用卡尺结果拟合/查找圆、线、角等几何形状 |
| 简单脚本 | CogToolBlockSimpleScript / AdvancedScript | C# 业务逻辑扩展、流程控制 |
二、VisionPro 图像空间(坐标系)—— 理解 Fixture 的前提
在 VisionPro 中,图像可以有多个"坐标空间",理解这几个符号非常关键:
| 符号 | 名称 | 说明 |
|---|---|---|
·(点) | 当前空间 | 图像当前选中的名字空间,即 CogImage.SelectedSpaceName 所指的空间 |
# | 像素空间 | 坐标原点为图片左上角,坐标值仅为整数 |
@ | 根空间 | 默认坐标空间都基于根空间,原点为图片左上角,坐标值为浮点型 |
* | 控件像素空间 | 主要用于显示控件(CogDisplay)上 |
| 自定义名 | Fixture 空间 | 用户通过 Fixture 工具自定义建立的定位坐标系 |
例如在 Caliper 工具的"所选空间名称"下拉框里,就能看到
· 使用输入图像空间、# 使用像素空间、@ 使用根空间以及自定义的@Fixture等选项。

三、Blob 斑点分析工具(CogBlobTool)
3.1 概述
Blob 分析(斑点分析) 用于探测并分析图像中的二维形状。它先根据用户设定好的灰阶(灰度)范围对图像进行分割,然后对目标进行查找和分析,报告斑点的多种属性:
- 面积(Area)
- 质心(Center of Mass)
- 周长(Perimeter)
- 主轴(Principal Axes)
- 第二惯性矩、几何范围、拓扑关系等
3.2 适用场景与典型应用
Blob 分析非常适合以下场合:
- 对象在尺寸、形状和/或方向上差异很大(训练模板很难或不可能);
- 对象具有背景中找不到的截然不同的灰度;
- 对象没有重叠或者接触。
典型应用案例:
- 检查环氧树脂点分配的数量、尺寸和形状;
- 检查表示坏薄片模型的墨水点的正确位置和大小;
- 检查药片的破碎和大小;
- 根据对象的尺寸、形状或位置整理或分类对象。
一句话:2D 对象、高对比度、无叠加、尺寸形状不确定时,优先考虑 Blob。
3.3 运行一个 Blob 作业
在 QuickBuild 中添加 Blob 工具并运行,就能在"结果"标签页看到检测出的每个斑点/孔的面积、质心坐标、连通性等信息(下图左侧表格为斑点与孔的结果列表,右侧为 LastRun.BlobImage 分割结果可视化):

3.4 界面与关键参数
(1)极性(Polarity)
| 极性 | 含义 |
|---|---|
| 白底黑点 | 在光亮背景上的黑色斑点 |
| 黑底白点 | 在黑色背景上的光亮斑点 |
注意:无论选择哪种极性,后续的形态学处理始终针对"白色区域"。也就是说,白底黑点时,形态学操作的对象是背景(白),这一点务必记住,否则容易把效果搞反。
(2)分段模式(分割算法)—— 本课最核心的知识点
Blob 使用时通常分为分割和分析两步,分割就是第一步,把 Blob 区域找出来。分割模式下拉框里可选:无 / 无映射 / 硬阈值(固定)/ 硬阈值(相对)/ 硬阈值(动态)/ 软阈值(固定)/ 软阈值(相对)/ 减影图像等:

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

固定阈值的光照问题(重点理解):
下图三幅图从左到右由暗到亮。以固定阈值 100 分割:
- 暗图像:目标 10、背景 90,都低于 100 → 分割不到;
- 中间图像:目标 120、背景 160 → 能准确分割;
- 亮图像:目标 200、背景 120 都高于 100 → 又分割不到。
也就是说,无论硬阈值还是软阈值,在光照亮度线性变化时都会出现无法分割的情况。

相对阈值为什么能解决?
相对阈值不是按绝对灰度值分割,而是按对应像素灰度值的占比分割。例如设定 40%:不管图像变亮还是变暗,目标像素个数占总像素个数的比例是固定的,以 40% 来分割就能始终正确分割。
- 亮度变化时,直方图曲线整体平移:变暗曲线左移,40% 对应的阈值变小;变亮曲线右移,40% 对应的阈值变大——阈值跟着亮度自适应。


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

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

3.5 连通性(Connectivity)
一个 Blob 由一组连通的像素组成。 VisionPro 中:
- 对象(目标)使用 8 邻域:上下左右 + 4 个斜对角,边贴边、角对角相接的都算连通;
- 背景使用 4 邻域:只算上下左右,不算对角;
- 标记连通性(Label)分析时使用 6 路连接。

理解 8 邻域 vs 4 邻域的意义:中间一个目标,以 8 邻域看是一个 Blob;以 4 邻域看可能是 8 个 Blob(因为对角像素不算连通)。连通性设置直接影响斑点数量和状态。
3.6 形态学操作(Morphology)
形态学操作可以突出或消除图像中特定类型的特征。Blob 工具支持在分割后叠加最多 8 个形态学操作(顺序执行)。常用操作:
| 操作 | 效果 | 用途 |
|---|---|---|
| 侵蚀(腐蚀) | 白色区域变小 | 消除细微的毛刺、噪声点 |
| 扩大(膨胀) | 白色区域变大 | 让特征更明显,填补小缺口 |
| 打开(开运算) | 先腐蚀后膨胀 | 去毛刺,且保持面积基本不变 |
| 关闭(闭运算) | 先膨胀后腐蚀 | 填充孔洞,保持轮廓 |
重要提醒:形态学操作处理的是白色像素区域——无论黑底白点还是白底黑点,操作的对象都是白色区域。



3.7 测得尺寸与筛选(过滤/排序)
Blob 运行后会输出所有斑点的测得尺寸(面积、质心 X/Y、连通性标签等)。实际项目中往往只关心某一部分目标,可以通过筛选实现:
- 例如只保留面积 1000~5000 范围内的斑点:属性选择"面积",尺寸过滤选"包含",低阈值 1000、高阈值 5000;
- 排除 0 或者包含 1:控制是否把孔也算进来;
- 还可以启用排序(如按面积升/降序)。


注意:选择的测得属性越多,工具运行的时间就越长。生产环境中只勾选真正需要的属性,可以明显提升速度。
测得尺寸相关参数里还有一个重要的 拓扑 选项:用于辨别斑点、孔以及孔中的斑点(父子层级关系)。

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 工具。

4.2 什么是 Fixture
CogFixtureTool 是一种建立定位坐标系的工具(最常用)。使用前,需要提前通过其他工具(如 PMA 模板匹配 CogPMAlignTool)获得一个 2D 转换关系(即目标点位的 X、Y 和角度信息 GetPose())。它的主要任务:
- 往坐标空间树中添加一个定位坐标系(需设定名称);
- 建立一个定位后的输出图像供其他工具调用——输出图像像素与输入完全相同,但坐标空间可以选为定位空间或非定位空间。
通俗理解:相当于给图像重新定义了一个坐标系,后续执行的找边、找圆等操作会跟随目标点位的旋转平移而变化。这个随工件旋转而旋转的坐标系就叫 Fixture 坐标系。

4.3 结合 PMA 工具建立连接
在 QuickBuild 中把 PMA(CogPMAlignTool)的运行结果传输给 Fixture:
- 蓝色为每个工具的输出参数,紫色为工具的输入参数;
- 选择
CogPMAlignTool1的查找结果GetPose()参数(该参数包含了目标点位的 X、Y 和角度信息); - 与 PMA 中的结果一一对应。

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

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 作用
游标卡尺工具用于辨别对象中的边缘或者边缘对,并报告:
- 边线对中每条边线的位置;
- 边线对之间的距离(如工件宽度)。

5.2 定义目标区域
卡尺区域指图像中探测到边线的区域,在图形上由输入图像中的蓝色方框表示。区域设置标准:
- 包含目标边线;
- 边线必须与投影方向平行(可能必须旋转区域);
- 在可能时,不包括目标边线以外的特征(可能必须倾斜)。

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

找边原理:卡尺工具用一个筛选算子(滤波算子) 盘旋一维投影图像来执行筛选。
以 -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
筛选输出图形上会出现边线峰值,峰值的位置就是边缘位置:

5.4 主要参数
| 参数 | 说明 |
|---|---|
| 极性 | 边线的方向(暗到亮 / 亮到暗 / 任意) |
| 对比度阈值 | 只有对比度超过该值的边线才被接受 |
| 过滤一半像素 | 过滤掉一半像素以消除噪声 |
| 最大结果数 | 限制返回的边线数量(也可以查找多个边缘) |
| 边缘对 | 把两条边线配对,报告距离 |
| 计分 | 按计分分数曲线得到计分结果 |
计分(重点):默认单个边线只根据跨边线的对比度计分,边线对根据所测距离与预期距离的匹配程度计分。计分公式为:分数 = 对比度 / X0。
- 例如某边线对比度 73.4551,X0=255 时:
73.4551 / 255 ≈ 0.28分; - 修改 X0 参数为 75,得分就接近 1 分——通过调整 X0 可以让目标边线稳定拿高分。

筛选尺寸:筛选尺寸接近边线尺寸时产生较强的边线峰值;筛选尺寸太大或太小都会减少峰值。
5.5 结果与文字标注
结果按照得分从高到低的顺序显示在结果表格中;位置是沿相对于输入区域中心的搜索方向的一维测量值。

CogCreateGraphicLabelTool(标注工具):用于标识或注释图像中的关键信息/区域,可以在图像上添加文本(坐标、测量值等)。其输入选择器支持:
InputGraphicLabelText文本InputBoolean布尔值InputDoubleDouble 类型InputToolResultConstant工具结果常量
Formatted(格式化):可以按字符串格式输出,例如 {D:F2} 表示十进制、小数点后保留两位小数。

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


6.2 举例:找圆工具 CogFindCircleTool
CogFindCircleTool 是实际项目中最常用的几何工具之一,由多个卡尺构成,通过卡尺搜索边缘并拟合出圆。使用原则:
- 尽量不让卡尺重叠;
- 卡尺要放在灰度值变化明显的区域,一定要让卡尺能够搜索到边;
- 搜索方向代表扫描方向(向内/向外)。

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


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

6.3 其他查找/拟合工具
| 工具 | 说明 |
|---|---|
| CogFindCornerTool | 卡尺拟合角度工具,默认两条直线卡尺一定会交互到一个最明显的点上(找角点) |
| CogFindEllipseTool | 椭圆查找工具 |
| CogFitCircleTool | 拟合圆工具,最低要求是三个点成圆 |
| CogMultiLineFinderTool | 多条线段查找工具 |
CogMultiLineFinderTool 使用步骤:
- 设置搜索范围:尽量小一点,这样抗干扰、更快速;
- 调整边缘查找参数:极性、阈值、最小长度。

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 硬币计数

思路:硬币与背景对比度高、互不重叠,适合用 Blob 分割后按面积/质心统计数量。
8.2 标识出整张图中筛子的总点数

思路:白骰子黑点在黑背景上对比明显,先分割出骰子(大 Blob),再在每个骰子区域内分割点数(小 Blob),汇总所有点数。
8.3 零件瑕疵检测(Txu 瑕疵检测 / 找出瑕疵零件并标注)

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

8.4 手机电池正反面识别

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

思路:Mark 点是高对比度的标准特征,用 CogPMAlignTool 模板匹配做粗定位,输出 GetPose() 给 Fixture,为后续测量建立坐标系。
九、避坑指南与经验总结
- 阈值选择是 Blob 分析中最不可预测、最困难的环节。光照稳定 → 固定硬阈值(快);光照会变 → 相对阈值(按占比,抗光);要省配置 → 动态硬阈值(适合双峰直方图)。
- 固定阈值比相对阈值快(不必计算百分比对应的灰度),但固定阈值可以检测场景中是否有某特征,相对阈值始终会在场景中找到一个斑点——两种思路适用场景不同。
- 形态学操作始终作用于白色区域,设极性前想清楚自己要操作的是目标还是背景。
- 测得属性越多,运行越慢;生产环境只勾选必要属性,必要时禁用惯性/主惯量等计算以提速。
- 卡尺区域要包含目标边线、边线要平行于投影方向、尽量不包含无关特征;筛选尺寸接近边线尺寸时峰值最强。
- 找圆时卡尺要放在灰度变化明显的区域且尽量不重叠,角度范围 0~360° 找整圆、0~180° 只找半圆。
- Fixture 把"测量坐标系"固定到工件上,后续所有工具(卡尺、找圆)都跟随工件旋转平移,是尺寸测量的前提。
- 简单脚本(SimpleScript)适合"取数→算→出结果",AdvancedScript 适合"流程控制",两者配合 CogToolBlock 可以搭建完整的视觉逻辑。
十、参考资料
- Cognex VisionPro 官方文档《斑点工具(Blob Tool)》
- 课堂讲义《斑点工具.docx》《fixture与几何工具.docx》《Blob 知识点总结》
如果本文对你有帮助,欢迎点赞、收藏、评论交流~ 后续会继续更新 VisionPro 的 PMA 模板匹配、Caliper 高级计分、AdvancedScript 流程控制等进阶内容。
更多推荐



所有评论(0)