VisionPro之校准与定位工具

文章目录

  • [1. CogCalibCheckerboardTool --- 棋盘格校准工具](#1. CogCalibCheckerboardTool — 棋盘格校准工具)
    • [1.1 引用命名空间与程序集](#1.1 引用命名空间与程序集)
    • [1.2 工具类继承关系](#1.2 工具类继承关系)
    • [1.3 CogCalibCheckerboardTool 主要属性](#1.3 CogCalibCheckerboardTool 主要属性)
    • [1.4 校准模式说明](#1.4 校准模式说明)
    • [1.5 CogCalibCheckerboardResult 结果属性](#1.5 CogCalibCheckerboardResult 结果属性)
    • [1.6 CogCalibCheckerboardTool 主要方法](#1.6 CogCalibCheckerboardTool 主要方法)
    • [1.7 CogCalibCheckerboardTool 主要事件](#1.7 CogCalibCheckerboardTool 主要事件)
    • [1.8 使用方法与配置流程](#1.8 使用方法与配置流程)
      • [1.8.1 **步骤 1:准备棋盘格标定板**](#1.8.1 步骤 1:准备棋盘格标定板)
      • [1.8.2 **步骤 2:采集标定图像**](#1.8.2 步骤 2:采集标定图像)
      • [1.8.3 **步骤 3:配置工具参数**](#1.8.3 步骤 3:配置工具参数)
      • [1.8.4 **步骤 4:执行校准**](#1.8.4 步骤 4:执行校准)
      • [1.8.5 **步骤 5:使用校准结果**](#1.8.5 步骤 5:使用校准结果)
    • [1.9 示例代码](#1.9 示例代码)
      • [1.9.1 基本棋盘格校准](#1.9.1 基本棋盘格校准)
      • [1.9.2 查看校准结果与精度评估](#1.9.2 查看校准结果与精度评估)
      • [1.9.3 自定义棋盘格参数](#1.9.3 自定义棋盘格参数)
      • [1.9.4 校准结果保存与加载(.vpp 序列化)](#1.9.4 校准结果保存与加载(.vpp 序列化))
      • [1.9.5 在ToolGroup中关联编辑控件](#1.9.5 在ToolGroup中关联编辑控件)
      • [1.9.6 校准后图像的坐标转换](#1.9.6 校准后图像的坐标转换)
  • [2. CogCalibNPointToNPointTool --- N点标定工具](#2. CogCalibNPointToNPointTool — N点标定工具)
    • [2.1 引用命名空间与程序集](#2.1 引用命名空间与程序集)
    • [2.2 工具类继承关系](#2.2 工具类继承关系)
    • [2.3 CogCalibNPointToNPointTool 主要属性](#2.3 CogCalibNPointToNPointTool 主要属性)
    • [2.4 标定模型与变换类型](#2.4 标定模型与变换类型)
    • [2.5 CogCalibNPointToNPointResult 结果属性](#2.5 CogCalibNPointToNPointResult 结果属性)
    • [2.6 CogCalibNPointToNPointTool 主要方法](#2.6 CogCalibNPointToNPointTool 主要方法)
    • [2.7 CogCalibNPointToNPointTool 主要事件](#2.7 CogCalibNPointToNPointTool 主要事件)
    • [2.8 使用方法与配置流程](#2.8 使用方法与配置流程)
      • [2.8.1 **步骤 1:采集标定点对**](#2.8.1 步骤 1:采集标定点对)
      • [2.8.2 **步骤 2:添加标定点对**](#2.8.2 步骤 2:添加标定点对)
      • [2.8.3 **步骤 3:选择变换模型**](#2.8.3 步骤 3:选择变换模型)
      • [2.8.4 **步骤 4:执行标定**](#2.8.4 步骤 4:执行标定)
    • [2.9 示例代码](#2.9 示例代码)
      • [2.9.1 基本N点标定](#2.9.1 基本N点标定)
      • [2.9.2 添加标定点对并计算变换](#2.9.2 添加标定点对并计算变换)
      • [2.9.3 选择不同变换模型](#2.9.3 选择不同变换模型)
      • [2.9.4 标定精度验证与误差分析](#2.9.4 标定精度验证与误差分析)
      • [2.9.5 标定结果保存与加载](#2.9.5 标定结果保存与加载)
      • [2.9.6 与 FixtureTool 联合使用](#2.9.6 与 FixtureTool 联合使用)
  • [3. CogFixtureTool --- 坐标定位工具](#3. CogFixtureTool — 坐标定位工具)
    • [3.1 引用命名空间与程序集](#3.1 引用命名空间与程序集)
    • [3.2 工具类继承关系](#3.2 工具类继承关系)
    • [3.3 CogFixtureTool 主要属性](#3.3 CogFixtureTool 主要属性)
    • [3.4 空间概念详解](#3.4 空间概念详解)
    • [3.5 CogFixtureRunParams 关键运行参数](#3.5 CogFixtureRunParams 关键运行参数)
    • [3.6 CogFixtureTool 主要方法](#3.6 CogFixtureTool 主要方法)
    • [3.7 CogFixtureTool 主要事件](#3.7 CogFixtureTool 主要事件)
    • [3.8 使用方法与配置流程](#3.8 使用方法与配置流程)
      • [3.8.1 **步骤 1:添加工具**](#3.8.1 步骤 1:添加工具)
      • [3.8.2 **步骤 2:连接图像源**](#3.8.2 步骤 2:连接图像源)
      • [3.8.3 **步骤 3:提供变换关系(最关键)**](#3.8.3 步骤 3:提供变换关系(最关键))
      • [3.8.4 **步骤 4:配置参数**](#3.8.4 步骤 4:配置参数)
    • [3.9 示例代码](#3.9 示例代码)
      • [3.9.1 配合 PMAlign 建立动态坐标系](#3.9.1 配合 PMAlign 建立动态坐标系)
      • [3.9.2 手动设置变换参数](#3.9.2 手动设置变换参数)
      • [3.9.3 多级 FixtureTool 坐标系嵌套](#3.9.3 多级 FixtureTool 坐标系嵌套)
      • [3.9.4 在 QuickBuild 中配置 FixtureTool](#3.9.4 在 QuickBuild 中配置 FixtureTool)
      • [3.9.5 坐标系切换与下游工具联动](#3.9.5 坐标系切换与下游工具联动)
      • [3.9.6 序列化/反序列化(保存/加载 .vpp)](#3.9.6 序列化/反序列化(保存/加载 .vpp))
  • [4. CogFixtureNPointToNPointTool --- N点定位工具](#4. CogFixtureNPointToNPointTool — N点定位工具)
    • [4.1 引用命名空间与程序集](#4.1 引用命名空间与程序集)
    • [4.2 工具类继承关系](#4.2 工具类继承关系)
    • [4.3 CogFixtureNPointToNPointTool 主要属性](#4.3 CogFixtureNPointToNPointTool 主要属性)
    • [4.4 变换模型与适用场景](#4.4 变换模型与适用场景)
    • [4.5 CogFixtureNPointToNPointResult 结果属性](#4.5 CogFixtureNPointToNPointResult 结果属性)
    • [4.6 CogFixtureNPointToNPointTool 主要方法](#4.6 CogFixtureNPointToNPointTool 主要方法)
    • [4.7 CogFixtureNPointToNPointTool 主要事件](#4.7 CogFixtureNPointToNPointTool 主要事件)
    • [4.8 使用方法与配置流程](#4.8 使用方法与配置流程)
    • [4.9 示例代码](#4.9 示例代码)
      • [4.9.1 基本多点定位](#4.9.1 基本多点定位)
      • [4.9.2 设置点对并运行](#4.9.2 设置点对并运行)
      • [4.9.3 非线性变换(仿射/投影)](#4.9.3 非线性变换(仿射/投影))
      • [4.9.4 与 CogCalibNPointToNPointTool 的区别与选择](#4.9.4 与 CogCalibNPointToNPointTool 的区别与选择)
      • [4.9.5 在 ToolGroup 中使用](#4.9.5 在 ToolGroup 中使用)
  • [5. CogCalibNLineToNLineTool --- N线标定工具](#5. CogCalibNLineToNLineTool — N线标定工具)
    • [5.1 引用命名空间与程序集](#5.1 引用命名空间与程序集)
    • [5.2 工具类继承关系](#5.2 工具类继承关系)
    • [5.3 CogCalibNLineToNLineTool 主要属性](#5.3 CogCalibNLineToNLineTool 主要属性)
    • [5.4 线标定模型说明](#5.4 线标定模型说明)
    • [5.5 CogCalibNLineToNLineResult 结果属性](#5.5 CogCalibNLineToNLineResult 结果属性)
    • [5.6 CogCalibNLineToNLineTool 主要方法](#5.6 CogCalibNLineToNLineTool 主要方法)
    • [5.7 CogCalibNLineToNLineTool主要事件](#5.7 CogCalibNLineToNLineTool主要事件)
    • [5.8 使用方法与配置流程](#5.8 使用方法与配置流程)
      • [5.8.1 **步骤 1:提取线特征**](#5.8.1 步骤 1:提取线特征)
      • [5.8.2 **步骤 2:添加线对**](#5.8.2 步骤 2:添加线对)
      • [5.8.3 **步骤 3:执行标定**](#5.8.3 步骤 3:执行标定)
    • [5.9 示例代码](#5.9 示例代码)
      • [5.9.1 基本线标定](#5.9.1 基本线标定)
      • [5.9.2 添加线对并查看结果](#5.9.2 添加线对并查看结果)
      • [5.9.3 与测量工具联合使用](#5.9.3 与测量工具联合使用)
  • [6. 学习教程与实战指南](#6. 学习教程与实战指南)
    • [6.1 入门教程:从零开始的相机标定](#6.1 入门教程:从零开始的相机标定)
      • [6.1.1 目标](#6.1.1 目标)
      • [6.1.2 前置条件](#6.1.2 前置条件)
      • [6.1.3 步骤](#6.1.3 步骤)
    • [6.2 进阶教程:多工具联合标定与定位流程](#6.2 进阶教程:多工具联合标定与定位流程)
      • [6.2.1 目标](#6.2.1 目标)
      • [6.2.2 核心思路](#6.2.2 核心思路)
      • [6.2.3 完整代码](#6.2.3 完整代码)
    • [6.3 高级教程:坐标系嵌套与机器人引导](#6.3 高级教程:坐标系嵌套与机器人引导)
      • [6.3.1 目标](#6.3.1 目标)
      • [6.3.2 场景](#6.3.2 场景)
      • [6.3.3 坐标系层级](#6.3.3 坐标系层级)
      • [6.3.4 实现](#6.3.4 实现)
    • [6.4 常见问题与排查指南](#6.4 常见问题与排查指南)
    • [6.5 最佳实践总结](#6.5 最佳实践总结)

1. CogCalibCheckerboardTool --- 棋盘格校准工具


1.1 引用命名空间与程序集

命名空间 程序集 说明
Cognex.VisionPro Cognex.VisionPro.dll 核心命名空间,包含 ICogImage 等基础接口
Cognex.VisionPro.CalibFix Cognex.VisionPro.CalibFix.dll 校准与定位工具所在命名空间
Cognex.VisionPro.Display Cognex.VisionPro.Display.dll 显示控件(CogDisplay)相关
csharp 复制代码
using Cognex.VisionPro;
using Cognex.VisionPro.CalibFix;

1.2 工具类继承关系

bash 复制代码
System.Object
  └── CogToolBase (Cognex.VisionPro)
        └── CogCalibCheckerboardTool

1.3 CogCalibCheckerboardTool 主要属性

属性 类型 说明
InputImage ICogImage 输入的棋盘格图像
OutputImage ICogImage 校准后的输出图像(带有坐标空间信息)
RunParams CogCalibCheckerboardRunParams 运行参数对象
RunParams.NumX int 棋盘格X方向内角点数量(默认9)
RunParams.NumY int 棋盘格Y方向内角点数量(默认6)
RunParams.CellSize double 棋盘格单元格物理尺寸(mm)
RunParams.CalibrationMode CogCalibCheckerboardCalibrationModeConstants 校准模式
RunParams.CalibrationSpace CogCalibCheckerboardCalibrationSpaceConstants 校准空间选择
Result ICogCalibCheckerboardResult 校准结果(运行后可用)
CurrentRecordEnabled bool 是否生成当前记录(用于图形叠加)

1.4 校准模式说明

模式 说明 适用场景
Calibrate 校准模式:采集多幅棋盘格图像计算映射关系 首次标定时使用
ImageToRawImage 图像到原始图像映射 将校准后坐标映射回像素坐标
RawImageToImage 原始图像到图像映射 将像素坐标映射到校准后坐标

1.5 CogCalibCheckerboardResult 结果属性

属性 类型 说明
CalibrationMode CogCalibCheckerboardCalibrationModeConstants 实际使用的校准模式
NumImages int 用于校准的图像数量
MeanError double 平均重投影误差(像素),越小越好
MaxError double 最大重投影误差(像素)
CalibrationTransform ICogTransform2D 校准变换矩阵
PixelDistortion ICogDistortion 镜头畸变模型

1.6 CogCalibCheckerboardTool 主要方法

方法 说明
Run() 执行校准
CreateCurrentRecord() 创建当前记录(用于图形叠加)
Dispose() 释放资源

1.7 CogCalibCheckerboardTool 主要事件

事件 触发时机 说明
Ran 工具运行完成后 可用于获取运行结果
Running 工具运行中 可用于进度监控
PropertyChanged 属性值改变时 可用于参数联动

1.8 使用方法与配置流程

1.8.1 步骤 1:准备棋盘格标定板

  • 使用高精度打印或购买棋盘格标定板
  • 确保棋盘格平整,无折痕或弯曲
  • 建议使用 9×6 内角点、单元格尺寸 10mm 的标准板

1.8.2 步骤 2:采集标定图像

  • 从不同角度、不同位置采集10--20幅棋盘格图像
  • 确保棋盘格覆盖整个视野(中心、边缘、四角)
  • 每幅图像中棋盘格应完整可见

1.8.3 步骤 3:配置工具参数

  • 设置 NumXNumY 为实际棋盘格内角点数量
  • 设置 CellSize 为实际物理尺寸(mm)
  • 选择校准模式

1.8.4 步骤 4:执行校准

  • 调用 Run() 方法
  • 检查 Result.MeanError,通常应 < 0.5 像素
  • 如误差过大,增加标定图像数量或改善采集条件

1.8.5 步骤 5:使用校准结果

  • 后续工具使用 OutputImage 作为输入
  • 坐标值将自动转换为物理单位(mm)

1.9 示例代码

1.9.1 基本棋盘格校准

csharp 复制代码
using Cognex.VisionPro;
using Cognex.VisionPro.CalibFix;

CogCalibCheckerboardTool calibTool = new CogCalibCheckerboardTool();
calibTool.InputImage = image;
calibTool.RunParams.NumX = 9;
calibTool.RunParams.NumY = 6;
calibTool.RunParams.CellSize = 10.0; // 10mm

calibTool.Run();

if (calibTool.Result == CogToolResultConstants.Accept)
{
    ICogImage calibratedImage = calibTool.OutputImage;
    cogDisplay1.Image = calibratedImage;
    Console.WriteLine("校准成功");
}

1.9.2 查看校准结果与精度评估

csharp 复制代码
calibTool.Run();
if (calibTool.Result == CogToolResultConstants.Accept)
{
    Console.WriteLine($"校准模式: {calibTool.Result.CalibrationMode}");
    Console.WriteLine($"使用图像数: {calibTool.Result.NumImages}");
    Console.WriteLine($"平均误差: {calibTool.Result.MeanError:F4} 像素");
    Console.WriteLine($"最大误差: {calibTool.Result.MaxError:F4} 像素");
    
    // 精度评估
    if (calibTool.Result.MeanError < 0.3)
        Console.WriteLine("✅ 校准精度: 优秀");
    else if (calibTool.Result.MeanError < 0.5)
        Console.WriteLine("✅ 校准精度: 良好");
    else if (calibTool.Result.MeanError < 1.0)
        Console.WriteLine("⚠️ 校准精度: 一般,建议增加标定图像");
    else
        Console.WriteLine("❌ 校准精度: 差,需要重新标定");
}

1.9.3 自定义棋盘格参数

csharp 复制代码
CogCalibCheckerboardTool calibTool = new CogCalibCheckerboardTool();
calibTool.InputImage = image;

// 自定义棋盘格参数
calibTool.RunParams.NumX = 11;        // X方向11个内角点
calibTool.RunParams.NumY = 8;         // Y方向8个内角点
calibTool.RunParams.CellSize = 5.0;   // 5mm单元格

// 选择校准空间
calibTool.RunParams.CalibrationSpace = 
    CogCalibCheckerboardCalibrationSpaceConstants.Pixel;

calibTool.Run();

1.9.4 校准结果保存与加载(.vpp 序列化)

csharp 复制代码
using Cognex.VisionPro.Persistence;

// 保存校准工具(含校准结果)
string path = @"C:\Calibration\CheckerboardCalib.vpp";
CogSerializer.SaveObjectToFile(calibTool, path);

// 加载校准工具
CogCalibCheckerboardTool loadedTool = 
    CogSerializer.LoadObjectFromFile(path) as CogCalibCheckerboardTool;
loadedTool.Run();

1.9.5 在ToolGroup中关联编辑控件

csharp 复制代码
// 获取 ToolGroup 中的校准工具
CogCalibCheckerboardTool calibTool = 
    toolGroup.Tools["CogCalibCheckerboardTool1"] as CogCalibCheckerboardTool;

// 关联编辑控件(WinForms)
cogCalibCheckerboardEditV21.Subject = calibTool;

// 执行校准
calibTool.Run();

if (calibTool.Result == CogToolResultConstants.Accept)
{
    // 获取校准后图像并显示
    cogDisplay1.Image = calibTool.OutputImage;
    
    // 叠加校准网格
    cogDisplay1.StaticGraphics.AddList(
        calibTool.CreateCurrentRecord(), "calibGrid");
}

1.9.6 校准后图像的坐标转换

csharp 复制代码
// 校准后,坐标自动转换为物理单位
CogCalibCheckerboardTool calibTool = toolGroup.Tools["Calib1"] as CogCalibCheckerboardTool;
calibTool.Run();

// 获取校准后的图像
ICogImage calibImage = calibTool.OutputImage;

// 在校准后的图像上进行测量
CogCaliperTool caliper = new CogCaliperTool();
caliper.InputImage = calibImage;
caliper.Run();

// 结果自动以物理单位(mm)表示
double edgePos = caliper.Results[0].Edge0.PositionX;
Console.WriteLine($"边缘位置: {edgePos:F3} mm");

2. CogCalibNPointToNPointTool --- N点标定工具

2.1 引用命名空间与程序集

命名空间 程序集 说明
Cognex.VisionPro Cognex.VisionPro.dll 核心命名空间
Cognex.VisionPro.CalibFix Cognex.VisionPro.CalibFix.dll 校准与定位工具

2.2 工具类继承关系

bash 复制代码
System.Object
  └── CogToolBase (Cognex.VisionPro)
        └── CogCalibNPointToNPointTool

2.3 CogCalibNPointToNPointTool 主要属性

属性 类型 说明
InputImage ICogImage 输入图像
OutputImage ICogImage 校准后的输出图像
RawCalibrationPoints CogCalibNPointToNPointPointPairCollection 标定点对集合
NumPoints int 已添加的标定点对数量
RunParams CogCalibNPointToNPointRunParams 运行参数
Result ICogCalibNPointToNPointResult 标定结果

2.4 标定模型与变换类型

变换类型 参数 说明 适用场景
Linear 6 参数 仿射变换(平移+旋转+缩放+剪切) 无畸变或轻微畸变
TranslationOnly 2 参数 仅平移 简单偏移校正
TranslationAndRotation 3 参数 平移+旋转 刚体变换
TranslationRotationAndScale 4 参数 平移+旋转+均匀缩放 等比缩放场景
FullLinear 6 参数 完整仿射变换 一般场景(推荐)
Perspective 8 参数 透视变换 透视畸变校正

2.5 CogCalibNPointToNPointResult 结果属性

属性 类型 说明
CalibrationMode CogCalibNPointToNPointCalibrationModeConstants 实际使用的变换模型
MeanError double 平均重投影误差(物理单位)
MaxError double 最大重投影误差
CalibrationTransform ICogTransform2D 标定变换矩阵
NumPointsUsed int 实际使用的标定点数

2.6 CogCalibNPointToNPointTool 主要方法

方法 说明
Run() 执行标定
CreateCurrentRecord() 创建当前记录
Dispose() 释放资源

2.7 CogCalibNPointToNPointTool 主要事件

事件 触发时机 说明
Ran 工具运行完成后 获取运行结果
PropertyChanged 属性值改变时 参数联动

2.8 使用方法与配置流程

2.8.1 步骤 1:采集标定点对

  • 使用已知物理尺寸的标定板(如圆点阵列板)
  • 采集图像并提取圆心像素坐标
  • 记录对应的实际物理坐标

2.8.2 步骤 2:添加标定点对

  • 调用 RawCalibrationPoints.Add(pixelX, pixelY, worldX, worldY)
  • 至少需要 3 个点对(推荐 6--10 个)

2.8.3 步骤 3:选择变换模型

  • 根据实际需求选择合适的变换类型
  • 无特殊要求时推荐 FullLinear

2.8.4 步骤 4:执行标定

  • 调用 Run() 方法
  • 检查 Result.MeanError

2.9 示例代码

2.9.1 基本N点标定

csharp 复制代码
using Cognex.VisionPro;
using Cognex.VisionPro.CalibFix;

CogCalibNPointToNPointTool calibTool = new CogCalibNPointToNPointTool();
calibTool.InputImage = image;

// 添加标定点对 (像素坐标 → 物理坐标)
calibTool.RawCalibrationPoints.Add(100, 200, 10.0, 20.0);
calibTool.RawCalibrationPoints.Add(300, 400, 30.0, 40.0);
calibTool.RawCalibrationPoints.Add(500, 100, 50.0, 10.0);
calibTool.RawCalibrationPoints.Add(150, 350, 15.0, 35.0);
calibTool.RawCalibrationPoints.Add(450, 250, 45.0, 25.0);

calibTool.Run();

if (calibTool.Result == CogToolResultConstants.Accept)
{
    ICogImage calibratedImage = calibTool.OutputImage;
    Console.WriteLine($"标定成功,平均误差: {calibTool.Result.MeanError:F4} mm");
}

2.9.2 添加标定点对并计算变换

csharp 复制代码
CogCalibNPointToNPointTool calibTool = new CogCalibNPointToNPointTool();
calibTool.InputImage = image;

// 从圆点阵列标定板自动提取点对
// 假设已通过 Blob 或圆检测工具获取了圆心坐标
double[] pixelX = { 120, 240, 360, 480, 600 };
double[] pixelY = { 150, 150, 150, 150, 150 };
double[] worldX = { 0, 10, 20, 30, 40 };
double[] worldY = { 0, 0, 0, 0, 0 };

for (int i = 0; i < pixelX.Length; i++)
{
    calibTool.RawCalibrationPoints.Add(
        pixelX[i], pixelY[i], worldX[i], worldY[i]);
}

calibTool.Run();

Console.WriteLine($"使用点数: {calibTool.Result.NumPointsUsed}");
Console.WriteLine($"变换模型: {calibTool.Result.CalibrationMode}");
Console.WriteLine($"平均误差: {calibTool.Result.MeanError:F4} mm");

2.9.3 选择不同变换模型

csharp 复制代码
// 设置为仿射变换(推荐)
calibTool.RunParams.CalibrationMode = 
    CogCalibNPointToNPointCalibrationModeConstants.FullLinear;

// 或设置为透视变换(有透视畸变时)
calibTool.RunParams.CalibrationMode = 
    CogCalibNPointToNPointCalibrationModeConstants.Perspective;

// 或设置为仅平移
calibTool.RunParams.CalibrationMode = 
    CogCalibNPointToNPointCalibrationModeConstants.TranslationOnly;

calibTool.Run();

2.9.4 标定精度验证与误差分析

csharp 复制代码
calibTool.Run();

if (calibTool.Result == CogToolResultConstants.Accept)
{
    Console.WriteLine("=== 标定精度报告 ===");
    Console.WriteLine($"变换模型: {calibTool.Result.CalibrationMode}");
    Console.WriteLine($"标定点数: {calibTool.Result.NumPointsUsed}");
    Console.WriteLine($"平均误差: {calibTool.Result.MeanError:F4} mm");
    Console.WriteLine($"最大误差: {calibTool.Result.MaxError:F4} mm");
    
    // 验证:用标定变换计算已知点的映射
    ICogTransform2D tx = calibTool.Result.CalibrationTransform;
    
    // 将像素坐标映射到物理坐标
    double worldX, worldY;
    tx.MapPoint(100, 200, out worldX, out worldY);
    Console.WriteLine($"像素 (100,200) → 物理 ({worldX:F2}, {worldY:F2}) mm");
}

2.9.5 标定结果保存与加载

csharp 复制代码
using Cognex.VisionPro.Persistence;

// 保存
string path = @"C:\Calibration\NPointCalib.vpp";
CogSerializer.SaveObjectToFile(calibTool, path);

// 加载
CogCalibNPointToNPointTool loaded = 
    CogSerializer.LoadObjectFromFile(path) as CogCalibNPointToNPointTool;

2.9.6 与 FixtureTool 联合使用

csharp 复制代码
// N点标定后,将变换传给 FixtureTool
CogCalibNPointToNPointTool calibTool = ...;
calibTool.Run();

CogFixtureTool fixTool = new CogFixtureTool();
fixTool.InputImage = image;
fixTool.RunParams.Action = CogFixtureActionConstants.EstablishNewFixture;
fixTool.RunParams.FixturedSpaceName = "CalibratedSpace";
fixTool.RunParams.UnfixturedFromFixturedTransform = 
    calibTool.Result.CalibrationTransform;
fixTool.Run();

// 后续工具在标定后的坐标系下工作
cogDisplay1.Image = fixTool.OutputImage;

3. CogFixtureTool --- 坐标定位工具

3.1 引用命名空间与程序集

命名空间 程序集 说明
Cognex.VisionPro Cognex.VisionPro.dll 核心命名空间
Cognex.VisionPro.CalibFix Cognex.VisionPro.CalibFix.dll 校准与定位工具

3.2 工具类继承关系

bash 复制代码
System.Object
  └── CogToolBase (Cognex.VisionPro)
        └── CogFixtureTool

3.3 CogFixtureTool 主要属性

属性 类型 说明
InputImage ICogImage 输入图像
OutputImage ICogImage 输出图像(包含 FixturedSpace)
RunParams CogFixtureRunParams 运行参数
CurrentRecordEnabled bool 是否生成当前记录

3.4 空间概念详解

空间 符号 说明
RootSpace @ 所有坐标空间的基础,原点在图像左上角,坐标值为浮点数
PixelSpace # 基于图像像素的坐标系,坐标值为整数
UnfixturedSpace --- 图像的原始坐标系(像素空间),原点在左上角,固定不变
FixturedSpace 用户定义 通过 CogFixtureTool 创建的自定义坐标系,原点和方向可与工件对齐,是"随动"坐标系

3.5 CogFixtureRunParams 关键运行参数

参数 类型 说明
Action CogFixtureActionConstants 动作类型:EstablishNewFixture(创建新坐标系)
UnfixturedFromFixturedTransform ICogTransform2D 从 FixturedSpace 到 UnfixturedSpace 的变换关系
FixturedSpaceName string 新坐标系的名称(项目内必须唯一)
SpaceToOutput CogFixturedSpaceConstants 输出空间选择:FixturedUnfixtured
DuplicateHandling CogFixtureDuplicateHandlingConstants 重复名称处理方式:CompatibilityEnhanced

3.6 CogFixtureTool 主要方法

方法 说明
Run() 执行坐标系创建
CreateCurrentRecord() 创建当前记录
Dispose() 释放资源

3.7 CogFixtureTool 主要事件

事件 触发时机 说明
Ran 工具运行完成后 获取运行结果
PropertyChanged 属性值改变时 参数联动

3.8 使用方法与配置流程

3.8.1 步骤 1:添加工具

  • 在 QuickBuild 工具箱中,找到 Calibration & Fixturing 类别下的 CogFixtureTool
  • 将其放置在定位工具(如CogPMAlignTool)之后

3.8.2 步骤 2:连接图像源

  • InputImage 链接到图像源或上一个工具的 OutputImage

3.8.3 步骤 3:提供变换关系(最关键)

  • 将定位工具的结果(如 Results.Item[0].GetPose())链接到 RunParams.UnfixturedFromFixturedTransform

3.8.4 步骤 4:配置参数

  • ActionEstablishNewFixture
  • SpaceToOutputFixtured
  • FixturedSpaceName → 唯一名称
  • DuplicateHandlingEnhanced

3.9 示例代码

3.9.1 配合 PMAlign 建立动态坐标系

csharp 复制代码
using Cognex.VisionPro;
using Cognex.VisionPro.PMAlign;
using Cognex.VisionPro.CalibFix;

// 第一步:PMAlign 定位工件
CogPMAlignTool pmTool = toolGroup.Tools["PMAlign1"] as CogPMAlignTool;
pmTool.Run();

if (pmTool.Results.Count == 0)
{
    Console.WriteLine("未找到工件,无法建立坐标系");
    return;
}

// 获取匹配位姿
ICogTransform2D pose = pmTool.Results.Item[0].GetPose();
Console.WriteLine($"工件位置: ({pose.TranslationX:F1}, {pose.TranslationY:F1}), " +
    $"角度: {pose.Rotation * 180 / Math.PI:F1}°");

// 第二步:将定位结果传给 FixtureTool
CogFixtureTool fixTool = toolGroup.Tools["Fixture1"] as CogFixtureTool;
fixTool.InputImage = image;
fixTool.RunParams.Action = CogFixtureActionConstants.EstablishNewFixture;
fixTool.RunParams.FixturedSpaceName = "PartCoord";
fixTool.RunParams.SpaceToOutput = CogFixturedSpaceConstants.Fixtured;
fixTool.RunParams.UnfixturedFromFixturedTransform = pose;
fixTool.Run();

// 第三步:后续工具使用 FixturedSpace
CogCaliperTool caliper = toolGroup.Tools["Caliper1"] as CogCaliperTool;
caliper.InputImage = fixTool.OutputImage;
caliper.Run();

Console.WriteLine($"工件坐标系下的测量: {caliper.Results[0].Edge0.PositionX:F2}");

3.9.2 手动设置变换参数

csharp 复制代码
CogFixtureTool fixTool = new CogFixtureTool();
fixTool.InputImage = image;
fixTool.RunParams.Action = CogFixtureActionConstants.EstablishNewFixture;
fixTool.RunParams.FixturedSpaceName = "MyCoord";
fixTool.RunParams.SpaceToOutput = CogFixturedSpaceConstants.Fixtured;

// 手动设置变换(平移+旋转)
CogTransform2DLinear transform = new CogTransform2DLinear();
transform.TranslationX = 320;
transform.TranslationY = 240;
transform.Rotation = Math.PI / 4; // 45度

fixTool.RunParams.UnfixturedFromFixturedTransform = transform;
fixTool.Run();

Console.WriteLine($"FixturedSpace 创建成功: {fixTool.RunParams.FixturedSpaceName}");

3.9.3 多级 FixtureTool 坐标系嵌套

csharp 复制代码
// 第一级:粗定位
CogPMAlignTool pm1 = toolGroup.Tools["PMAlign1"] as CogPMAlignTool;
pm1.Run();
CogFixtureTool fix1 = toolGroup.Tools["Fixture1"] as CogFixtureTool;
fix1.InputImage = image;
fix1.RunParams.UnfixturedFromFixturedTransform = pm1.Results.Item[0].GetPose();
fix1.RunParams.FixturedSpaceName = "CoarseCoord";
fix1.Run();

// 第二级:精定位(在粗定位坐标系下工作)
CogPMAlignTool pm2 = toolGroup.Tools["PMAlign2"] as CogPMAlignTool;
pm2.InputImage = fix1.OutputImage;
pm2.Run();
CogFixtureTool fix2 = toolGroup.Tools["Fixture2"] as CogFixtureTool;
fix2.InputImage = fix1.OutputImage;
fix2.RunParams.UnfixturedFromFixturedTransform = pm2.Results.Item[0].GetPose();
fix2.RunParams.FixturedSpaceName = "FineCoord";
fix2.Run();

// 第三级:测量(在精定位坐标系下工作)
CogCaliperTool caliper = toolGroup.Tools["Caliper1"] as CogCaliperTool;
caliper.InputImage = fix2.OutputImage;
caliper.Run();

3.9.4 在 QuickBuild 中配置 FixtureTool

csharp 复制代码
// QuickBuild 中的典型配置流程
// 1. 添加 CogFixtureTool 到 Job
// 2. 在脚本中设置参数
CogFixtureTool fixTool = job.Tools["CogFixtureTool1"] as CogFixtureTool;

// 3. 将 PMAlign 结果链接到 FixtureTool
CogPMAlignTool pmTool = job.Tools["CogPMAlignTool1"] as CogPMAlignTool;
pmTool.Run();

if (pmTool.Results.Count > 0)
{
    fixTool.RunParams.Action = CogFixtureActionConstants.EstablishNewFixture;
    fixTool.RunParams.FixturedSpaceName = "Part_" + partIndex.ToString();
    fixTool.RunParams.SpaceToOutput = CogFixturedSpaceConstants.Fixtured;
    fixTool.RunParams.UnfixturedFromFixturedTransform = 
        pmTool.Results.Item[0].GetPose();
    fixTool.Run();
}

3.9.5 坐标系切换与下游工具联动

csharp 复制代码
// 获取 FixturedSpace 后的图像
ICogImage fixturedImage = fixTool.OutputImage;

// 下游工具自动在 FixturedSpace 下工作
CogBlobTool blobTool = new CogBlobTool();
blobTool.InputImage = fixturedImage;
blobTool.Run();

// Blob 结果的坐标自动在 FixturedSpace 下
foreach (ICogBlobResult result in blobTool.Results.GetBlob())
{
    Console.WriteLine($"Blob 中心: ({result.CenterX:F2}, {result.CenterY:F2}) mm");
}

3.9.6 序列化/反序列化(保存/加载 .vpp)

csharp 复制代码
using Cognex.VisionPro.Persistence;

// 保存整个 ToolGroup(含所有工具配置)
CogSerializer.SaveObjectToFile(toolGroup, @"C:\Vision\MyJob.vpp");

// 加载
CogToolGroup loadedGroup = 
    CogSerializer.LoadObjectFromFile(@"C:\Vision\MyJob.vpp") as CogToolGroup;

4. CogFixtureNPointToNPointTool --- N点定位工具

4.1 引用命名空间与程序集

命名空间 程序集 说明
Cognex.VisionPro Cognex.VisionPro.dll 核心命名空间
Cognex.VisionPro.CalibFix Cognex.VisionPro.CalibFix.dll 校准与定位工具

4.2 工具类继承关系

bash 复制代码
System.Object
  └── CogToolBase (Cognex.VisionPro)
        └── CogFixtureNPointToNPointTool

4.3 CogFixtureNPointToNPointTool 主要属性

属性 类型 说明
InputImage ICogImage 输入图像
OutputImage ICogImage 输出图像
RawCalibrationPoints CogFixtureNPointToNPointPointPairCollection 定位点对集合
RunParams CogFixtureNPointToNPointRunParams 运行参数
Result ICogFixtureNPointToNPointResult 定位结果

4.4 变换模型与适用场景

变换类型 说明 最少点数 适用场景
Linear 仿射变换 3 一般定位
Perspective 透视变换 4 透视畸变校正
TranslationOnly 仅平移 1 简单偏移
TranslationAndRotation 平移+旋转 2 刚体变换

4.5 CogFixtureNPointToNPointResult 结果属性

属性 类型 说明
CalibrationMode CogFixtureNPointToNPointCalibrationModeConstants 实际使用的变换模型
CalibrationTransform ICogTransform2D 变换矩阵
MeanError double 平均误差

4.6 CogFixtureNPointToNPointTool 主要方法

方法 说明
Run() 执行定位
CreateCurrentRecord() 创建当前记录
Dispose() 释放资源

4.7 CogFixtureNPointToNPointTool 主要事件

事件 触发时机 说明
Ran 工具运行完成后 获取运行结果
PropertyChanged 属性值改变时 参数联动

4.8 使用方法与配置流程

步骤 1:采集多组对应点

  • 至少 3 组点对(仿射变换)或 4 组(透视变换)

步骤 2:添加点对

  • 调用 RawCalibrationPoints.Add()

步骤 3:选择变换模型

步骤 4:执行并验证

4.9 示例代码

4.9.1 基本多点定位

csharp 复制代码
using Cognex.VisionPro;
using Cognex.VisionPro.CalibFix;

CogFixtureNPointToNPointTool fixNTool = new CogFixtureNPointToNPointTool();
fixNTool.InputImage = image;

// 添加定位点对
fixNTool.RawCalibrationPoints.Add(100, 200, 50.0, 100.0);
fixNTool.RawCalibrationPoints.Add(300, 400, 150.0, 200.0);
fixNTool.RawCalibrationPoints.Add(500, 100, 250.0, 50.0);

fixNTool.Run();
ICogImage outputImage = fixNTool.OutputImage;

4.9.2 设置点对并运行

csharp 复制代码
CogFixtureNPointToNPointTool fixNTool =
    toolGroup.Tools["CogFixtureNPointToNPointTool1"] as CogFixtureNPointToNPointTool;
fixNTool.InputImage = image;

// 设置变换模型
fixNTool.RunParams.CalibrationMode = 
    CogFixtureNPointToNPointCalibrationModeConstants.FullLinear;

fixNTool.Run();

if (fixNTool.Result == CogToolResultConstants.Accept)
{
    Console.WriteLine($"变换模型: {fixNTool.Result.CalibrationMode}");
    Console.WriteLine($"平均误差: {fixNTool.Result.MeanError:F4}");
}

4.9.3 非线性变换(仿射/投影)

csharp 复制代码
// 透视变换(需要至少4个点对)
fixNTool.RunParams.CalibrationMode = 
    CogFixtureNPointToNPointCalibrationModeConstants.Perspective;

fixNTool.RawCalibrationPoints.Add(50, 50, 0, 0);
fixNTool.RawCalibrationPoints.Add(550, 50, 100, 0);
fixNTool.RawCalibrationPoints.Add(550, 450, 100, 100);
fixNTool.RawCalibrationPoints.Add(50, 450, 0, 100);

fixNTool.Run();

4.9.4 与 CogCalibNPointToNPointTool 的区别与选择

对比维度 CogCalibNPointToNPointTool CogFixtureNPointToNPointTool
主要用途 相机标定(像素→物理坐标) 坐标系定位(创建新坐标系)
输出 校准后的图像(物理坐标) 定位后的图像(新坐标系)
典型场景 像素到毫米的转换 工件坐标系建立
与标定板配合 ✅ 常用 ⚠️ 可用但不典型
与 PMAlign 配合 ⚠️ 可用 ✅ 常用

选择建议:

  • 如果目标是像素到物理单位的转换 → 使用 CogCalibNPointToNPointTool
  • 如果目标是创建随工件移动的坐标系 → 使用 CogFixtureNPointToNPointTool
  • 如果两者都需要 → 先用 CogCalibNPointToNPointTool 标定,再用 CogFixtureTool 定位

4.9.5 在 ToolGroup 中使用

csharp 复制代码
CogFixtureNPointToNPointTool fixNTool =
    toolGroup.Tools["CogFixtureNPointToNPointTool1"] as CogFixtureNPointToNPointTool;
fixNTool.Run();

if (fixNTool.Result == CogToolResultConstants.Accept)
{
    // 获取变换矩阵
    ICogTransform2D tx = fixNTool.Result.CalibrationTransform;
    
    // 坐标映射
    double worldX, worldY;
    tx.MapPoint(320, 240, out worldX, out worldY);
    Console.WriteLine($"图像中心映射到: ({worldX:F2}, {worldY:F2})");
}

5. CogCalibNLineToNLineTool --- N线标定工具

5.1 引用命名空间与程序集

命名空间 程序集 说明
Cognex.VisionPro Cognex.VisionPro.dll 核心命名空间
Cognex.VisionPro.CalibFix Cognex.VisionPro.CalibFix.dll 校准与定位工具

5.2 工具类继承关系

复制代码
System.Object
  └── CogToolBase (Cognex.VisionPro)
        └── CogCalibNLineToNLineTool

5.3 CogCalibNLineToNLineTool 主要属性

属性 类型 说明
InputImage ICogImage 输入图像
OutputImage ICogImage 标定后的输出图像
RunParams CogCalibNLineToNLineRunParams 运行参数
Result ICogCalibNLineToNLineResult 标定结果

5.4 线标定模型说明

线标定通过多组线的对应关系建立变换模型,适用于以下场景:

  • 传送带上的线性特征标定
  • 基于边缘检测的标定
  • 线阵相机标定

5.5 CogCalibNLineToNLineResult 结果属性

属性 类型 说明
CalibrationMode CogCalibNLineToNLineCalibrationModeConstants 变换模型
MeanError double 平均误差
CalibrationTransform ICogTransform2D 变换矩阵

5.6 CogCalibNLineToNLineTool 主要方法

方法 说明
Run() 执行线标定
CreateCurrentRecord() 创建当前记录
Dispose() 释放资源

5.7 CogCalibNLineToNLineTool主要事件

事件 触发时机 说明
Ran 工具运行完成后 获取运行结果
PropertyChanged 属性值改变时 参数联动

5.8 使用方法与配置流程

5.8.1 步骤 1:提取线特征

  • 使用 CogLineFinder 或边缘检测工具提取图像中的线
  • 记录线的起点和终点像素坐标

5.8.2 步骤 2:添加线对

  • 将像素空间的线和物理空间的线对应添加

5.8.3 步骤 3:执行标定

  • 调用Run()方法

5.9 示例代码

5.9.1 基本线标定

csharp 复制代码
using Cognex.VisionPro;
using Cognex.VisionPro.CalibFix;

CogCalibNLineToNLineTool lineCalibTool = new CogCalibNLineToNLineTool();
lineCalibTool.InputImage = image;
lineCalibTool.Run();

if (lineCalibTool.Result == CogToolResultConstants.Accept)
{
    Console.WriteLine("线标定成功");
    ICogImage calibratedImage = lineCalibTool.OutputImage;
}

5.9.2 添加线对并查看结果

csharp 复制代码
CogCalibNLineToNLineTool lineCalibTool =
    toolGroup.Tools["CogCalibNLineToNLineTool1"] as CogCalibNLineToNLineTool;

lineCalibTool.Run();

if (lineCalibTool.Result == CogToolResultConstants.Accept)
{
    Console.WriteLine($"变换模型: {lineCalibTool.Result.CalibrationMode}");
    Console.WriteLine($"平均误差: {lineCalibTool.Result.MeanError:F4}");
    
    // 获取变换矩阵
    ICogTransform2D tx = lineCalibTool.Result.CalibrationTransform;
    double wx, wy;
    tx.MapPoint(100, 200, out wx, out wy);
    Console.WriteLine($"映射结果: ({wx:F2}, {wy:F2})");
}

5.9.3 与测量工具联合使用

csharp 复制代码
// 线标定后,将结果用于测量
CogCalibNLineToNLineTool lineCalib = toolGroup.Tools["LineCalib1"] as CogCalibNLineToNLineTool;
lineCalib.Run();

// 使用标定后的图像进行测量
CogCaliperTool caliper = new CogCaliperTool();
caliper.InputImage = lineCalib.OutputImage;
caliper.Run();

// 测量结果自动转换为物理单位
Console.WriteLine($"测量结果: {caliper.Results[0].Edge0.PositionX:F3} mm");

6. 学习教程与实战指南

6.1 入门教程:从零开始的相机标定

6.1.1 目标

   掌握使用CogCalibCheckerboardTool进行相机标定的完整流程。

6.1.2 前置条件

  • 安装Cognex VisionPro 9.x
  • 准备一块9×6内角点的棋盘格标定板
  • 相机已连接并能采集图像

6.1.3 步骤

Step 1:创建新项目

bash 复制代码
打开 QuickBuild → 新建 Job → 添加 Image Source(相机或图像文件)

Step 2:添加校准工具

bash 复制代码
工具箱 → Calibration & Fixturing → CogCalibCheckerboardTool
拖放到 Job 中

Step 3:配置棋盘格参数

csharp 复制代码
// 在 ToolGroup 脚本中
CogCalibCheckerboardTool calib = 
    toolGroup.Tools["CogCalibCheckerboardTool1"] as CogCalibCheckerboardTool;
calib.RunParams.NumX = 9;      // 9个内角点
calib.RunParams.NumY = 6;      // 6个内角点
calib.RunParams.CellSize = 10; // 10mm

Step 4:采集标定图像

复制代码
- 将棋盘格放在视野内
- 从不同角度采集 10-15 幅图像
- 确保覆盖视野中心、边缘和四角

Step 5:执行校准并检查结果

csharp 复制代码
calib.Run();
if (calib.Result == CogToolResultConstants.Accept)
{
    Console.WriteLine($"✅ 校准成功!平均误差: {calib.Result.MeanError:F4} 像素");
    cogDisplay1.Image = calib.OutputImage;
}

Step 6:验证校准效果

复制代码
- 在校准后的图像上测量已知尺寸的物体
- 检查测量值是否与实际尺寸一致
- 如误差过大,重新标定

6.2 进阶教程:多工具联合标定与定位流程

6.2.1 目标

   掌握CogCalibCheckerboardTool + CogPMAlignTool + CogFixtureTool 的完整工作流。

6.2.2 核心思路

bash 复制代码
原始图像 → 校准(物理坐标) → 定位(找工件) → Fixture(建坐标系) → 测量

6.2.3 完整代码

csharp 复制代码
using Cognex.VisionPro;
using Cognex.VisionPro.CalibFix;
using Cognex.VisionPro.PMAlign;
using Cognex.VisionPro.Caliper;

public void RunInspection(ICogImage rawImage, CogToolGroup toolGroup)
{
    // ===== 阶段 1:相机校准 =====
    CogCalibCheckerboardTool calib = 
        toolGroup.Tools["Calib"] as CogCalibCheckerboardTool;
    calib.InputImage = rawImage;
    calib.Run();
    
    if (calib.Result != CogToolResultConstants.Accept)
    {
        NotifyError("校准失败");
        return;
    }
    
    ICogImage calibratedImage = calib.OutputImage;
    
    // ===== 阶段 2:工件定位 =====
    CogPMAlignTool pmAlign = 
        toolGroup.Tools["PMAlign"] as CogPMAlignTool;
    pmAlign.InputImage = calibratedImage;
    pmAlign.Run();
    
    if (pmAlign.Results.Count == 0)
    {
        NotifyError("未找到工件");
        return;
    }
    
    // ===== 阶段 3:建立工件坐标系 =====
    CogFixtureTool fixture = 
        toolGroup.Tools["Fixture"] as CogFixtureTool;
    fixture.InputImage = calibratedImage;
    fixture.RunParams.Action = CogFixtureActionConstants.EstablishNewFixture;
    fixture.RunParams.FixturedSpaceName = "PartCoord";
    fixture.RunParams.SpaceToOutput = CogFixturedSpaceConstants.Fixtured;
    fixture.RunParams.UnfixturedFromFixturedTransform = 
        pmAlign.Results.Item[0].GetPose();
    fixture.Run();
    
    // ===== 阶段 4:精确测量 =====
    CogCaliperTool caliper = 
        toolGroup.Tools["Caliper"] as CogCaliperTool;
    caliper.InputImage = fixture.OutputImage;
    caliper.Run();
    
    if (caliper.Results.Count > 0)
    {
        double measurement = caliper.Results[0].Edge0.PositionX;
        Console.WriteLine($"测量结果: {measurement:F3} mm");
        
        // 判断是否合格
        if (measurement > 9.8 && measurement < 10.2)
            Console.WriteLine("✅ 合格");
        else
            Console.WriteLine("❌ 不合格");
    }
}

6.3 高级教程:坐标系嵌套与机器人引导

6.3.1 目标

   掌握多级坐标系嵌套和机器人引导坐标转换。

6.3.2 场景

   传送带上有一个工件,工件上有多个特征需要测量。需要将测量结果转换为机器人坐标系。

6.3.3 坐标系层级

bash 复制代码
像素空间 (PixelSpace)
  └── 传送带坐标系 (BeltCoord) --- 由编码器或外部传感器提供
        └── 工件坐标系 (PartCoord) --- 由 PMAlign 定位
              └── 特征坐标系 (FeatureCoord) --- 由特征定位

6.3.4 实现

csharp 复制代码
// 第一级:传送带坐标系(编码器驱动)
CogFixtureTool beltFixture = toolGroup.Tools["BeltFixture"] as CogFixtureTool;
beltFixture.InputImage = rawImage;
beltFixture.RunParams.FixturedSpaceName = "BeltCoord";
// 编码器提供平移
CogTransform2DLinear beltTx = new CogTransform2DLinear();
beltTx.TranslationX = encoderX;
beltTx.TranslationY = encoderY;
beltFixture.RunParams.UnfixturedFromFixturedTransform = beltTx;
beltFixture.Run();

// 第二级:工件坐标系(PMAlign 驱动)
CogPMAlignTool pmAlign = toolGroup.Tools["PMAlign"] as CogPMAlignTool;
pmAlign.InputImage = beltFixture.OutputImage;
pmAlign.Run();

CogFixtureTool partFixture = toolGroup.Tools["PartFixture"] as CogFixtureTool;
partFixture.InputImage = beltFixture.OutputImage;
partFixture.RunParams.FixturedSpaceName = "PartCoord";
partFixture.RunParams.UnfixturedFromFixturedTransform = 
    pmAlign.Results.Item[0].GetPose();
partFixture.Run();

// 第三级:特征坐标系(特征定位驱动)
CogPMAlignTool featureAlign = toolGroup.Tools["FeatureAlign"] as CogPMAlignTool;
featureAlign.InputImage = partFixture.OutputImage;
featureAlign.Run();

// 最终测量结果(在特征坐标系下)
CogCaliperTool caliper = toolGroup.Tools["Caliper"] as CogCaliperTool;
caliper.InputImage = partFixture.OutputImage;
caliper.Run();

// 将测量结果转换为机器人坐标
// 需要建立像素→机器人坐标的映射(通常通过手眼标定)

6.4 常见问题与排查指南

问题 可能原因 解决方案
校准误差 > 1 像素 标定图像不足或质量差 增加图像数量(15-20幅),确保覆盖全视野
棋盘格检测失败 图像模糊或棋盘格不完整 调整曝光,确保棋盘格完全可见
FixtureTool 输出与预期不符 变换方向理解错误 检查 UnfixturedFromFixturedTransform 的含义
多个 FixtureTool 空间名称冲突 名称重复 为每个工具设置唯一的 FixturedSpaceName
校准后测量结果不稳定 校准精度不足 重新标定,使用更多图像和更好的标定板
NPoint 标定误差大 点对提取不准确 使用圆点阵列板自动提取,避免手动标注
线标定失败 线特征提取不准确 使用 CogLineFinder 自动提取,确保线段清晰

6.5 最佳实践总结

  1. 标定板选择:推荐使用陶瓷或玻璃材质的高精度标定板,避免打印标定板的热胀冷缩
  2. 图像采集:标定图像应覆盖整个视野,包括边缘和四角,至少10-15 幅
  3. 误差评估:平均重投影误差应< 0.5 像素,最大误差应< 1.0 像素
  4. 坐标系命名:使用有意义的名称(如 "PartCoord"、"BeltCoord"),避免默认名称
  5. 变换模型选择 :无透视畸变时使用 FullLinear,有透视畸变时使用 Perspective
  6. 工具顺序:Calibration → PMAlign → Fixture → Measurement
  7. 结果验证:每次标定后用已知尺寸的物体验证测量精度
  8. 版本管理:将标定结果保存为.vpp文件,纳入版本控制
相关推荐
爱凤的小光2 天前
CogIPOneImageTool详解
visionpro
爱凤的小光10 天前
VisionPro_几何查找与拟合工具详解
visionpro
爱凤的小光14 天前
VisionPro之CogSerializer序列化与持久化工具
visionpro
不会编程的懒洋洋17 天前
VisionPro 中 几何相交工具 Geometry-Intersection
图像处理·笔记·c#·视觉检测·机器视觉·visionpro
不会编程的懒洋洋17 天前
VisionPro 中 图像预处理工具
图像处理·笔记·c#·视觉检测·visionpro
爱凤的小光23 天前
VisionPro通用工具---个人学习篇
visionpro
爱凤的小光24 天前
VisionPro之工具窗体设置控件一
visionpro
不会编程的懒洋洋25 天前
VisionPro 中 卡尺 CogCaliperTool
图像处理·人工智能·笔记·计算机视觉·visionpro·cogcalipertool
不会编程的懒洋洋25 天前
VisionPro 中 直方图 CogHistogramTool
图像处理·人工智能·笔记·计算机视觉·机器视觉·visionpro·康耐视