一、前言

在机器视觉缺陷检测、孔洞识别项目中,使用CogBlobTool抓取目标斑点、用 C# 脚本自动描轮廓是最常用方案。本文基于 VisionPro ToolBlock 高级脚本,实现自动提取 Blob 外轮廓、红色描边、原图叠加显示,适配裂缝、杂质、圆孔检测场景。

二、整体原理

  1. CogBlobTool:灰度二值化,筛选有效斑点(面积、圆度、长宽比过滤杂质);
  2. 脚本遍历所有 Blob,调用GetBoundary()生成斑点闭合轮廓多边形;
  3. 统一存入图形容器,在ModifyLastRunRecord批量渲染绘制,实现原图红圈标注。

三、完整可用源码

1. 头部引用区

#region namespace imports
using System;
using Cognex.VisionPro;
using Cognex.VisionPro.ToolBlock;
using Cognex.VisionPro.Blob;
using Cognex.VisionPro.Graphics;
#endregion

2. 成员变量区

#region Private Member Variables
private CogToolBlock mToolBlock;
//图形集合:缓存所有轮廓,统一绘图
private CogGraphicCollection gc = new CogGraphicCollection();
#endregion

3. 主运行逻辑 GroupRun

public override bool GroupRun(ref string message, ref CogToolResultConstants result)
{
    //每次运行清空上次图形,避免重复叠加
    gc.Clear();

    //顺序执行块内所有视觉工具
    foreach (ICogTool tool in mToolBlock.Tools)
    {
        mToolBlock.RunTool(tool, ref message, ref result);
    }

    //绑定Blob工具
    CogBlobTool blob = mToolBlock.Tools["CogBlobTool1"] as CogBlobTool;
    //空值容错:防止工具不存在/无结果报错崩溃
    if (blob == null || blob.Results == null || blob.Results.GetBlobs().Length == 0)
    {
        message = "未检测到有效斑点";
        return false;
    }

    //遍历每一个斑点,生成红色轮廓
    foreach (CogBlobResult b in blob.Results.GetBlobs())
    {
        //获取斑点闭合外轮廓
        CogPolygon p = b.GetBoundary();
        //设置轮廓颜色:红色
        p.Color = CogColorConstants.Red;
        //绑定图像坐标系,解决图形偏移错位
        p.Space = CogGraphicSpaceConstants.Image;
        //轮廓存入集合,等待统一绘制
        gc.Add(p);
    }

    message = $"一共检测到{blob.Results.GetBlobs().Length}个斑点";
    return false;
}

4. 绘图回调 ModifyLastRunRecord

public override void ModifyLastRunRecord(ICogRecord lastRecord)
{
    //遍历所有缓存图形,绘制到主预览画面
    foreach (ICogGraphic c in gc)
    {
        //DisplayLayer=全局主图层,画面直接显示标注
        mToolBlock.AddGraphicToRunRecord(c, lastRecord, "DisplayLayer", "");
    }
}

5. 初始化绑定

public override void Initialize(Cognex.VisionPro.ToolGroup host)
{
    base.Initialize(host);
    mToolBlock = host as CogToolBlock;
}

四、关键代码分段详解

1. b.GetBoundary()

从单个 Blob 结果中提取闭合多边形轮廓,沿着斑点实际边缘生成线条,是实现描红的核心 API。

2. p.Space = CogGraphicSpaceConstants.Image;

强制图形使用图像像素坐标系,不加此行:图像缩放、ROI 偏移后轮廓会错位乱跑。

3. gc.Clear()

每次运行清空容器,防止多次运行轮廓重复叠加在画面上。

4. 图层DisplayLayer

  • DisplayLayer:全局预览窗口显示(日常项目首选);
  • "CogBlobTool1.InputImage":仅在 Blob 工具弹窗内显示,调试专用。

五、Blob 工具配套参数设置

  1. 二值极性:斑点黑底选「浅色区域」,斑点白底选「深色区域」;
  2. 特征筛选:最小面积过滤灰尘噪点,圆度 / 长宽比筛选异形杂质;
  3. 测试:单独运行 Blob,预览窗口确认斑点被正确框选后再启用脚本。

六、拓展进阶

  1. 标注文字:在foreach内新增CogGraphicLabel,在斑点质心标注面积、序号;
  2. 多颜色区分:根据面积大小,大瑕疵红圈、小杂质绿圈;
  3. 缺陷统计:统计 Blob 数量,输出 OK/NG 结果到端口对接上位机。

七、总结

该写法是 VisionPro 工业项目标准绘图规范:先收集所有图形→后统一绘制,代码鲁棒性高、易维护,广泛用于裂纹检测、缺料、孔洞不良等视觉项目。

更多推荐