文章目录
- [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.1 引用命名空间与程序集
| 命名空间 |
程序集 |
说明 |
Cognex.VisionPro |
Cognex.VisionPro.dll |
核心命名空间,包含 ICogImage 等基础接口 |
Cognex.VisionPro.CalibFix |
Cognex.VisionPro.CalibFix.dll |
校准与定位工具所在命名空间 |
Cognex.VisionPro.Display |
Cognex.VisionPro.Display.dll |
显示控件(CogDisplay)相关 |
using Cognex.VisionPro;
using Cognex.VisionPro.CalibFix;
1.2 工具类继承关系
System.Object
└── CogToolBase (Cognex.VisionPro)
└── 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 |
镜头畸变模型 |
| 方法 |
说明 |
Run() |
执行校准 |
CreateCurrentRecord() |
创建当前记录(用于图形叠加) |
Dispose() |
释放资源 |
| 事件 |
触发时机 |
说明 |
Ran |
工具运行完成后 |
可用于获取运行结果 |
Running |
工具运行中 |
可用于进度监控 |
PropertyChanged |
属性值改变时 |
可用于参数联动 |
1.8 使用方法与配置流程
1.8.1 步骤 1:准备棋盘格标定板
- 使用高精度打印或购买棋盘格标定板
- 确保棋盘格平整,无折痕或弯曲
- 建议使用 9×6 内角点、单元格尺寸 10mm 的标准板
1.8.2 步骤 2:采集标定图像
- 从不同角度、不同位置采集10--20幅棋盘格图像
- 确保棋盘格覆盖整个视野(中心、边缘、四角)
- 每幅图像中棋盘格应完整可见
1.8.3 步骤 3:配置工具参数
- 设置
NumX 和 NumY 为实际棋盘格内角点数量
- 设置
CellSize 为实际物理尺寸(mm)
- 选择校准模式
1.8.4 步骤 4:执行校准
- 调用
Run() 方法
- 检查
Result.MeanError,通常应 < 0.5 像素
- 如误差过大,增加标定图像数量或改善采集条件
1.8.5 步骤 5:使用校准结果
- 后续工具使用
OutputImage 作为输入
- 坐标值将自动转换为物理单位(mm)
1.9 示例代码
1.9.1 基本棋盘格校准
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 查看校准结果与精度评估
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 自定义棋盘格参数
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 序列化)
using Cognex.VisionPro.Persistence;
// 保存校准工具(含校准结果)
string path = @"C:\Calibration\CheckerboardCalib.vpp";
CogSerializer.SaveObjectToFile(calibTool, path);
// 加载校准工具
CogCalibCheckerboardTool loadedTool =
CogSerializer.LoadObjectFromFile(path) as CogCalibCheckerboardTool;
loadedTool.Run();
// 获取 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 校准后图像的坐标转换
// 校准后,坐标自动转换为物理单位
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.1 引用命名空间与程序集
| 命名空间 |
程序集 |
说明 |
Cognex.VisionPro |
Cognex.VisionPro.dll |
核心命名空间 |
Cognex.VisionPro.CalibFix |
Cognex.VisionPro.CalibFix.dll |
校准与定位工具 |
2.2 工具类继承关系
System.Object
└── CogToolBase (Cognex.VisionPro)
└── 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 |
实际使用的标定点数 |
| 方法 |
说明 |
Run() |
执行标定 |
CreateCurrentRecord() |
创建当前记录 |
Dispose() |
释放资源 |
| 事件 |
触发时机 |
说明 |
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点标定
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 添加标定点对并计算变换
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 选择不同变换模型
// 设置为仿射变换(推荐)
calibTool.RunParams.CalibrationMode =
CogCalibNPointToNPointCalibrationModeConstants.FullLinear;
// 或设置为透视变换(有透视畸变时)
calibTool.RunParams.CalibrationMode =
CogCalibNPointToNPointCalibrationModeConstants.Perspective;
// 或设置为仅平移
calibTool.RunParams.CalibrationMode =
CogCalibNPointToNPointCalibrationModeConstants.TranslationOnly;
calibTool.Run();
2.9.4 标定精度验证与误差分析
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 标定结果保存与加载
using Cognex.VisionPro.Persistence;
// 保存
string path = @"C:\Calibration\NPointCalib.vpp";
CogSerializer.SaveObjectToFile(calibTool, path);
// 加载
CogCalibNPointToNPointTool loaded =
CogSerializer.LoadObjectFromFile(path) as CogCalibNPointToNPointTool;
// 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.1 引用命名空间与程序集
| 命名空间 |
程序集 |
说明 |
Cognex.VisionPro |
Cognex.VisionPro.dll |
核心命名空间 |
Cognex.VisionPro.CalibFix |
Cognex.VisionPro.CalibFix.dll |
校准与定位工具 |
3.2 工具类继承关系
System.Object
└── CogToolBase (Cognex.VisionPro)
└── 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 |
输出空间选择:Fixtured 或 Unfixtured |
DuplicateHandling |
CogFixtureDuplicateHandlingConstants |
重复名称处理方式:Compatibility 或 Enhanced |
| 方法 |
说明 |
Run() |
执行坐标系创建 |
CreateCurrentRecord() |
创建当前记录 |
Dispose() |
释放资源 |
| 事件 |
触发时机 |
说明 |
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:配置参数
Action → EstablishNewFixture
SpaceToOutput → Fixtured
FixturedSpaceName → 唯一名称
DuplicateHandling → Enhanced
3.9 示例代码
3.9.1 配合 PMAlign 建立动态坐标系
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 手动设置变换参数
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}");
// 第一级:粗定位
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();
// 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 坐标系切换与下游工具联动
// 获取 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)
using Cognex.VisionPro.Persistence;
// 保存整个 ToolGroup(含所有工具配置)
CogSerializer.SaveObjectToFile(toolGroup, @"C:\Vision\MyJob.vpp");
// 加载
CogToolGroup loadedGroup =
CogSerializer.LoadObjectFromFile(@"C:\Vision\MyJob.vpp") as CogToolGroup;
4.1 引用命名空间与程序集
| 命名空间 |
程序集 |
说明 |
Cognex.VisionPro |
Cognex.VisionPro.dll |
核心命名空间 |
Cognex.VisionPro.CalibFix |
Cognex.VisionPro.CalibFix.dll |
校准与定位工具 |
4.2 工具类继承关系
System.Object
└── CogToolBase (Cognex.VisionPro)
└── 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 |
平均误差 |
| 方法 |
说明 |
Run() |
执行定位 |
CreateCurrentRecord() |
创建当前记录 |
Dispose() |
释放资源 |
| 事件 |
触发时机 |
说明 |
Ran |
工具运行完成后 |
获取运行结果 |
PropertyChanged |
属性值改变时 |
参数联动 |
4.8 使用方法与配置流程
步骤 1:采集多组对应点
- 至少 3 组点对(仿射变换)或 4 组(透视变换)
步骤 2:添加点对
- 调用
RawCalibrationPoints.Add()
步骤 3:选择变换模型
步骤 4:执行并验证
4.9 示例代码
4.9.1 基本多点定位
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 设置点对并运行
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 非线性变换(仿射/投影)
// 透视变换(需要至少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();
| 对比维度 |
CogCalibNPointToNPointTool |
CogFixtureNPointToNPointTool |
| 主要用途 |
相机标定(像素→物理坐标) |
坐标系定位(创建新坐标系) |
| 输出 |
校准后的图像(物理坐标) |
定位后的图像(新坐标系) |
| 典型场景 |
像素到毫米的转换 |
工件坐标系建立 |
| 与标定板配合 |
✅ 常用 |
⚠️ 可用但不典型 |
| 与 PMAlign 配合 |
⚠️ 可用 |
✅ 常用 |
选择建议:
- 如果目标是像素到物理单位的转换 → 使用
CogCalibNPointToNPointTool
- 如果目标是创建随工件移动的坐标系 → 使用
CogFixtureNPointToNPointTool
- 如果两者都需要 → 先用
CogCalibNPointToNPointTool 标定,再用 CogFixtureTool 定位
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.1 引用命名空间与程序集
| 命名空间 |
程序集 |
说明 |
Cognex.VisionPro |
Cognex.VisionPro.dll |
核心命名空间 |
Cognex.VisionPro.CalibFix |
Cognex.VisionPro.CalibFix.dll |
校准与定位工具 |
5.2 工具类继承关系
System.Object
└── CogToolBase (Cognex.VisionPro)
└── CogCalibNLineToNLineTool
| 属性 |
类型 |
说明 |
InputImage |
ICogImage |
输入图像 |
OutputImage |
ICogImage |
标定后的输出图像 |
RunParams |
CogCalibNLineToNLineRunParams |
运行参数 |
Result |
ICogCalibNLineToNLineResult |
标定结果 |
5.4 线标定模型说明
线标定通过多组线的对应关系建立变换模型,适用于以下场景:
- 传送带上的线性特征标定
- 基于边缘检测的标定
- 线阵相机标定
5.5 CogCalibNLineToNLineResult 结果属性
| 属性 |
类型 |
说明 |
CalibrationMode |
CogCalibNLineToNLineCalibrationModeConstants |
变换模型 |
MeanError |
double |
平均误差 |
CalibrationTransform |
ICogTransform2D |
变换矩阵 |
| 方法 |
说明 |
Run() |
执行线标定 |
CreateCurrentRecord() |
创建当前记录 |
Dispose() |
释放资源 |
| 事件 |
触发时机 |
说明 |
Ran |
工具运行完成后 |
获取运行结果 |
PropertyChanged |
属性值改变时 |
参数联动 |
5.8 使用方法与配置流程
5.8.1 步骤 1:提取线特征
- 使用 CogLineFinder 或边缘检测工具提取图像中的线
- 记录线的起点和终点像素坐标
5.8.2 步骤 2:添加线对
5.8.3 步骤 3:执行标定
5.9 示例代码
5.9.1 基本线标定
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 添加线对并查看结果
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 与测量工具联合使用
// 线标定后,将结果用于测量
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:创建新项目
打开 QuickBuild → 新建 Job → 添加 Image Source(相机或图像文件)
Step 2:添加校准工具
工具箱 → Calibration & Fixturing → CogCalibCheckerboardTool
拖放到 Job 中
Step 3:配置棋盘格参数
// 在 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:执行校准并检查结果
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 核心思路
原始图像 → 校准(物理坐标) → 定位(找工件) → Fixture(建坐标系) → 测量
6.2.3 完整代码
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 坐标系层级
像素空间 (PixelSpace)
└── 传送带坐标系 (BeltCoord) --- 由编码器或外部传感器提供
└── 工件坐标系 (PartCoord) --- 由 PMAlign 定位
└── 特征坐标系 (FeatureCoord) --- 由特征定位
6.3.4 实现
// 第一级:传送带坐标系(编码器驱动)
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 最佳实践总结
- 标定板选择:推荐使用陶瓷或玻璃材质的高精度标定板,避免打印标定板的热胀冷缩
- 图像采集:标定图像应覆盖整个视野,包括边缘和四角,至少10-15 幅
- 误差评估:平均重投影误差应< 0.5 像素,最大误差应< 1.0 像素
- 坐标系命名:使用有意义的名称(如 "PartCoord"、"BeltCoord"),避免默认名称
- 变换模型选择 :无透视畸变时使用
FullLinear,有透视畸变时使用 Perspective
- 工具顺序:Calibration → PMAlign → Fixture → Measurement
- 结果验证:每次标定后用已知尺寸的物体验证测量精度
- 版本管理:将标定结果保存为.vpp文件,纳入版本控制