文章目录
- 1.CogPMAlignEditV2---模板匹配设置窗体控件
-
- [1.1 引用命名空间与程序集](#1.1 引用命名空间与程序集)
- [1.2 控件类继承关系](#1.2 控件类继承关系)
- [1.3 CogPMAlignEditV2 主要属性](#1.3 CogPMAlignEditV2 主要属性)
- [1.4 控件内部区域说明](#1.4 控件内部区域说明)
- [1.5 CogPMAlignTool关联工具主要属性](#1.5 CogPMAlignTool关联工具主要属性)
- [1.6 CogPMAlignRunParams关键运行参数](#1.6 CogPMAlignRunParams关键运行参数)
- [1.7 CogPMAlignResult 单条结果属性](#1.7 CogPMAlignResult 单条结果属性)
- [1.8 CogPMAlignTool 主要方法](#1.8 CogPMAlignTool 主要方法)
- [1.9 CogPMAlignTool 主要事件](#1.9 CogPMAlignTool 主要事件)
- [1.10 使用方法](#1.10 使用方法)
- [1.11 示例代码](#1.11 示例代码)
-
- [1.11.1 基本关联与使用](#1.11.1 基本关联与使用)
- [1.11.2 动态切换工具对象](#1.11.2 动态切换工具对象)
- [1.11.3 配置运行参数后执行匹配](#1.11.3 配置运行参数后执行匹配)
- [1.11.4 将匹配结果图形叠加到 CogDisplay](#1.11.4 将匹配结果图形叠加到 CogDisplay)
- [1.11.5 序列化 / 反序列化工具(保存/加载 .vpp)](#1.11.5 序列化 / 反序列化工具(保存/加载 .vpp))
- [1.11.6 在ToolGroup中获取子工具并关联编辑控件](#1.11.6 在ToolGroup中获取子工具并关联编辑控件)
- [2.CogFixtureEditV2 --- 坐标系夹具设置窗体控件](#2.CogFixtureEditV2 — 坐标系夹具设置窗体控件)
-
- [2.1 引用命名空间与程序集](#2.1 引用命名空间与程序集)
- [2.2 控件类继承关系](#2.2 控件类继承关系)
- [2.3 CogFixtureEditV2 主要属性](#2.3 CogFixtureEditV2 主要属性)
-
- [2.3.1 Subject](#2.3.1 Subject)
- [2.4 控件内部区域说明](#2.4 控件内部区域说明)
-
- [2.4.1 区域布局示意](#2.4.1 区域布局示意)
- [2.4.2 各区域功能说明](#2.4.2 各区域功能说明)
- [2.5 CogFixtureTool 关联工具主要属性](#2.5 CogFixtureTool 关联工具主要属性)
-
- [2.5.1 Transform2D对象详解](#2.5.1 Transform2D对象详解)
- [2.6 CogFixtureRunParams 关键运行参数](#2.6 CogFixtureRunParams 关键运行参数)
- [2.7 CogFixtureTool 变换结果属性](#2.7 CogFixtureTool 变换结果属性)
-
- [2.7.1 坐标变换公式](#2.7.1 坐标变换公式)
- [2.8 CogFixtureTool 主要方法](#2.8 CogFixtureTool 主要方法)
-
- [2.8.1 方法使用示例](#2.8.1 方法使用示例)
- [2.9 CogFixtureTool 主要事件](#2.9 CogFixtureTool 主要事件)
-
- [2.9.1 事件使用示例](#2.9.1 事件使用示例)
- [2.10 使用方法](#2.10 使用方法)
-
- [2.10.1 使用流程](#2.10.1 使用流程)
- [2.11 示例代码](#2.11 示例代码)
-
- [2.11.1 基本关联与使用](#2.11.1 基本关联与使用)
- [2.11.2 动态切换工具对象](#2.11.2 动态切换工具对象)
- [2.11.3 配置变换类型与参数后执行](#2.11.3 配置变换类型与参数后执行)
- [2.11.4 将定位工具输出作为夹具输入](#2.11.4 将定位工具输出作为夹具输入)
- [2.11.5 序列化/反序列化工具 (保存/加载 .vpp)](#2.11.5 序列化/反序列化工具 (保存/加载 .vpp))
- [2.11.6 在 ToolGroup 中获取子工具并关联编辑控件](#2.11.6 在 ToolGroup 中获取子工具并关联编辑控件)
- [2.11.7 多级夹具串联(Fixture 链)](#2.11.7 多级夹具串联(Fixture 链))
- [2.12 常见问题](#2.12 常见问题)
-
- [2.12.1 Fixture 和 CalibNPointToNPoint 有什么区别?](#2.12.1 Fixture 和 CalibNPointToNPoint 有什么区别?)
- [2.12.2 如何选择变换类型?](#2.12.2 如何选择变换类型?)
- [2.12.3 输入坐标从哪里获取?](#2.12.3 输入坐标从哪里获取?)
- [2.12.4 如何在运行时动态更新变换参数?](#2.12.4 如何在运行时动态更新变换参数?)
- [2.12.5 如何获取变换矩阵用于自定义计算?](#2.12.5 如何获取变换矩阵用于自定义计算?)
- [3.CogCalibNPointToNPointEditV2 --- N点坐标矫正设置窗体控件](#3.CogCalibNPointToNPointEditV2 — N点坐标矫正设置窗体控件)
-
- [3.1 引用命名空间与程序集](#3.1 引用命名空间与程序集)
- [3.2 控件类继承关系](#3.2 控件类继承关系)
- [3.3 CogCalibNPointToNPointEditV2主要属性](#3.3 CogCalibNPointToNPointEditV2主要属性)
-
- [3.3.1 Subject](#3.3.1 Subject)
- [3.4 控件内部区域说明](#3.4 控件内部区域说明)
-
- [3.4.1 区域布局示意](#3.4.1 区域布局示意)
- [3.4.2 各区域功能说明](#3.4.2 各区域功能说明)
- [3.5 CogCalibNPointToNPointTool关联工具主要属性](#3.5 CogCalibNPointToNPointTool关联工具主要属性)
-
- [3.5.1 RawCalibrationPoints 集合详解](#3.5.1 RawCalibrationPoints 集合详解)
- [3.6 CogCalibNPointToNPointRunParams关键运行参数](#3.6 CogCalibNPointToNPointRunParams关键运行参数)
-
- [3.6.1 映射类型说明](#3.6.1 映射类型说明)
- [3.7 CogCalibrationStatistics 标定结果属性](#3.7 CogCalibrationStatistics 标定结果属性)
-
- [3.7.1 残差评估标准](#3.7.1 残差评估标准)
- [3.8 CogCalibNPointToNPointTool主要方法](#3.8 CogCalibNPointToNPointTool主要方法)
-
- [3.8.1 方法使用示例](#3.8.1 方法使用示例)
- [3.9 CogCalibNPointToNPointTool主要事件](#3.9 CogCalibNPointToNPointTool主要事件)
-
- [3.9.1 事件使用示例](#3.9.1 事件使用示例)
- [3.10 使用方法](#3.10 使用方法)
-
- [3.10.1 使用流程](#3.10.1 使用流程)
- [3.11 示例代码](#3.11 示例代码)
-
- [3.11.1 基本关联与使用](#3.11.1 基本关联与使用)
- [3.11.2 动态切换工具对象](#3.11.2 动态切换工具对象)
- [3.11.3 配置映射类型后执行标定](#3.11.3 配置映射类型后执行标定)
- [3.11.4 坐标转换与结果叠加到CogDisplay](#3.11.4 坐标转换与结果叠加到CogDisplay)
- [3.11.5 序列化/反序列化工具(保存/加载 .vpp)](#3.11.5 序列化/反序列化工具(保存/加载 .vpp))
- [3.11.6 在 ToolGroup中获取子工具并关联编辑控件](#3.11.6 在 ToolGroup中获取子工具并关联编辑控件)
- [3.12 常见问题](#3.12 常见问题)
-
- 3.12.1标定点最少需要几个?
- [3.12.2 如何提高标定精度?](#3.12.2 如何提高标定精度?)
- [3.12.3 标定后坐标转换误差大怎么办?](#3.12.3 标定后坐标转换误差大怎么办?)
- [3.12.4 如何在运行时动态添加标定点?](#3.12.4 如何在运行时动态添加标定点?)
- 4.CogFindCircleEditV2---查找圆设置窗体控件
-
- [4.1 引用命名空间与程序集](#4.1 引用命名空间与程序集)
- [4.2 控件类继承关系](#4.2 控件类继承关系)
- [4.3 CogFindCircleEditV2主要属性](#4.3 CogFindCircleEditV2主要属性)
-
- [4.3.1 Subject](#4.3.1 Subject)
- [4.4 控件内部区域说明](#4.4 控件内部区域说明)
-
- [4.4.1 区域布局示意](#4.4.1 区域布局示意)
- [4.4.2 各区域功能说明](#4.4.2 各区域功能说明)
- [4.5 CogFindCircleTool 关联工具主要属性](#4.5 CogFindCircleTool 关联工具主要属性)
-
- [4.5.1 Results结果集合详解](#4.5.1 Results结果集合详解)
- [4.6 CogFindCircleRunParams 关键运行参数](#4.6 CogFindCircleRunParams 关键运行参数)
-
- [4.6.1 边缘极性说明](#4.6.1 边缘极性说明)
- [4.6.2 搜索方向说明](#4.6.2 搜索方向说明)
- [4.7 CogFindCircleResult 结果属性](#4.7 CogFindCircleResult 结果属性)
-
- [4.7.1 结果评估标准](#4.7.1 结果评估标准)
- [4.8 CogFindCircleTool主要方法](#4.8 CogFindCircleTool主要方法)
-
- [4.8.1 方法使用示例](#4.8.1 方法使用示例)
- [4.9 CogFindCircleTool主要事件](#4.9 CogFindCircleTool主要事件)
-
- [4.9.1 事件使用示例](#4.9.1 事件使用示例)
- [4.10 使用方法](#4.10 使用方法)
-
- [4.10.1 使用流程](#4.10.1 使用流程)
- [4.11 示例代码](#4.11 示例代码)
-
- [4.11.1 基本关联与使用](#4.11.1 基本关联与使用)
- [4.11.2 动态切换工具对象](#4.11.2 动态切换工具对象)
- [4.11.3 配置搜索区域与边缘参数后执行](#4.11.3 配置搜索区域与边缘参数后执行)
- [4.11.4 将查找结果图形叠加到 CogDisplay](#4.11.4 将查找结果图形叠加到 CogDisplay)
- [4.11.5 序列化/反序列化工具(保存/加载 .vpp)](#4.11.5 序列化/反序列化工具(保存/加载 .vpp))
- [4.11.6 在 ToolGroup 中获取子工具并关联编辑控件](#4.11.6 在 ToolGroup 中获取子工具并关联编辑控件)
- [4.11.7 多圆检测与结果筛选](#4.11.7 多圆检测与结果筛选)
- [4.12 常见问题](#4.12 常见问题)
-
- [4.12.1 如何选择合适的边缘阈值?](#4.12.1 如何选择合适的边缘阈值?)
- [4.12.2 卡尺数量设多少合适?](#4.12.2 卡尺数量设多少合适?)
- [4.12.3 搜索区域如何设置?](#4.12.3 搜索区域如何设置?)
- [4.12.4 边缘点利用率低怎么办?](#4.12.4 边缘点利用率低怎么办?)
- [4.12.5 如何提高圆检测的鲁棒性?](#4.12.5 如何提高圆检测的鲁棒性?)
- [4.12.6 如何在运行时动态调整搜索区域?](#4.12.6 如何在运行时动态调整搜索区域?)
- 5.CogAcqFifoEditV2---图像采集设置窗体控件
-
- [5.1 引用命名空间与程序集](#5.1 引用命名空间与程序集)
- [5.2 控件类继承关系](#5.2 控件类继承关系)
- [5.3 CogAcqFifoEditV2主要属性](#5.3 CogAcqFifoEditV2主要属性)
-
- [5.3.1 Subject](#5.3.1 Subject)
- [5.4 控件内部区域说明](#5.4 控件内部区域说明)
-
- [5.4.1 区域布局示意](#5.4.1 区域布局示意)
- [5.4.2 各区域功能说明](#5.4.2 各区域功能说明)
- [5.5 CogAcqFifoTool关联工具主要属性](#5.5 CogAcqFifoTool关联工具主要属性)
-
- [5.5.1 AcqFifo 采集队列详解](#5.5.1 AcqFifo 采集队列详解)
- [5.6 CogAcqFifoRunParams关键运行参数](#5.6 CogAcqFifoRunParams关键运行参数)
-
- [5.6.1 触发模式说明](#5.6.1 触发模式说明)
- [5.6.2 像素格式说明](#5.6.2 像素格式说明)
- [5.7 CogAcqFifoResult采集结果属性](#5.7 CogAcqFifoResult采集结果属性)
-
- [5.7.1 采集性能评估](#5.7.1 采集性能评估)
- [5.8 CogAcqFifoTool主要方法](#5.8 CogAcqFifoTool主要方法)
-
- [5.8.1 方法使用示例](#5.8.1 方法使用示例)
- [5.9 CogAcqFifoTool主要事件](#5.9 CogAcqFifoTool主要事件)
-
- [5.9.1 事件使用示例](#5.9.1 事件使用示例)
- [5.10 使用方法](#5.10 使用方法)
-
- [5.10.1 使用流程](#5.10.1 使用流程)
- [5.11 示例代码](#5.11 示例代码)
-
- [5.11.1 基本关联与使用](#5.11.1 基本关联与使用)
- [5.11.2 动态切换工具对象](#5.11.2 动态切换工具对象)
- [5.11.3 配置采集参数后执行采集](#5.11.3 配置采集参数后执行采集)
- [5.11.4 从图像文件采集](#5.11.4 从图像文件采集)
- [5.11.5 连续采集与实时显示](#5.11.5 连续采集与实时显示)
- [5.11.6 序列化/反序列化工具(保存/加载 .vpp)](#5.11.6 序列化/反序列化工具(保存/加载 .vpp))
- [5.11.7 在 ToolGroup 中获取子工具并关联编辑控件](#5.11.7 在 ToolGroup 中获取子工具并关联编辑控件)
- [5.11.8 硬件触发采集与图像处理链](#5.11.8 硬件触发采集与图像处理链)
- [5.12 常见问题](#5.12 常见问题)
-
- [5.12.1 找不到相机怎么办?](#5.12.1 找不到相机怎么办?)
- [5.1.2.2 采集图像全黑或全白?](#5.1.2.2 采集图像全黑或全白?)
- [5.12.3 采集超时怎么处理?](#5.12.3 采集超时怎么处理?)
- [5.12.4 如何提高采集帧率?](#5.12.4 如何提高采集帧率?)
- [5.12.5 丢帧怎么解决?](#5.12.5 丢帧怎么解决?)
- [5.12.6 如何在连续采集时获取最新帧?](#5.12.6 如何在连续采集时获取最新帧?)
- 6.CogImageFileEditV2---图像文件设置窗体控
-
- [6.1 概述](#6.1 概述)
- [6.2 引用与命名空间](#6.2 引用与命名空间)
-
- [6.2.1 程序集引用(Assembly References)](#6.2.1 程序集引用(Assembly References))
- [6.2.2 命名空间(Namespaces)](#6.2.2 命名空间(Namespaces))
- [6.3 核心属性(Properties)](#6.3 核心属性(Properties))
-
- [6.3.1 CogImageFileEditV2控件属性](#6.3.1 CogImageFileEditV2控件属性)
- [6.3.2 CogImageFileTool对象属性](#6.3.2 CogImageFileTool对象属性)
- [6.3.3 CogImageFileOperator属性](#6.3.3 CogImageFileOperator属性)
- [6.4 核心方法(Methods)](#6.4 核心方法(Methods))
-
- [6.4.1 CogImageFileTool方法](#6.4.1 CogImageFileTool方法)
- [6.4.2 CogImageFileOperator方法](#6.4.2 CogImageFileOperator方法)
- [6.5 关键运行参数](#6.5 关键运行参数)
-
- [6.5.1 文件操作模式(CogImageFileModeConstants)](#6.5.1 文件操作模式(CogImageFileModeConstants))
- [6.5.2 文件打开模式(CogImageFileOpenModeConstants)](#6.5.2 文件打开模式(CogImageFileOpenModeConstants))
- [6.5.3 图像格式(CogImageFileFormatConstants)](#6.5.3 图像格式(CogImageFileFormatConstants))
- [6.5.4 运行状态(CogRunResultConstants)](#6.5.4 运行状态(CogRunResultConstants))
- [6.5.5 支持的图像文件格式](#6.5.5 支持的图像文件格式)
- [6.6 代码示例](#6.6 代码示例)
-
- [6.6.1 基本关联](#6.6.1 基本关联)
- [6.6.2 编程设置文件路径并加载](#6.6.2 编程设置文件路径并加载)
- [6.6.3 分步设置文件路径和模式](#6.6.3 分步设置文件路径和模式)
- [6.6.4 保存图像到文件](#6.6.4 保存图像到文件)
- [6.6.5 另存为不同格式](#6.6.5 另存为不同格式)
- [6.6.6 批量读取文件夹中的图像](#6.6.6 批量读取文件夹中的图像)
- [6.6.7 使用CogDisplay预览图像](#6.6.7 使用CogDisplay预览图像)
- [6.6.8 在ToolBlock中集成CogImageFileTool](#6.6.8 在ToolBlock中集成CogImageFileTool)
- [6.6.9 图像格式转换工具](#6.6.9 图像格式转换工具)
- [6.6.10 带错误处理的完整图像加载流程](#6.6.10 带错误处理的完整图像加载流程)
- [6.7 控件界面功能说明](#6.7 控件界面功能说明)
- [6.8 注意事项](#6.8 注意事项)
- [6.9 典型应用场景](#6.9 典型应用场景)
这些控件是 VisionPro 提供的 UI 设置窗体 ,用于在 Windows Forms 应用程序中可视化配置对应的工具。每个 Edit 控件都有一个
Subject属性,用于关联对应的工具实例。
1.CogPMAlignEditV2---模板匹配设置窗体控件
| 项目 | 说明 |
|---|---|
| 主要作用 | 提供 CogPMAlignTool(模板匹配工具)的可视化配置界面 |
| 依赖库 | Cognex.VisionPro.PMAlign |
| 关联方式 | CogPMAlignEditV2.Subject = CogPMAlignTool1; |
| 关联工具类型 | CogPMAlignTool |

1.1 引用命名空间与程序集
csharp
// ========== 控件自身 ==========
using Cognex.VisionPro.PMAlignEdit; // CogPMAlignEditV2 控件所在命名空间
// 程序集: Cognex.VisionPro.PMAlignEdit.dll
// ========== 关联工具 ==========
using Cognex.VisionPro.PMAlign; // CogPMAlignTool / CogPMAlignResult / CogPMAlignPattern
// 程序集: Cognex.VisionPro.PMAlign.dll
// ========== 基础类型 ==========
using Cognex.VisionPro; // ICogImage, ICogTool, CogImage8Grey, CogTransform2DLinear 等
using Cognex.VisionPro.ImageFile; // 如需从文件加载图像
using Cognex.VisionPro.Display; // CogDisplay 相关
using Cognex.VisionPro.ToolGroup; // CogToolGroup / CogSerializer 序列化相关
1.2 控件类继承关系
bash
System.Windows.Forms.UserControl
└── Cognex.VisionPro.CogToolEditBase // VisionPro 工具编辑控件基类
└── CogPMAlignEditV2 // PMAlign 专用编辑控件
1.3 CogPMAlignEditV2 主要属性
| 属性 | 类型 | 说明 |
|---|---|---|
Subject |
CogPMAlignTool |
核心属性 。关联的 PMAlign 工具实例。赋值后控件自动加载工具的参数并显示编辑界面。设为 null 可取消关联 |
TipText |
string |
获取或设置控件的工具提示文本 |
Dock |
DockStyle |
继承自 UserControl,控制控件在窗体中的停靠方式(通常设为 DockStyle.Fill) |
BorderStyle |
BorderStyle |
控件边框样式(None / FixedSingle / Fixed3D) |
说明:
CogPMAlignEditV2内部集成了工具显示窗口、控制按钮栏、参数选项卡组和状态栏,是一个复合型编辑控件。
1.4 控件内部区域说明
控件界面包含以下区域:
| 区域 | 说明 |
|---|---|
| 控制按钮栏(顶部) | 运行、电动模式、本地/浮动显示、加载/保存/重置 .vpp、图像蒙版编辑器、结果窗口、模型制作器、工具提示开关、帮助 |
| 工具显示窗口(中部) | 可显示 Current.TrainImage、Current.InputImage、LastRun.InputImage 三个图像缓冲区 |
| 参数选项卡组(中部下方) | 按功能组织:运行参数、搜索区域(SearchRegion)、显示设置(Graphics)、训练结果(TrainResult)、结果(Results)等 |
| 状态栏(底部) | 绿色圆圈=成功运行,红色=失败;显示运行耗时和错误信息 |
1.5 CogPMAlignTool关联工具主要属性
通过 Subject 属性关联后,可在代码中直接操作以下 CogPMAlignTool 属性:
| 属性 | 类型 | 说明 |
|---|---|---|
InputImage |
ICogImage |
输入图像(运行时搜索的目标图像) |
TrainImage |
ICogImage |
训练图像(模板来源) |
Pattern |
CogPMAlignPattern |
训练后的模板对象,包含训练特征和参数 |
RunParams |
CogPMAlignRunParams |
运行参数(搜索算法、接受阈值、角度范围、缩放范围等) |
Results |
CogPMAlignResults |
运行结果集合 |
RunStatus |
CogToolRunStatus |
工具运行状态(Success / Error / Accept / Reject 等) |
LastRunRecordLog |
ICogRecord |
最后一次运行的记录(可用于回放显示) |
1.6 CogPMAlignRunParams关键运行参数
| 参数 | 类型 | 说明 |
|---|---|---|
RunAlgorithm |
CogPMAlignRunAlgorithmConstants |
搜索算法:PatQuick / PatMax / PatFlex |
AcceptThreshold |
double |
接受阈值(0.0~1.0),低于此分数的结果将被丢弃 |
ExpectedMaxFeatures |
int |
期望最大特征数 |
Angle |
CogPMAlignAngleConstants |
角度搜索范围相关 |
AngleLow / AngleHigh |
double |
自定义角度搜索下限/上限(弧度) |
Scale |
CogPMAlignScaleConstants |
缩放搜索范围相关 |
ScaleLow / ScaleHigh |
double |
自定义缩放搜索下限/上限 |
ZonedScoreRegion |
ICogRegion |
区域评分区域 |
ZonedScoreMode |
CogPMAlignZonedScoreModeConstants |
区域评分模式 |
NumberToFind |
int |
要查找的匹配数量上限(-1 为不限) |
OverlapRatio |
double |
结果重叠比率阈值 |
1.7 CogPMAlignResult 单条结果属性
| 属性 | 类型 | 说明 |
|---|---|---|
Score |
double |
匹配分数(0.0~1.0) |
Pose |
CogTransform2DLinear |
匹配到的位姿(包含 X、Y、旋转角度、缩放) |
GetPose |
方法 | 获取匹配位姿 |
CreateResultGraphics |
方法 | 创建结果图形(用于在 CogDisplay 上显示坐标轴、轮廓等) |
1.8 CogPMAlignTool 主要方法
| 方法 | 说明 |
|---|---|
Run() |
执行模板匹配。需要已设置 InputImage 和已训练的 Pattern |
Train() |
使用当前 TrainImage 和 Pattern.TrainRegion 训练模板 |
CreateCurrentRecord() |
创建当前状态的记录对象 |
1.9 CogPMAlignTool 主要事件
| 事件 | 说明 |
|---|---|
Ran |
工具运行完成后触发 |
Changed |
工具属性发生变化时触发 |
1.10 使用方法
- 在工具箱中拖拽
CogPMAlignEditV2到窗体 - 在代码中将工具实例赋值给
Subject属性 - 用户可在运行时通过该窗体训练模板、调整匹配参数、查看匹配结果
1.11 示例代码
1.11.1 基本关联与使用
csharp
using Cognex.VisionPro;
using Cognex.VisionPro.PMAlign;
using Cognex.VisionPro.PMAlignEdit;
// 关联工具
cogPMAlignEditV21.Subject = CogPMAlignTool1;
// 在运行时获取匹配结果
CogPMAlignTool1.Run();
if (CogPMAlignTool1.Results.Count > 0)
{
double score = CogPMAlignTool1.Results[0].Score;
var pose = CogPMAlignTool1.Results[0].Pose;
MessageBox.Show($"匹配分数: {score:F3}, 位置: ({pose.TranslationX:F2}, {pose.TranslationY:F2})");
}
1.11.2 动态切换工具对象
csharp
// 根据不同产品切换不同的匹配模板
private void SwitchTemplate(string productName)
{
if (productName == "ProductA")
cogPMAlignEditV21.Subject = pmAlignToolA;
else if (productName == "ProductB")
cogPMAlignEditV21.Subject = pmAlignToolB;
}
1.11.3 配置运行参数后执行匹配
csharp
using Cognex.VisionPro.PMAlign;
// 设置运行参数
CogPMAlignTool1.RunParams.RunAlgorithm = CogPMAlignRunAlgorithmConstants.PatMax;
CogPMAlignTool1.RunParams.AcceptThreshold = 0.7;
CogPMAlignTool1.RunParams.NumberToFind = 5; // 最多找 5 个匹配
CogPMAlignTool1.RunParams.AngleLow = -Math.PI / 6; // 角度范围 -30°
CogPMAlignTool1.RunParams.AngleHigh = Math.PI / 6; // 到 +30°
CogPMAlignTool1.RunParams.ScaleLow = 0.9; // 缩放范围 90%
CogPMAlignTool1.RunParams.ScaleHigh = 1.1; // 到 110%
// 执行
CogPMAlignTool1.Run();
// 遍历所有匹配结果
for (int i = 0; i < CogPMAlignTool1.Results.Count; i++)
{
var result = CogPMAlignTool1.Results[i];
Console.WriteLine($"[{i}] Score={result.Score:F3}, " +
$"X={result.Pose.TranslationX:F2}, " +
$"Y={result.Pose.TranslationY:F2}, " +
$"Angle={result.Pose.Rotation:F4} rad");
}
1.11.4 将匹配结果图形叠加到 CogDisplay
csharp
using Cognex.VisionPro;
using Cognex.VisionPro.Display;
// 清除旧图层
cogDisplay1.StaticGraphics.Clear();
// 将匹配结果的坐标轴图形添加到静态图层
if (CogPMAlignTool1.Results.Count > 0)
{
var resultGraphics = CogPMAlignTool1.Results[0]
.CreateResultGraphics(CogPMAlignResultGraphicConstants.CoordinateAxes);
cogDisplay1.StaticGraphics.Add(resultGraphics, "PMAlignResult");
}
// 显示输入图像
cogDisplay1.Image = CogPMAlignTool1.InputImage;
1.11.5 序列化 / 反序列化工具(保存/加载 .vpp)
csharp
using Cognex.VisionPro;
// 保存工具到 .vpp 文件
CogSerializer.SaveObjectToFile(
CogPMAlignTool1,
@"C:\Projects\PMAlignTool1.vpp",
typeof(System.Runtime.Serialization.Formatters.Soap.SoapFormatter),
CogSerializationOptionsConstants.Minimum);
// 从 .vpp 文件加载工具
object obj = CogSerializer.LoadObjectFromFile(@"C:\Projects\PMAlignTool1.vpp");
CogPMAlignTool loadedTool = obj as CogPMAlignTool;
cogPMAlignEditV21.Subject = loadedTool;
1.11.6 在ToolGroup中获取子工具并关联编辑控件
csharp
using Cognex.VisionPro;
using Cognex.VisionPro.ToolGroup;
using Cognex.VisionPro.PMAlign;
// 加载工具组
object obj = CogSerializer.LoadObjectFromFile(@"C:\Projects\ToolGroup1.vpp");
CogToolGroup toolGroup = obj as CogToolGroup;
// 获取子工具
CogPMAlignTool pmTool = toolGroup.Tools["CogPMAlignTool1"] as CogPMAlignTool;
// 关联到编辑控件
cogPMAlignEditV21.Subject = pmTool;
// 运行工具组
toolGroup.Run();
// 读取结果
if (pmTool.RunStatus == CogToolRunStatusConstants.Accept)
{
Console.WriteLine($"匹配成功,分数: {pmTool.Results[0].Score:F3}");
}
2.CogFixtureEditV2 --- 坐标系夹具设置窗体控件
| 项目 | 说明 |
|---|---|
| 主要作用 | 提供坐标系夹具(Fixture)工具的可视化配置界面,用于定义和管理工件坐标系变换 |
| 依赖库 | Cognex.VisionPro.CalibFix |
| 关联方式 | CogFixtureEditV2.Subject = CogFixtureTool1; |
| 关联工具类型 | CogFixtureTool |
关键概念:
- Fixture(夹具/坐标系):定义一个相对于基准坐标系的偏移与旋转变换
- 常用于将像素坐标映射到工件实际坐标系,或在多相机系统中统一坐标系
2.1 引用命名空间与程序集
在使用 CogFixtureEditV2 控件前,需要在项目中添加以下引用:
命名空间:
csharp
using Cognex.VisionPro;
using Cognex.VisionPro.CalibFix;
using Cognex.VisionPro.ToolBlock;
程序集引用:
| 程序集 | 说明 |
|---|---|
Cognex.VisionPro.dll |
VisionPro 核心库 |
Cognex.VisionPro.CalibFix.dll |
坐标系变换与夹具库 |
Cognex.VisionPro.ToolBlock.dll |
工具块容器库(可选,ToolGroup 场景使用) |
2.2 控件类继承关系
bash
System.Object
└── System.MarshalByRefObject
└── System.ComponentModel.Component
└── System.Windows.Forms.Control
└── System.Windows.Forms.ScrollableControl
└── System.Windows.Forms.ContainerControl
└── System.Windows.Forms.UserControl
└── Cognex.VisionPro.CogFixtureEditV2
CogFixtureEditV2 继承自 UserControl,是一个标准的 WinForms 用户控件,可直接嵌入到任何 WinForms 容器中使用。
2.3 CogFixtureEditV2 主要属性
| 属性 | 类型 | 说明 |
|---|---|---|
Subject |
CogFixtureTool |
获取或设置关联的夹具工具对象 |
Dock |
DockStyle |
控件停靠方式,通常设为 DockStyle.Fill |
BorderStyle |
BorderStyle |
边框样式(None/FixedSingle/Fixed3D) |
核心属性详解:
2.3.1 Subject
这是控件最重要的属性,将编辑控件与实际执行坐标变换的夹具工具绑定:
csharp
cogFixtureEditV2.Subject = myFixtureTool;
设置后,控件会自动加载工具中的所有配置参数,并在界面上显示。
2.4 控件内部区域说明
CogFixtureEditV2 界面主要分为以下功能区域:
2.4.1 区域布局示意
bash
┌─────────────────────────────────────────────────────┐
│ 工具栏区域 (Toolbar) │
│ [运行] [加载配置] [保存配置] │
├─────────────────────────────────────────────────────┤
│ 坐标系变换参数区域 (Transform Parameters) │
│ ┌───────────────────────────────────────────────┐ │
│ │ 变换类型:[简单变换 ▼] │ │
│ │ │ │
│ │ X 平移 (Tx): [ 0.000 ] mm │ │
│ │ Y 平移 (Ty): [ 0.000 ] mm │ │
│ │ 旋转角度 (θ): [ 0.000 ] deg │ │
│ │ X 缩放 (Sx): [ 1.000 ] │ │
│ │ Y 缩放 (Sy): [ 1.000 ] │ │
│ └───────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────┤
│ 输入坐标源区域 (Input Source) │
│ ┌───────────────────────────────────────────────┐ │
│ │ X 坐标来源: [工具.结果.X ▼] │ │
│ │ Y 坐标来源: [工具.结果.Y ▼] │ │
│ │ 角度来源: [工具.结果.Angle ▼] │ │
│ └───────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────┤
│ 状态/结果区域 (Status / Result) │
│ 运行状态:成功 / 失败 │
│ 输出坐标系:已应用 / 未应用 │
└─────────────────────────────────────────────────────┘
2.4.2 各区域功能说明
| 区域 | 功能 |
|---|---|
| 工具栏区域 | 提供运行、加载/保存 .vpp 文件等操作按钮 |
| 变换参数区域 | 配置坐标变换的核心参数:平移、旋转、缩放 |
| 输入坐标源区域 | 绑定变换所需的 X/Y/角度数据来源(可来自其他工具的输出) |
| 状态/结果区域 | 显示工具运行状态和输出坐标系信息 |
2.5 CogFixtureTool 关联工具主要属性
CogFixtureTool 是实际执行坐标系变换的核心工具:
| 属性 | 类型 | 说明 |
|---|---|---|
TransformName |
string |
坐标系变换名称,用于在工具链中标识 |
Transform2D |
ICogTransform2D |
当前生效的 2D 坐标变换对象 |
TransformType |
CogFixtureTransformTypeConstants |
变换类型(简单/完整仿射/投影等) |
InputX |
double |
输入 X 坐标(平移量来源) |
InputY |
double |
输入 Y 坐标(平移量来源) |
InputRotation |
double |
输入旋转角度(度) |
InputScaleX |
double |
输入 X 缩放因子 |
InputScaleY |
double |
输入 Y 缩放因子 |
OutputX |
double |
变换后输出 X 坐标 |
OutputY |
double |
变换后输出 Y 坐标 |
LastRunStatus |
CogToolResultConstants |
上次运行结果状态 |
Enabled |
bool |
是否启用该夹具变换 |
2.5.1 Transform2D对象详解
Transform2D 是核心变换对象,包含完整的坐标变换矩阵:
- 平移:Tx, Ty
- 旋转:θ(角度)
- 缩放:Sx, Sy
- 剪切:适用于仿射变换
2.6 CogFixtureRunParams 关键运行参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
TransformType |
CogFixtureTransformTypeConstants |
--- | 变换类型 |
UseCalibratedCoordinates |
bool |
false | 是否使用已标定的物理坐标 |
ExpectedInputX |
double |
--- | 预期输入 X(用于验证) |
ExpectedInputY |
double |
--- | 预期输入 Y(用于验证) |
RunWithoutInputUpdate |
bool |
false | 输入未更新时是否仍运行 |
变换类型说明
| 变换类型 | 说明 | 适用场景 |
|---|---|---|
| 简单变换 (Simple) | 平移 + 旋转(无缩放) | 工件位置偏移补偿,保持比例不变 |
| 带缩放变换 (WithScale) | 平移 + 旋转 + 均匀缩放 | 工件尺寸略有变化的场景 |
| 仿射变换 (Affine) | 平移 + 旋转 + 非均匀缩放 + 剪切 | 复杂形变补偿 |
| 投影变换 (Projective) | 完整透视变换 | 非平面或视角倾斜场景 |
2.7 CogFixtureTool 变换结果属性
变换完成后的输出信息:
| 属性 | 类型 | 说明 |
|---|---|---|
OutputX |
double |
变换后的 X 坐标 |
OutputY |
double |
变换后的 Y 坐标 |
OutputRotation |
double |
变换后的旋转角度 |
TransformValid |
bool |
当前变换是否有效 |
LastRunStatus |
CogToolResultConstants |
运行状态(Accept/Fail) |
2.7.1 坐标变换公式
简单变换(平移 + 旋转):
bash
X' = X·cos(θ) - Y·sin(θ) + Tx
Y' = X·sin(θ) + Y·cos(θ) + Ty
带缩放变换:
bash
X' = Sx·(X·cos(θ) - Y·sin(θ)) + Tx
Y' = Sy·(X·sin(θ) + Y·cos(θ)) + Ty
2.8 CogFixtureTool 主要方法
| 方法 | 说明 |
|---|---|
Run() |
执行坐标系变换计算 |
SetTransformPose(x, y, rotation) |
一次性设置平移和旋转参数 |
ResetTransform() |
重置变换为单位矩阵(无变换) |
GetTransformMatrix() |
获取当前变换的 3×3 矩阵 |
Save(string filename) |
保存夹具配置到 .vpp 文件 |
Load(string filename) |
从 .vpp 文件加载夹具配置 |
2.8.1 方法使用示例
csharp
// 执行变换
myFixtureTool.Run();
// 获取变换后的坐标
double outX = myFixtureTool.OutputX;
double outY = myFixtureTool.OutputY;
// 一次性设置位姿
myFixtureTool.SetTransformPose(10.0, 20.0, 45.0); // X=10mm, Y=20mm, 旋转45°
// 重置变换
myFixtureTool.ResetTransform();
2.9 CogFixtureTool 主要事件
| 事件 | 触发时机 | 说明 |
|---|---|---|
Ran |
工具运行完成后 | 无论成功或失败均触发 |
TransformChanged |
变换参数发生变化时 | 可用于联动更新下游工具 |
InputChanged |
输入坐标/角度来源变化时 | 用于实时预览变换效果 |
2.9.1 事件使用示例
csharp
// 监听运行完成事件
myFixtureTool.Ran += (sender, e) =>
{
if (myFixtureTool.LastRunStatus == CogToolResultConstants.Accept)
{
Console.WriteLine("坐标变换成功!");
Console.WriteLine($"输出坐标: X={myFixtureTool.OutputX:F3}, Y={myFixtureTool.OutputY:F3}");
Console.WriteLine($"输出角度: {myFixtureTool.OutputRotation:F3}°");
}
else
{
Console.WriteLine("坐标变换失败!");
}
};
// 监听变换参数变化
myFixtureTool.TransformChanged += (sender, e) =>
{
Console.WriteLine("变换参数已更新,可重新运行以应用新变换");
};
2.10 使用方法
2.10.1 使用流程
- 添加引用 → 引入
Cognex.VisionPro.CalibFix程序集 - 放置控件 → 在 WinForms 窗体上放置
CogFixtureEditV2 - 创建工具 → 实例化
CogFixtureTool - 关联控件 → 设置
EditV2.Subject = tool - 配置变换类型 → 根据应用需求选择变换类型
- 设置输入源 → 绑定 X/Y/角度数据来源(可来自定位工具输出)
- 配置变换参数 → 设置平移量、旋转角度、缩放因子
- 执行变换 → 调用
Run()或通过控件界面运行 - 使用结果 → 将变换后的坐标传递给下游工具(如标定工具、测量工具)
2.11 示例代码
2.11.1 基本关联与使用
csharp
// 创建夹具工具并关联到编辑控件
CogFixtureTool fixtureTool = new CogFixtureTool();
cogFixtureEditV2.Subject = fixtureTool;
// 设置变换参数
fixtureTool.InputX = 50.0; // X 平移 50mm
fixtureTool.InputY = 30.0; // Y 平移 30mm
fixtureTool.InputRotation = 15.0; // 旋转 15°
// 执行变换
fixtureTool.Run();
if (fixtureTool.LastRunStatus == CogToolResultConstants.Accept)
{
MessageBox.Show($"变换成功!输出: X={fixtureTool.OutputX:F2}, Y={fixtureTool.OutputY:F2}");
}
2.11.2 动态切换工具对象
csharp
// 在运行时动态切换关联的夹具工具
public void SwitchFixtureTool(CogFixtureTool newTool)
{
cogFixtureEditV2.Subject = newTool;
// 刷新显示
cogFixtureEditV2.Refresh();
Console.WriteLine($"已切换到新夹具工具: {newTool.TransformName}");
}
2.11.3 配置变换类型与参数后执行
csharp
CogFixtureTool fixtureTool = new CogFixtureTool();
// 设置变换类型为带缩放的变换
fixtureTool.TransformType = CogFixtureTransformTypeConstants.WithScale;
// 配置变换参数
fixtureTool.InputX = 100.0; // X 平移
fixtureTool.InputY = 50.0; // Y 平移
fixtureTool.InputRotation = 30.0; // 旋转 30°
fixtureTool.InputScaleX = 1.05; // X 方向放大 5%
fixtureTool.InputScaleY = 1.05; // Y 方向放大 5%
// 关联并执行
cogFixtureEditV2.Subject = fixtureTool;
fixtureTool.Run();
// 获取变换矩阵
var matrix = fixtureTool.GetTransformMatrix();
Console.WriteLine("变换矩阵:");
Console.WriteLine($" [{matrix[0,0]:F4}, {matrix[0,1]:F4}, {matrix[0,2]:F4}]");
Console.WriteLine($" [{matrix[1,0]:F4}, {matrix[1,1]:F4}, {matrix[1,2]:F4}]");
Console.WriteLine($" [{matrix[2,0]:F4}, {matrix[2,1]:F4}, {matrix[2,2]:F4}]");
2.11.4 将定位工具输出作为夹具输入
csharp
// 典型场景:使用 PMAlign 定位结果驱动夹具变换
CogPMAlignTool pmAlignTool = myPMAlignTool; // 模板匹配工具
CogFixtureTool fixtureTool = new CogFixtureTool();
// 执行定位
pmAlignTool.Run();
if (pmAlignTool.RunStatus == CogToolResultConstants.Accept)
{
// 将定位结果作为夹具输入
var result = pmAlignTool.Results[0];
fixtureTool.InputX = result.GetPose().TranslationX;
fixtureTool.InputY = result.GetPose().TranslationY;
fixtureTool.InputRotation = result.GetPose().Rotation * 180.0 / Math.PI;
// 执行夹具变换
fixtureTool.Run();
// 关联到编辑控件
cogFixtureEditV2.Subject = fixtureTool;
// 输出变换后坐标
Console.WriteLine($"定位坐标: ({result.GetPose().TranslationX:F2}, {result.GetPose().TranslationY:F2})");
Console.WriteLine($"变换坐标: ({fixtureTool.OutputX:F2}, {fixtureTool.OutputY:F2})");
}
2.11.5 序列化/反序列化工具 (保存/加载 .vpp)
csharp
// 保存夹具配置到 .vpp 文件
CogFixtureTool fixtureTool = cogFixtureEditV2.Subject;
string savePath = @"C:\Fixtures\my_fixture.vpp";
fixtureTool.Save(savePath, CogSerializationOptionsConstants.All);
Console.WriteLine($"夹具配置已保存到: {savePath}");
// 从 .vpp 文件加载夹具配置
string loadPath = @"C:\Fixtures\my_fixture.vpp";
CogFixtureTool loadedTool =
(CogFixtureTool)CogSerializer.LoadObjectFromFile(loadPath);
// 关联到编辑控件
cogFixtureEditV2.Subject = loadedTool;
Console.WriteLine($"已加载夹具配置: {loadedTool.TransformName}");
2.11.6 在 ToolGroup 中获取子工具并关联编辑控件
csharp
// 从 ToolGroup 中按名称查找夹具工具
CogToolGroup toolGroup = myToolGroup; // 从流程中获取
// 方法1:按名称查找
CogFixtureTool fixtureTool =
(CogFixtureTool)toolGroup.Tools["CogFixtureTool1"];
// 方法2:按类型遍历查找
CogFixtureTool fixtureTool2 = null;
foreach (ICogTool tool in toolGroup.Tools)
{
if (tool is CogFixtureTool)
{
fixtureTool2 = (CogFixtureTool)tool;
break;
}
}
// 关联到编辑控件
if (fixtureTool != null)
{
cogFixtureEditV2.Subject = fixtureTool;
Console.WriteLine($"已关联工具: {fixtureTool.TransformName}");
}
2.11.7 多级夹具串联(Fixture 链)
csharp
// 场景:多级坐标系变换,如 世界坐标 → 相机坐标 → 工件坐标
CogFixtureTool worldToCamera = new CogFixtureTool();
CogFixtureTool cameraToPart = new CogFixtureTool();
// 第一级:世界坐标 → 相机坐标
worldToCamera.TransformName = "WorldToCamera";
worldToCamera.InputX = 0;
worldToCamera.InputY = 0;
worldToCamera.InputRotation = 0;
worldToCamera.Run();
// 第二级:相机坐标 → 工件坐标(基于定位结果)
cameraToPart.TransformName = "CameraToPart";
cameraToPart.InputX = 150.0; // 定位结果 X
cameraToPart.InputY = 200.0; // 定位结果 Y
cameraToPart.InputRotation = 45.0;
cameraToPart.Run();
// 串联变换:将第二级的输入设为第一级的输出
// 实际应用中,通常在 ToolGroup 中通过数据流自动连接
Console.WriteLine("第一级输出坐标系已建立");
Console.WriteLine("第二级输出坐标系已建立");
Console.WriteLine($"最终工件坐标: ({cameraToPart.OutputX:F2}, {cameraToPart.OutputY:F2})");
// 在编辑控件中可切换查看不同级别的夹具
cogFixtureEditV2.Subject = worldToCamera; // 查看第一级
// cogFixtureEditV2.Subject = cameraToPart; // 查看第二级
2.12 常见问题
2.12.1 Fixture 和 CalibNPointToNPoint 有什么区别?
- Fixture:基于已知的平移/旋转/缩放参数进行坐标变换,参数通常来自定位工具的输出
- CalibNPointToNPoint:通过标定点对建立像素到物理坐标的映射关系
- 两者常配合使用:先用标定建立基础映射,再用 Fixture 补偿工件位置变化
2.12.2 如何选择变换类型?
- 工件仅平移和旋转 → 简单变换 (Simple)
- 工件有尺寸缩放 → 带缩放变换 (WithScale)
- 存在剪切或非均匀形变 → 仿射变换 (Affine)
- 视角倾斜或非平面 → 投影变换 (Projective)
2.12.3 输入坐标从哪里获取?
最常见的方式是将定位工具(如 CogPMAlignTool、CogBlobTool)的输出作为 Fixture 的输入:
csharp
fixtureTool.InputX = pmAlignTool.Results[0].GetPose().TranslationX;
fixtureTool.InputY = pmAlignTool.Results[0].GetPose().TranslationY;
fixtureTool.InputRotation = pmAlignTool.Results[0].GetPose().Rotation * 180.0 / Math.PI;
2.12.4 如何在运行时动态更新变换参数?
csharp
// 动态更新变换参数
fixtureTool.InputX = newX;
fixtureTool.InputY = newY;
fixtureTool.InputRotation = newAngle;
// 重新执行变换
fixtureTool.Run();
// 刷新编辑控件显示
cogFixtureEditV2.Refresh();
2.12.5 如何获取变换矩阵用于自定义计算?
csharp
// 获取 3x3 变换矩阵
double[,] matrix = fixtureTool.GetTransformMatrix();
// 手动应用变换
double inputX = 100, inputY = 200;
double outputX = matrix[0,0] * inputX + matrix[0,1] * inputY + matrix[0,2];
double outputY = matrix[1,0] * inputX + matrix[1,1] * inputY + matrix[1,2];
3.CogCalibNPointToNPointEditV2 --- N点坐标矫正设置窗体控件
| 项目 | 说明 |
|---|---|
| 主要作用 | 提供 N 点标定工具的可视化配置界面,用于像素坐标与物理坐标的映射 |
| 依赖库 | Cognex.VisionPro.CalibFix |
| 关联方式 | CogCalibNPointToNPointEditV2.Subject = CogCalibNPointToNPointTool1; |
| 关联工具类型 | CogCalibNPointToNPointTool |
关键概念:
- 未矫正X/Y:像素坐标
- 原始的已校正X/Y:物理坐标
3.1 引用命名空间与程序集
在使用 CogCalibNPointToNPointEditV2 控件前,需要在项目中添加以下引用:
命名空间:
csharp
using Cognex.VisionPro;
using Cognex.VisionPro.CalibFix;
using Cognex.VisionPro.ToolBlock;
程序集引用:
| 程序集 | 说明 |
|---|---|
Cognex.VisionPro.dll |
VisionPro 核心库 |
Cognex.VisionPro.CalibFix.dll |
N点标定与坐标矫正库 |
Cognex.VisionPro.ToolBlock.dll |
工具块容器库(可选,ToolGroup 场景使用) |
3.2 控件类继承关系
bash
System.Object
└── System.MarshalByRefObject
└── System.ComponentModel.Component
└── System.Windows.Forms.Control
└── System.Windows.Forms.ScrollableControl
└── System.Windows.Forms.ContainerControl
└── System.Windows.Forms.UserControl
└── Cognex.VisionPro.CogCalibNPointToNPointEditV2
CogCalibNPointToNPointEditV2 继承自 UserControl,是一个标准的 WinForms 用户控件,可直接嵌入到任何 WinForms 容器中使用。
3.3 CogCalibNPointToNPointEditV2主要属性
| 属性 | 类型 | 说明 |
|---|---|---|
Subject |
CogCalibNPointToNPointTool |
获取或设置关联的 N 点标定工具对象 |
Dock |
DockStyle |
控件停靠方式,通常设为 DockStyle.Fill |
BorderStyle |
BorderStyle |
边框样式(None/FixedSingle/Fixed3D) |
核心属性详解:
3.3.1 Subject
这是控件最重要的属性,将编辑控件与实际执行标定的工具绑定:
csharp
cogCalibNPointToNPointEditV2.Subject = myCalibTool;
设置后,控件会自动加载工具中的所有标定点对、参数配置,并在界面上显示。
3.4 控件内部区域说明
CogCalibNPointToNPointEditV2 界面主要分为以下功能区域:
3.4.1 区域布局示意
bash
┌─────────────────────────────────────────────────────┐
│ 工具栏区域 (Toolbar) │
│ [运行] [训练] [加载标定文件] [保存标定文件] │
├─────────────────────────────────────────────────────┤
│ │
│ 标定点对列表区域 (Calibration Points List) │
│ ┌────┬──────────┬──────────┬──────────┬──────────┐ │
│ │ # │ 未校正X │ 未校正Y │ 已校正X │ 已校正Y │ │
│ ├────┼──────────┼──────────┼──────────┼──────────┤ │
│ │ 1 │ 100.00 │ 200.00 │ 10.00 │ 20.00 │ │
│ │ 2 │ 300.00 │ 400.00 │ 30.00 │ 40.00 │ │
│ │ ...│ ... │ ... │ ... │ ... │ │
│ └────┴──────────┴──────────┴──────────┴──────────┘ │
│ │
├─────────────────────────────────────────────────────┤
│ 图形显示区域 (Graphics Display) │
│ ┌───────────────────────────────────────────────┐ │
│ │ 标定点对可视化: │ │
│ │ ○ = 像素坐标点(未校正) │ │
│ │ □ = 物理坐标点(已校正) │ │
│ │ 箭头 = 映射关系 │ │
│ └───────────────────────────────────────────────┘ │
│ │
├─────────────────────────────────────────────────────┤
│ 状态/参数区域 (Status / Parameters) │
│ 标定状态:已完成 / 未完成 │
│ 映射类型:有缩放 / 无缩放 / 仿射 / 投影变换 │
│ 残差统计:平均残差 / 最大残差 │
└─────────────────────────────────────────────────────┘
3.4.2 各区域功能说明
| 区域 | 功能 |
|---|---|
| 工具栏区域 | 提供运行标定、训练、加载/保存 .vpp 文件等操作按钮 |
| 标定点对列表 | 以表格形式展示所有像素→物理坐标映射对,支持增删改查 |
| 图形显示区域 | 可视化展示标定点在图像中的分布及映射关系 |
| 状态/参数区域 | 显示标定完成状态、映射类型、残差统计等信息 |
3.5 CogCalibNPointToNPointTool关联工具主要属性
CogCalibNPointToNPointTool 是实际执行标定计算的核心工具:
| 属性 | 类型 | 说明 |
|---|---|---|
RawCalibrationPoints |
CogCalibrationPointCollection |
原始标定点对集合(像素↔物理坐标) |
CalibratedTransform |
ICogTransform2D |
标定完成后生成的坐标变换对象 |
CalibrationStatus |
CogCalibrationStatusConstants |
标定状态(未标定/成功/失败) |
InputImage |
ICogImage |
输入的待标定图像 |
OutputImage |
ICogImage |
标定矫正后的输出图像 |
ComputeCalibration |
bool |
是否重新计算标定 |
LastRunStatus |
CogToolResultConstants |
上次运行结果状态 |
LastRunStatistics |
CogCalibrationStatistics |
上次标定的残差统计数据 |
3.5.1 RawCalibrationPoints 集合详解
标定点对是标定的核心数据,每对包含 4 个值:
UncalibratedX:像素坐标 XUncalibratedY:像素坐标 YCalibratedX:物理坐标 X(mm)CalibratedY:物理坐标 Y(mm)
3.6 CogCalibNPointToNPointRunParams关键运行参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
MappingType |
CogNPointToNPointCalibrationMappingConstants |
--- | 映射类型:无缩放/有缩放/仿射/投影 |
PolynomialOrder |
int |
2 | 多项式阶数(仅多项式映射模式) |
ComputeCalibration |
bool |
true | 是否在运行时重新计算标定 |
ExpectedX |
double |
--- | 预期物理坐标 X(用于验证) |
ExpectedY |
double |
--- | 预期物理坐标 Y(用于验证) |
3.6.1 映射类型说明
| 映射类型 | 最少点数 | 特点 |
|---|---|---|
| 无缩放 (NoScale) | 2 | 仅平移校正,不改变比例 |
| 有缩放 (WithScale) | 2 | 平移+缩放,保持纵横比 |
| 仿射 (Affine) | 3 | 平移+缩放+旋转+剪切 |
| 投影变换 (Projective) | 4 | 完整透视变换,适合非平面场景 |
3.7 CogCalibrationStatistics 标定结果属性
标定完成后的统计信息:
| 属性 | 类型 | 说明 |
|---|---|---|
AverageResidualX |
double |
X 方向平均残差(像素) |
AverageResidualY |
double |
Y 方向平均残差(像素) |
MaxResidualX |
double |
X 方向最大残差(像素) |
MaxResidualY |
double |
Y 方向最大残差(像素) |
PointCount |
int |
参与标定的点对数量 |
CalibrationSucceeded |
bool |
标定是否成功 |
3.7.1 残差评估标准
| 平均残差范围 | 评估 | 建议 |
|---|---|---|
| < 0.5 pixel | 优秀 | 可直接使用 |
| 0.5 ~ 1.0 pixel | 良好 | 一般应用可接受 |
| 1.0 ~ 2.0 pixel | 一般 | 建议增加标定点或检查标定点质量 |
| > 2.0 pixel | 较差 | 需重新标定,检查图像质量或标定点分布 |
3.8 CogCalibNPointToNPointTool主要方法
| 方法 | 说明 |
|---|---|
Run() |
执行标定计算和坐标变换 |
Calibrate() |
仅执行标定计算(不进行坐标变换) |
MapPixelToCalibrated(x, y) |
将像素坐标转换为物理坐标 |
MapCalibratedToPixel(x, y) |
将物理坐标转换为像素坐标 |
Reset() |
重置标定状态,清除所有标定点对 |
Save(string filename) |
保存标定配置到 .vpp 文件 |
Load(string filename) |
从 .vpp 文件加载标定配置 |
3.8.1 方法使用示例
csharp
// 执行标定
myCalibTool.Run();
// 像素坐标转物理坐标
double physX, physY;
myCalibTool.MapPixelToCalibrated(150, 250, out physX, out physY);
// physX ≈ 15.0, physY ≈ 25.0
// 物理坐标转像素坐标
double pixX, pixY;
myCalibTool.MapCalibratedToPixel(15.0, 25.0, out pixX, out pixY);
// pixX ≈ 150, pixY ≈ 250
3.9 CogCalibNPointToNPointTool主要事件
| 事件 | 触发时机 | 说明 |
|---|---|---|
Ran |
工具运行完成后 | 无论成功或失败均触发 |
CalibrationChanged |
标定参数或点对发生变化时 | 可用于触发重新标定 |
StateChanged |
工具状态改变时 | 如从未标定变为已标定 |
3.9.1 事件使用示例
csharp
// 监听运行完成事件
myCalibTool.Ran += (sender, e) =>
{
if (myCalibTool.LastRunStatus == CogToolResultConstants.Accept)
{
Console.WriteLine("标定成功!");
Console.WriteLine($"平均残差X: {myCalibTool.LastRunStatistics.AverageResidualX:F3}");
Console.WriteLine($"平均残差Y: {myCalibTool.LastRunStatistics.AverageResidualY:F3}");
}
else
{
Console.WriteLine("标定失败!");
}
};
3.10 使用方法
3.10.1 使用流程
- 添加引用 → 引入
Cognex.VisionPro.CalibFix程序集 - 放置控件 → 在 WinForms 窗体上放置
CogCalibNPointToNPointEditV2 - 创建工具 → 实例化
CogCalibNPointToNPointTool - 关联控件 → 设置
EditV2.Subject = tool - 添加标定点 → 至少添加满足映射类型要求的最少点数
- 配置参数 → 选择映射类型等参数
- 执行标定 → 调用
Run()或通过控件界面运行 - 验证结果 → 检查残差统计,确认标定质量
- 使用标定 → 通过
MapPixelToCalibrated进行坐标转换
3.11 示例代码
3.11.1 基本关联与使用
csharp
// 创建标定工具并关联到编辑控件
CogCalibNPointToNPointTool calibTool = new CogCalibNPointToNPointTool();
cogCalibNPointToNPointEditV2.Subject = calibTool;
// 添加标定点对(像素坐标 → 物理坐标)
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.Run();
if (calibTool.CalibrationStatus == CogCalibrationStatusConstants.Calibrated)
{
MessageBox.Show("标定成功!");
}
3.11.2 动态切换工具对象
csharp
// 在运行时动态切换关联的标定工具
public void SwitchCalibrationTool(CogCalibNPointToNPointTool newTool)
{
cogCalibNPointToNPointEditV2.Subject = newTool;
// 刷新显示
cogCalibNPointToNPointEditV2.Refresh();
Console.WriteLine($"已切换到新标定工具,包含 {newTool.RawCalibrationPoints.Count} 个标定点");
}
3.11.3 配置映射类型后执行标定
csharp
CogCalibNPointToNPointTool calibTool = new CogCalibNPointToNPointTool();
// 设置映射类型为仿射变换
calibTool.MappingType = CogNPointToNPointCalibrationMappingConstants.Affine;
// 添加足够的标定点(仿射至少需要 3 个点)
calibTool.RawCalibrationPoints.Add(100, 100, 0, 0);
calibTool.RawCalibrationPoints.Add(500, 100, 40, 0);
calibTool.RawCalibrationPoints.Add(100, 500, 0, 40);
calibTool.RawCalibrationPoints.Add(500, 500, 40, 40); // 额外点提高精度
// 关联并执行
cogCalibNPointToNPointEditV2.Subject = calibTool;
calibTool.Run();
// 检查结果
if (calibTool.LastRunStatus == CogToolResultConstants.Accept)
{
var stats = calibTool.LastRunStatistics;
Console.WriteLine($"标定点数: {stats.PointCount}");
Console.WriteLine($"平均残差: X={stats.AverageResidualX:F4}, Y={stats.AverageResidualY:F4}");
}
3.11.4 坐标转换与结果叠加到CogDisplay
csharp
// 执行标定后,将转换结果叠加到 CogDisplay
CogCalibNPointToNPointTool calibTool = cogCalibNPointToNPointEditV2.Subject;
calibTool.Run();
if (calibTool.CalibrationStatus == CogCalibrationStatusConstants.Calibrated)
{
// 获取矫正后的图像
cogDisplay1.Image = calibTool.OutputImage;
// 创建图形叠加
CogGraphicCollection graphics = new CogGraphicCollection();
// 在每个标定点位置绘制标记
foreach (CogCalibrationPoint point in calibTool.RawCalibrationPoints)
{
// 像素坐标位置(红色十字)
CogCrossMarker pixelMarker = new CogCrossMarker();
pixelMarker.X = point.UncalibratedX;
pixelMarker.Y = point.UncalibratedY;
pixelMarker.Color = CogColorConstants.Red;
pixelMarker.SizeInScreenPixels = 10;
graphics.Add(pixelMarker);
// 物理坐标转换后的位置(绿色十字)
double mapX, mapY;
calibTool.MapCalibratedToPixel(point.CalibratedX, point.CalibratedY, out mapX, out mapY);
CogCrossMarker mappedMarker = new CogCrossMarker();
mappedMarker.X = mapX;
mappedMarker.Y = mapY;
mappedMarker.Color = CogColorConstants.Green;
mappedMarker.SizeInScreenPixels = 8;
graphics.Add(mappedMarker);
}
// 叠加到显示控件
cogDisplay1.StaticGraphics.AddList(graphics, "CalibResult");
}
3.11.5 序列化/反序列化工具(保存/加载 .vpp)
csharp
// 保存标定配置到 .vpp 文件
CogCalibNPointToNPointTool calibTool = cogCalibNPointToNPointEditV2.Subject;
calibTool.Run();
if (calibTool.CalibrationStatus == CogCalibrationStatusConstants.Calibrated)
{
string savePath = @"C:\Calibration\my_calibration.vpp";
calibTool.Save(savePath, CogSerializationOptionsConstants.All);
Console.WriteLine($"标定配置已保存到: {savePath}");
}
// 从 .vpp 文件加载标定配置
string loadPath = @"C:\Calibration\my_calibration.vpp";
CogCalibNPointToNPointTool loadedTool =
(CogCalibNPointToNPointTool)CogSerializer.LoadObjectFromFile(loadPath);
// 关联到编辑控件
cogCalibNPointToNPointEditV2.Subject = loadedTool;
Console.WriteLine($"已加载标定配置,包含 {loadedTool.RawCalibrationPoints.Count} 个标定点");
3.11.6 在 ToolGroup中获取子工具并关联编辑控件
csharp
// 假设已有一个 ToolGroup 包含标定工具
CogToolGroup toolGroup = myToolGroup; // 从流程中获取
// 方法1:按名称查找
CogCalibNPointToNPointTool calibTool =
(CogCalibNPointToNPointTool)toolGroup.Tools["CogCalibNPointToNPointTool1"];
// 方法2:按类型遍历查找
CogCalibNPointToNPointTool calibTool2 = null;
foreach (ICogTool tool in toolGroup.Tools)
{
if (tool is CogCalibNPointToNPointTool)
{
calibTool2 = (CogCalibNPointToNPointTool)tool;
break;
}
}
// 关联到编辑控件
if (calibTool != null)
{
cogCalibNPointToNPointEditV2.Subject = calibTool;
Console.WriteLine($"已关联工具: {calibTool.Name}");
}
3.12 常见问题
3.12.1标定点最少需要几个?
取决于映射类型:无缩放/有缩放需要 2 个,仿射需要 3 个,投影变换需要 4 个。实际使用中建议至少添加 6~9 个点以提高精度。
3.12.2 如何提高标定精度?
- 增加标定点数量,且分布尽量覆盖整个视野
- 确保标定点定位准确(使用亚像素精度)
- 使用高质量的标定板
- 选择合适的映射类型
3.12.3 标定后坐标转换误差大怎么办?
- 检查标定点是否有误差较大的异常点
- 确认映射类型是否适合应用场景
- 重新拍摄标定图像,确保图像质量
- 增加标定点数量并改善分布
3.12.4 如何在运行时动态添加标定点?
csharp
// 动态添加标定点
calibTool.RawCalibrationPoints.Add(pixelX, pixelY, physX, physY);
// 重新执行标定
calibTool.Run();
// 刷新编辑控件显示
cogCalibNPointToNPointEditV2.Refresh();
4.CogFindCircleEditV2---查找圆设置窗体控件
| 项目 | 说明 |
|---|---|
| 主要作用 | 提供查找圆工具的可视化配置界面,用于在图像中检测圆形特征并拟合圆 |
| 依赖库 | Cognex.VisionPro.Caliper |
| 关联方式 | CogFindCircleEditV2.Subject = CogFindCircleTool1; |
| 关联工具类型 | CogFindCircleTool |
关键概念:
- 查找圆:通过边缘检测(卡尺工具)在指定搜索区域内找到边缘点,再用最小二乘法拟合圆
- 搜索区域:通常为环形或扇形区域,在该区域内进行边缘检测
- 边缘点:图像中灰度值突变的位置,是圆拟合的基础数据
4.1 引用命名空间与程序集
在使用 CogFindCircleEditV2 控件前,需要在项目中添加以下引用:
命名空间:
csharp
using Cognex.VisionPro;
using Cognex.VisionPro.Caliper;
using Cognex.VisionPro.ToolBlock;
程序集引用:
| 程序集 | 说明 |
|---|---|
Cognex.VisionPro.dll |
VisionPro 核心库 |
Cognex.VisionPro.Caliper.dll |
卡尺工具与边缘检测库 |
Cognex.VisionPro.ToolBlock.dll |
工具块容器库(可选,ToolGroup 场景使用) |
4.2 控件类继承关系
bash
System.Object
└── System.MarshalByRefObject
└── System.ComponentModel.Component
└── System.Windows.Forms.Control
└── System.Windows.Forms.ScrollableControl
└── System.Windows.Forms.ContainerControl
└── System.Windows.Forms.UserControl
└── Cognex.VisionPro.CogFindCircleEditV2
CogFindCircleEditV2 继承自 UserControl,是一个标准的 WinForms 用户控件,可直接嵌入到任何 WinForms 容器中使用。
4.3 CogFindCircleEditV2主要属性
| 属性 | 类型 | 说明 |
|---|---|---|
Subject |
CogFindCircleTool |
获取或设置关联的查找圆工具对象 |
Dock |
DockStyle |
控件停靠方式,通常设为 DockStyle.Fill |
BorderStyle |
BorderStyle |
边框样式(None/FixedSingle/Fixed3D) |
核心属性详解:
4.3.1 Subject
这是控件最重要的属性,将编辑控件与实际执行圆查找的工具绑定:
csharp
cogFindCircleEditV2.Subject = myFindCircleTool;
设置后,控件会自动加载工具中的所有搜索区域、边缘检测参数及结果,并在界面上显示。
4.4 控件内部区域说明
CogFindCircleEditV2 界面主要分为以下功能区域:
4.4.1 区域布局示意
bash
┌─────────────────────────────────────────────────────┐
│ 工具栏区域 (Toolbar) │
│ [运行] [加载配置] [保存配置] │
├─────────────────────────────────────────────────────┤
│ 图形显示区域 (Graphics Display) │
│ ┌───────────────────────────────────────────────┐ │
│ │ │ │
│ │ ╭─── 搜索区域(环形/扇形)───╮ │ │
│ │ ╱ · · · · · · · · · · · · ╲ │ │
│ │ │ · 检测到的边缘点(绿色) · │ │ │
│ │ │ · · · · · · · · · · · │ │ │
│ │ ╲ 拟合圆(黄色实线) ╱ │ │
│ │ ╰─────────────────────────╯ │ │
│ │ 圆心坐标 (红十字标记) │ │
│ │ │ │
│ └───────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────┤
│ 参数配置区域 (Parameters) │
│ ┌───────────────────────────────────────────────┐ │
│ │ 边缘极性: [暗到亮 / 亮到暗 / 任意 ▼] │ │
│ │ 边缘阈值: [ 10 ] │ │
│ │ 滤波核大小: [ 3 ] │ │
│ │ 卡尺数量: [ 20 ] │ │
│ │ 搜索模式: [完整圆 / 圆弧 ▼] │ │
│ └───────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────┤
│ 结果显示区域 (Result) │
│ 圆心: (X=150.00, Y=200.00) 半径: 50.00 │
│ 拟合分数: 0.95 边缘点数: 18/20 │
│ 状态: 成功 │
└─────────────────────────────────────────────────────┘
4.4.2 各区域功能说明
| 区域 | 功能 |
|---|---|
| 工具栏区域 | 提供运行、加载/保存 .vpp 文件等操作按钮 |
| 图形显示区域 | 可视化展示搜索区域、检测到的边缘点、拟合圆和圆心位置 |
| 参数配置区域 | 配置边缘检测参数:极性、阈值、滤波核、卡尺数量、搜索模式 |
| 结果显示区域 | 显示圆心坐标、半径、拟合分数、边缘点数和运行状态 |
4.5 CogFindCircleTool 关联工具主要属性
CogFindCircleTool 是实际执行圆查找的核心工具:
| 属性 | 类型 | 说明 |
|---|---|---|
InputImage |
ICogImage |
输入图像 |
Region |
ICogRegion |
搜索区域(环形/扇形) |
Results |
CogFindCircleResults |
圆查找结果集合 |
RunStatus |
CogToolResultConstants |
运行状态 |
EdgePolarity |
CogFindCircleEdgePolarityConstants |
边缘极性设置 |
EdgeThreshold |
double |
边缘阈值 |
FilterKernelSize |
int |
滤波核大小 |
NumCalipers |
int |
卡尺数量 |
CaliperSearchLength |
double |
卡尺搜索长度 |
CaliperSearchDirection |
CogFindCircleSearchDirectionConstants |
卡尺搜索方向 |
ExpectedCircularArc |
CogCircularArc |
预期圆弧(用于约束搜索) |
4.5.1 Results结果集合详解
CogFindCircleResults 包含以下关键信息:
GetCircle():获取拟合的圆对象(圆心+半径)GetFoundEdgePoints():获取检测到的边缘点集合GetScore():获取拟合分数(0~1)GetNumPointsFound():获取找到的边缘点数量GetNumPointsUsed():获取参与拟合的边缘点数量
4.6 CogFindCircleRunParams 关键运行参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
EdgePolarity |
CogFindCircleEdgePolarityConstants |
DarkToLight | 边缘极性:暗到亮/亮到暗/任意 |
EdgeThreshold |
double |
10 | 边缘阈值,控制边缘检测灵敏度 |
FilterKernelSize |
int |
3 | 滤波核大小(3/5/7),越大越抗噪但可能丢失细节 |
NumCalipers |
int |
20 | 卡尺数量,决定边缘点采样密度 |
CaliperSearchLength |
double |
100 | 卡尺搜索长度(像素) |
CaliperProjectionLength |
double |
1 | 卡尺投影长度(像素) |
SearchDirection |
CogFindCircleSearchDirectionConstants |
Inward | 搜索方向:向内/向外 |
RejectDistance |
double |
2.0 | 拒绝距离,超出此距离的边缘点不参与拟合 |
NumIterations |
int |
3 | 迭代次数,越多越精确但耗时更长 |
CircularArcMode |
bool |
false | 是否使用圆弧模式(限制搜索角度范围) |
StartAngle |
double |
0 | 圆弧起始角度(度) |
SweepAngle |
double |
360 | 圆弧扫过角度(度) |
4.6.1 边缘极性说明
| 极性类型 | 说明 | 适用场景 |
|---|---|---|
| DarkToLight | 暗→亮边缘 | 深色背景上的亮色圆 |
| LightToDark | 亮→暗边缘 | 亮色背景上的深色圆 |
| Any | 任意方向 | 不确定边缘方向时使用 |
4.6.2 搜索方向说明
| 方向 | 说明 |
|---|---|
| Inward (向内) | 从搜索区域外侧向内侧搜索边缘 |
| Outward (向外) | 从搜索区域内侧向外侧搜索边缘 |
4.7 CogFindCircleResult 结果属性
单次圆查找的结果信息:
| 属性 | 类型 | 说明 |
|---|---|---|
X |
double |
拟合圆的圆心 X 坐标 |
Y |
double |
拟合圆的圆心 Y 坐标 |
Radius |
double |
拟合圆的半径 |
Score |
double |
拟合分数(0~1),越高越好 |
NumPointsFound |
int |
检测到的边缘点总数 |
NumPointsUsed |
int |
参与圆拟合的边缘点数 |
Residual |
double |
拟合残差(边缘点到拟合圆的距离均方根) |
GetCircle() |
CogCircle |
获取拟合的圆对象 |
GetFoundEdgePoints() |
CogPoint2DCollection |
获取所有检测到的边缘点 |
GetUsedEdgePoints() |
CogPoint2DCollection |
获取参与拟合的边缘点 |
4.7.1 结果评估标准
| 评估项 | 优秀 | 良好 | 一般 | 较差 |
|---|---|---|---|---|
| 拟合分数 | > 0.9 | 0.7 ~ 0.9 | 0.5 ~ 0.7 | < 0.5 |
| 边缘点利用率 | > 90% | 70% ~ 90% | 50% ~ 70% | < 50% |
| 拟合残差 | < 0.5 pixel | 0.5 ~ 1.0 pixel | 1.0 ~ 2.0 pixel | > 2.0 pixel |
4.8 CogFindCircleTool主要方法
| 方法 | 说明 |
|---|---|
Run() |
执行圆查找操作 |
CreateDefaultRegion() |
创建默认的圆形搜索区域 |
SetRegionFromCircle(CogCircle) |
从已知圆设置搜索区域 |
Save(string filename) |
保存工具配置到 .vpp 文件 |
Load(string filename) |
从 .vpp 文件加载工具配置 |
4.8.1 方法使用示例
csharp
// 执行圆查找
myFindCircleTool.Run();
// 获取结果
var result = myFindCircleTool.Results;
if (result != null)
{
CogCircle circle = result.GetCircle();
Console.WriteLine($"圆心: ({circle.CenterX:F2}, {circle.CenterY:F2})");
Console.WriteLine($"半径: {circle.Radius:F2}");
Console.WriteLine($"分数: {result.GetScore():F2}");
}
4.9 CogFindCircleTool主要事件
| 事件 | 触发时机 | 说明 |
|---|---|---|
Ran |
工具运行完成后 | 无论成功或失败均触发 |
RegionChanged |
搜索区域发生变化时 | 可用于同步更新图形显示 |
ParamsChanged |
参数发生变化时 | 可用于实时预览效果 |
4.9.1 事件使用示例
csharp
// 监听运行完成事件
myFindCircleTool.Ran += (sender, e) =>
{
if (myFindCircleTool.RunStatus == CogToolResultConstants.Accept)
{
var result = myFindCircleTool.Results;
Console.WriteLine("圆查找成功!");
Console.WriteLine($"圆心: ({result.X:F2}, {result.Y:F2})");
Console.WriteLine($"半径: {result.Radius:F2}");
Console.WriteLine($"边缘点: {result.NumPointsUsed}/{result.NumPointsFound}");
}
else
{
Console.WriteLine("圆查找失败!");
}
};
4.10 使用方法
4.10.1 使用流程
- 添加引用 → 引入
Cognex.VisionPro.Caliper程序集 - 放置控件 → 在 WinForms 窗体上放置
CogFindCircleEditV2 - 创建工具 → 实例化
CogFindCircleTool - 关联控件 → 设置
EditV2.Subject = tool - 设置输入图像 → 将待检测图像赋给
InputImage - 配置搜索区域 → 在控件界面或代码中定义环形/扇形搜索区域
- 配置边缘参数 → 设置极性、阈值、卡尺数量等
- 执行查找 → 调用
Run()或通过控件界面运行 - 分析结果 → 查看圆心、半径、拟合分数、边缘点分布
4.11 示例代码
4.11.1 基本关联与使用
csharp
// 创建查找圆工具并关联到编辑控件
CogFindCircleTool findCircleTool = new CogFindCircleTool();
cogFindCircleEditV2.Subject = findCircleTool;
// 设置输入图像
findCircleTool.InputImage = myCogImage; // 来自图像采集或文件
// 执行圆查找
findCircleTool.Run();
// 获取结果
if (findCircleTool.RunStatus == CogToolResultConstants.Accept)
{
var result = findCircleTool.Results;
MessageBox.Show($"找到圆!圆心: ({result.X:F2}, {result.Y:F2}), 半径: {result.Radius:F2}");
}
4.11.2 动态切换工具对象
csharp
// 在运行时动态切换关联的查找圆工具
public void SwitchFindCircleTool(CogFindCircleTool newTool)
{
cogFindCircleEditV2.Subject = newTool;
// 刷新显示
cogFindCircleEditV2.Refresh();
Console.WriteLine("已切换到新查找圆工具");
}
4.11.3 配置搜索区域与边缘参数后执行
csharp
CogFindCircleTool findCircleTool = new CogFindCircleTool();
// 设置输入图像
findCircleTool.InputImage = myCogImage;
// 创建环形搜索区域
CogCircularAnnulusSection region = new CogCircularAnnulusSection();
region.CenterX = 320; // 圆心 X
region.CenterY = 240; // 圆心 Y
region.InnerRadius = 40; // 内半径
region.OuterRadius = 80; // 外半径
region.StartAngle = 0; // 起始角度
region.SweepAngle = 360; // 扫过角度(完整圆)
findCircleTool.Region = region;
// 配置边缘参数
findCircleTool.EdgePolarity = CogFindCircleEdgePolarityConstants.DarkToLight;
findCircleTool.EdgeThreshold = 15;
findCircleTool.FilterKernelSize = 5;
findCircleTool.NumCalipers = 30;
// 关联并执行
cogFindCircleEditV2.Subject = findCircleTool;
findCircleTool.Run();
// 检查结果
if (findCircleTool.RunStatus == CogToolResultConstants.Accept)
{
var result = findCircleTool.Results;
Console.WriteLine($"圆心: ({result.X:F2}, {result.Y:F2})");
Console.WriteLine($"半径: {result.Radius:F2}");
Console.WriteLine($"拟合分数: {result.GetScore():F2}");
Console.WriteLine($"边缘点: {result.NumPointsUsed}/{result.NumPointsFound}");
}
4.11.4 将查找结果图形叠加到 CogDisplay
csharp
// 执行圆查找后,将结果叠加到 CogDisplay
CogFindCircleTool findCircleTool = cogFindCircleEditV2.Subject;
findCircleTool.Run();
if (findCircleTool.RunStatus == CogToolResultConstants.Accept)
{
// 显示输入图像
cogDisplay1.Image = findCircleTool.InputImage;
// 创建图形叠加
CogGraphicCollection graphics = new CogGraphicCollection();
var result = findCircleTool.Results;
// 绘制拟合圆(黄色)
CogCircle fittedCircle = result.GetCircle();
fittedCircle.Color = CogColorConstants.Yellow;
fittedCircle.LineWidthInScreenPixels = 2;
graphics.Add(fittedCircle);
// 绘制圆心(红色十字)
CogCrossMarker centerMarker = new CogCrossMarker();
centerMarker.X = result.X;
centerMarker.Y = result.Y;
centerMarker.Color = CogColorConstants.Red;
centerMarker.SizeInScreenPixels = 15;
graphics.Add(centerMarker);
// 绘制边缘点(绿色小圆点)
CogPoint2DCollection edgePoints = result.GetUsedEdgePoints();
foreach (var point in edgePoints)
{
CogPointMarker edgeMarker = new CogPointMarker();
edgeMarker.X = point.X;
edgeMarker.Y = point.Y;
edgeMarker.Color = CogColorConstants.Green;
edgeMarker.SizeInScreenPixels = 4;
graphics.Add(edgeMarker);
}
// 叠加到显示控件
cogDisplay1.StaticGraphics.AddList(graphics, "FindCircleResult");
}
4.11.5 序列化/反序列化工具(保存/加载 .vpp)
csharp
// 保存查找圆配置到 .vpp 文件
CogFindCircleTool findCircleTool = cogFindCircleEditV2.Subject;
string savePath = @"C:\Tools\my_findcircle.vpp";
findCircleTool.Save(savePath, CogSerializationOptionsConstants.All);
Console.WriteLine($"查找圆配置已保存到: {savePath}");
// 从 .vpp 文件加载查找圆配置
string loadPath = @"C:\Tools\my_findcircle.vpp";
CogFindCircleTool loadedTool =
(CogFindCircleTool)CogSerializer.LoadObjectFromFile(loadPath);
// 关联到编辑控件
cogFindCircleEditV2.Subject = loadedTool;
Console.WriteLine("已加载查找圆配置");
4.11.6 在 ToolGroup 中获取子工具并关联编辑控件
csharp
// 从 ToolGroup 中按名称查找查找圆工具
CogToolGroup toolGroup = myToolGroup; // 从流程中获取
// 方法1:按名称查找
CogFindCircleTool findCircleTool =
(CogFindCircleTool)toolGroup.Tools["CogFindCircleTool1"];
// 方法2:按类型遍历查找
CogFindCircleTool findCircleTool2 = null;
foreach (ICogTool tool in toolGroup.Tools)
{
if (tool is CogFindCircleTool)
{
findCircleTool2 = (CogFindCircleTool)tool;
break;
}
}
// 关联到编辑控件
if (findCircleTool != null)
{
cogFindCircleEditV2.Subject = findCircleTool;
Console.WriteLine($"已关联工具: {findCircleTool.Name}");
}
4.11.7 多圆检测与结果筛选
csharp
// 场景:检测多个圆并按大小筛选
CogFindCircleTool findCircleTool = new CogFindCircleTool();
findCircleTool.InputImage = myCogImage;
// 设置搜索区域(覆盖整个视野)
CogCircularAnnulusSection region = new CogCircularAnnulusSection();
region.CenterX = 320;
region.CenterY = 240;
region.InnerRadius = 10;
region.OuterRadius = 300;
region.StartAngle = 0;
region.SweepAngle = 360;
findCircleTool.Region = region;
// 配置参数
findCircleTool.EdgePolarity = CogFindCircleEdgePolarityConstants.Any;
findCircleTool.EdgeThreshold = 10;
findCircleTool.NumCalipers = 50;
findCircleTool.RejectDistance = 1.5; // 更严格的拒绝距离
// 执行
findCircleTool.Run();
// 分析结果
if (findCircleTool.RunStatus == CogToolResultConstants.Accept)
{
var result = findCircleTool.Results;
// 筛选条件:半径在 30~100 像素之间,拟合分数 > 0.8
if (result.Radius >= 30 && result.Radius <= 100 && result.GetScore() > 0.8)
{
Console.WriteLine($"有效圆: 中心({result.X:F2}, {result.Y:F2}), 半径{result.Radius:F2}");
// 检查边缘点分布均匀性
double utilization = (double)result.NumPointsUsed / result.NumPointsFound * 100;
Console.WriteLine($"边缘点利用率: {utilization:F1}%");
if (utilization < 70)
{
Console.WriteLine("警告:边缘点分布不均匀,圆可能被遮挡或存在干扰");
}
}
}
4.12 常见问题
4.12.1 如何选择合适的边缘阈值?
- 阈值过低:噪声会被误检为边缘,导致拟合不准确
- 阈值过高:真实边缘可能被遗漏,边缘点不足
- 建议:从默认值 10 开始,根据图像对比度调整。高对比度图像可适当提高,低对比度图像需降低
4.12.2 卡尺数量设多少合适?
- 少(10~15):速度快,但拟合精度较低
- 中(20~30):速度与精度平衡,推荐大多数场景
- 多(40~60):精度高,但速度较慢
- 经验值:圆周长(像素)/ 10 ≈ 最少卡尺数
4.12.3 搜索区域如何设置?
- 内半径:应略小于预期圆的半径
- 外半径:应略大于预期圆的半径
- 起始/扫过角度:如果圆不完整(如被遮挡),可设置为圆弧模式,只搜索可见部分
4.12.4 边缘点利用率低怎么办?
- 检查搜索区域是否覆盖了圆的完整部分
- 降低边缘阈值以检测更多边缘
- 检查图像中是否有干扰(如其他边缘、纹理)
- 调整边缘极性设置
- 增加卡尺数量
4.12.5 如何提高圆检测的鲁棒性?
csharp
// 1. 增加迭代次数
findCircleTool.NumIterations = 5;
// 2. 使用适当的拒绝距离排除异常点
findCircleTool.RejectDistance = 1.5;
// 3. 使用圆弧模式避免遮挡区域
findCircleTool.CircularArcMode = true;
findCircleTool.StartAngle = 0;
findCircleTool.SweepAngle = 270; // 只搜索 270°
// 4. 使用滤波核平滑噪声
findCircleTool.FilterKernelSize = 5;
4.12.6 如何在运行时动态调整搜索区域?
csharp
// 根据前一次结果动态调整搜索区域
findCircleTool.Run();
if (findCircleTool.RunStatus == CogToolResultConstants.Accept)
{
var prevResult = findCircleTool.Results;
// 以前一次圆心为中心,创建新的搜索区域
CogCircularAnnulusSection newRegion = new CogCircularAnnulusSection();
newRegion.CenterX = prevResult.X;
newRegion.CenterY = prevResult.Y;
newRegion.InnerRadius = prevResult.Radius * 0.8; // 内半径 = 80% 半径
newRegion.OuterRadius = prevResult.Radius * 1.2; // 外半径 = 120% 半径
newRegion.StartAngle = 0;
newRegion.SweepAngle = 360;
findCircleTool.Region = newRegion;
findCircleTool.Run(); // 重新执行
}
5.CogAcqFifoEditV2---图像采集设置窗体控件
| 项目 | 说明 |
|---|---|
| 主要作用 | 提供图像采集(AcqFifo)工具的可视化配置界面,用于管理相机硬件、采集参数和图像获取 |
| 依赖库 | Cognex.VisionPro.Caliper(基础)、Cognex.VisionPro.ImageFile(文件采集)、相机专用驱动 |
| 关联方式 | CogAcqFifoEditV2.Subject = CogAcqFifoTool1; |
| 关联工具类型 | CogAcqFifoTool |
关键概念:
- AcqFifo(采集队列):管理图像采集的先进先出缓冲区,支持从相机、图像文件或仿真源获取图像
- 采集源:物理相机(GigE Vision、USB3 Vision、Camera Link)、图像文件、仿真图像
- 触发模式:连续采集、软件触发、硬件触发
5.1 引用命名空间与程序集
在使用 CogAcqFifoEditV2 控件前,需要在项目中添加以下引用:
命名空间:
csharp
using Cognex.VisionPro;
using Cognex.VisionPro.ImageFile;
using Cognex.VisionPro.ToolBlock;
// 相机专用命名空间(根据硬件选择)
// using Cognex.VisionPro.GigE;
// using Cognex.VisionPro.USB3Vision;
// using Cognex.VisionPro.CameraLink;
程序集引用:
| 程序集 | 说明 |
|---|---|
Cognex.VisionPro.dll |
VisionPro 核心库 |
Cognex.VisionPro.ImageFile.dll |
图像文件采集库(支持 BMP/JPEG/TIFF/PNG 等) |
Cognex.VisionPro.GigE.dll |
GigE Vision 相机驱动(可选) |
Cognex.VisionPro.USB3Vision.dll |
USB3 Vision 相机驱动(可选) |
Cognex.VisionPro.ToolBlock.dll |
工具块容器库(可选,ToolGroup 场景使用) |
5.2 控件类继承关系
bash
System.Object
└── System.MarshalByRefObject
└── System.ComponentModel.Component
└── System.Windows.Forms.Control
└── System.Windows.Forms.ScrollableControl
└── System.Windows.Forms.ContainerControl
└── System.Windows.Forms.UserControl
└── Cognex.VisionPro.CogAcqFifoEditV2
CogAcqFifoEditV2 继承自 UserControl,是一个标准的 WinForms 用户控件,可直接嵌入到任何 WinForms 容器中使用。
5.3 CogAcqFifoEditV2主要属性
| 属性 | 类型 | 说明 |
|---|---|---|
Subject |
CogAcqFifoTool |
获取或设置关联的图像采集工具对象 |
Dock |
DockStyle |
控件停靠方式,通常设为 DockStyle.Fill |
BorderStyle |
BorderStyle |
边框样式(None/FixedSingle/Fixed3D) |
核心属性详解:
5.3.1 Subject
这是控件最重要的属性,将编辑控件与实际执行图像采集的工具绑定:
csharp
cogAcqFifoEditV2.Subject = myAcqFifoTool;
设置后,控件会自动加载工具中的采集源配置、相机参数及采集状态,并在界面上显示。
5.4 控件内部区域说明
CogAcqFifoEditV2 界面主要分为以下功能区域:
5.4.1 区域布局示意
bash
┌─────────────────────────────────────────────────────┐
│ 工具栏区域 (Toolbar) │
│ [采集单帧] [连续采集] [停止] [配置相机] │
├─────────────────────────────────────────────────────┤
│ 采集源选择区域 (Acquisition Source) │
│ ┌───────────────────────────────────────────────┐ │
│ │ 采集源类型: [GigE相机 / USB3 / 文件 ▼] │ │
│ │ 设备列表: [相机型号列表 ▼] │ │
│ │ 连接状态: ● 已连接 / ○ 未连接 │ │
│ └───────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────┤
│ 图像预览区域 (Image Preview) │
│ ┌───────────────────────────────────────────────┐ │
│ │ │ │
│ │ 采集到的图像实时预览 │ │
│ │ │ │
│ │ │ │
│ └───────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────┤
│ 采集参数区域 (Acquisition Parameters) │
│ ┌───────────────────────────────────────────────┐ │
│ │ 触发模式: [连续 / 软触发 / 硬触发 ▼] │ │
│ │ 曝光时间: [ 10000 ] μs │ │
│ │ 增益: [ 0 ] dB │ │
│ │ 帧率: [ 30 ] fps │ │
│ │ 图像格式: [Mono8 / RGB24 / Bayer ▼] │ │
│ │ 图像宽度: [ 1920 ] │ │
│ │ 图像高度: [ 1080 ] │ │
│ └───────────────────────────────────────────────┘ │
├─────────────────────────────────────────────────────┤
│ 状态区域 (Status) │
│ 已采集帧数: 125 采集状态: 运行中 │
│ 采集耗时: 33ms 丢帧数: 0 │
└─────────────────────────────────────────────────────┘
5.4.2 各区域功能说明
| 区域 | 功能 |
|---|---|
| 工具栏区域 | 提供单帧采集、连续采集、停止、相机配置等操作按钮 |
| 采集源选择区域 | 选择采集源类型(相机/文件/仿真),管理设备连接状态 |
| 图像预览区域 | 实时显示采集到的图像,支持缩放和拖拽查看 |
| 采集参数区域 | 配置曝光、增益、帧率、触发模式、图像尺寸等参数 |
| 状态区域 | 显示已采集帧数、采集状态、耗时、丢帧数等统计信息 |
5.5 CogAcqFifoTool关联工具主要属性
CogAcqFifoTool 是实际执行图像采集的核心工具:
| 属性 | 类型 | 说明 |
|---|---|---|
AcqFifo |
CogAcqFifo |
采集队列对象,管理硬件通信和图像缓冲 |
OutputImage |
ICogImage |
最新采集到的输出图像 |
Operator |
ICogAcqFifo |
底层采集算子(相机驱动或文件读取器) |
RunStatus |
CogToolResultConstants |
运行状态(Accept/Fail) |
LastRunTimeMs |
double |
上次采集耗时(毫秒) |
Subject |
ICogImage |
采集到的图像(等同于 OutputImage) |
FrameCount |
long |
已采集的总帧数 |
TriggerMode |
CogAcqFifoTriggerModeConstants |
触发模式 |
AcqState |
CogAcqStateConstants |
采集状态(Idle/Acquiring/Waiting) |
5.5.1 AcqFifo 采集队列详解
CogAcqFifo 是核心采集管理对象:
- 缓冲区管理:维护图像帧的先进先出队列
- 硬件控制:与相机驱动通信,控制采集参数
- 触发管理:支持连续、软件触发、硬件触发等模式
- 超时控制:防止采集卡死
5.6 CogAcqFifoRunParams关键运行参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
TriggerMode |
CogAcqFifoTriggerModeConstants |
--- | 触发模式 |
Exposure |
double |
10000 | 曝光时间(微秒) |
Gain |
double |
0 | 增益(dB) |
FrameRate |
double |
30 | 目标帧率(fps) |
ImageWidth |
int |
1920 | 采集图像宽度(像素) |
ImageHeight |
int |
1080 | 采集图像高度(像素) |
PixelFormat |
CogImagePixelFormatConstants |
Mono8 | 像素格式 |
Timeout |
double |
5000 | 采集超时时间(毫秒) |
NumBuffers |
int |
3 | 图像缓冲区数量 |
AcquireContinuous |
bool |
false | 是否连续采集 |
5.6.1 触发模式说明
| 触发模式 | 说明 | 适用场景 |
|---|---|---|
| FreeRun (连续) | 相机以固定帧率持续采集 | 实时监控、连续检测 |
| Software (软触发) | 通过代码调用触发采集 | 定时检测、流程控制触发 |
| Hardware (硬触发) | 通过外部IO信号触发采集 | 运动控制联动、光电传感器触发 |
5.6.2 像素格式说明
| 格式 | 说明 | 通道数 | 适用场景 |
|---|---|---|---|
| Mono8 | 8位灰度图 | 1 | 通用检测、边缘/形状分析 |
| RGB24 | 24位真彩色 | 3 | 颜色检测、分类 |
| BayerRG8 | Bayer 格式原始数据 | 1 | 需要后续去马赛克处理 |
| Mono16 | 16位高动态范围灰度 | 1 | 高精度测量、低对比度场景 |
5.7 CogAcqFifoResult采集结果属性
单次采集的结果信息:
| 属性 | 类型 | 说明 |
|---|---|---|
OutputImage |
ICogImage |
采集到的图像对象 |
ImageWidth |
int |
图像宽度(像素) |
ImageHeight |
int |
图像高度(像素) |
PixelFormat |
CogImagePixelFormatConstants |
图像像素格式 |
FrameCount |
long |
当前帧序号 |
AcquireTimeMs |
double |
本次采集耗时(毫秒) |
Timestamp |
DateTime |
采集时间戳 |
IsImageValid |
bool |
采集的图像是否有效 |
DroppedFrames |
long |
丢帧数 |
5.7.1 采集性能评估
| 评估项 | 优秀 | 良好 | 一般 | 较差 |
|---|---|---|---|---|
| 采集耗时 | < 曝光时间×1.2 | 曝光时间×1.2~1.5 | 曝光时间×1.5~2.0 | > 曝光时间×2.0 |
| 丢帧率 | 0% | < 1% | 1%~5% | > 5% |
| 帧率稳定性 | 波动 < 2% | 波动 2%~5% | 波动 5%~10% | 波动 > 10% |
5.8 CogAcqFifoTool主要方法
| 方法 | 说明 |
|---|---|
Run() |
执行一次图像采集 |
Acquire() |
等同于 Run(),触发单帧采集 |
StartContinuous() |
开始连续采集模式 |
StopContinuous() |
停止连续采集 |
FlushAcqFifo() |
清空采集缓冲区 |
Snap() |
采集单帧并等待完成 |
Save(string filename) |
保存采集配置到 .vpp 文件 |
Load(string filename) |
从 .vpp 文件加载采集配置 |
5.8.1 方法使用示例
csharp
// 单帧采集
myAcqFifoTool.Run();
// 获取采集结果
if (myAcqFifoTool.RunStatus == CogToolResultConstants.Accept)
{
ICogImage image = myAcqFifoTool.OutputImage;
Console.WriteLine($"图像尺寸: {image.Width} x {image.Height}");
}
// 连续采集
myAcqFifoTool.StartContinuous();
// ... 执行其他操作 ...
myAcqFifoTool.StopContinuous();
5.9 CogAcqFifoTool主要事件
| 事件 | 触发时机 | 说明 |
|---|---|---|
Ran |
单帧采集完成后 | 无论成功或失败均触发 |
AcqComplete |
连续采集中每帧完成时 | 用于实时处理每帧图像 |
AcqStateChanged |
采集状态改变时 | 如从空闲变为采集中 |
ImageReady |
新图像就绪时 | 可用于实时显示或处理 |
5.9.1 事件使用示例
csharp
// 监听单帧采集完成事件
myAcqFifoTool.Ran += (sender, e) =>
{
if (myAcqFifoTool.RunStatus == CogToolResultConstants.Accept)
{
ICogImage image = myAcqFifoTool.OutputImage;
Console.WriteLine($"采集成功!图像: {image.Width}x{image.Height}");
Console.WriteLine($"耗时: {myAcqFifoTool.LastRunTimeMs:F1}ms");
}
else
{
Console.WriteLine("采集失败!");
}
};
// 监听连续采集中的帧完成事件
myAcqFifoTool.AcqComplete += (sender, e) =>
{
ICogImage image = myAcqFifoTool.OutputImage;
// 实时处理或显示
cogDisplay1.Image = image;
};
5.10 使用方法
5.10.1 使用流程
- 添加引用 → 引入
Cognex.VisionPro及相机驱动程序集 - 放置控件 → 在 WinForms 窗体上放置
CogAcqFifoEditV2 - 创建工具 → 实例化
CogAcqFifoTool - 关联控件 → 设置
EditV2.Subject = tool - 选择采集源 → 配置相机或图像文件源
- 配置采集参数 → 设置曝光、增益、触发模式、图像尺寸等
- 测试采集 → 单帧采集测试,确认图像质量
- 集成到流程 → 将采集工具连接到后续视觉处理工具
5.11 示例代码
5.11.1 基本关联与使用
csharp
// 创建图像采集工具并关联到编辑控件
CogAcqFifoTool acqFifoTool = new CogAcqFifoTool();
cogAcqFifoEditV2.Subject = acqFifoTool;
// 采集单帧
acqFifoTool.Run();
// 获取结果
if (acqFifoTool.RunStatus == CogToolResultConstants.Accept)
{
ICogImage image = acqFifoTool.OutputImage;
MessageBox.Show($"采集成功!图像尺寸: {image.Width}x{image.Height}");
// 在 CogDisplay 中显示
cogDisplay1.Image = image;
}
5.11.2 动态切换工具对象
csharp
// 在运行时动态切换关联的采集工具
public void SwitchAcqFifoTool(CogAcqFifoTool newTool)
{
// 停止当前工具的连续采集
if (cogAcqFifoEditV2.Subject != null)
{
cogAcqFifoEditV2.Subject.StopContinuous();
}
cogAcqFifoEditV2.Subject = newTool;
// 刷新显示
cogAcqFifoEditV2.Refresh();
Console.WriteLine("已切换到新采集工具");
}
5.11.3 配置采集参数后执行采集
csharp
CogAcqFifoTool acqFifoTool = new CogAcqFifoTool();
// 配置采集参数
acqFifoTool.TriggerMode = CogAcqFifoTriggerModeConstants.Software;
acqFifoTool.Exposure = 15000; // 15ms 曝光
acqFifoTool.Gain = 6; // 6dB 增益
acqFifoTool.FrameRate = 30; // 30fps
acqFifoTool.ImageWidth = 1920;
acqFifoTool.ImageHeight = 1080;
acqFifoTool.PixelFormat = CogImagePixelFormatConstants.Mono8;
acqFifoTool.Timeout = 5000; // 5秒超时
acqFifoTool.NumBuffers = 5; // 5个缓冲区
// 关联并执行
cogAcqFifoEditV2.Subject = acqFifoTool;
acqFifoTool.Run();
// 检查结果
if (acqFifoTool.RunStatus == CogToolResultConstants.Accept)
{
var image = acqFifoTool.OutputImage;
Console.WriteLine($"采集成功: {image.Width}x{image.Height}");
Console.WriteLine($"耗时: {acqFifoTool.LastRunTimeMs:F1}ms");
}
5.11.4 从图像文件采集
csharp
// 使用图像文件作为采集源(用于开发调试)
CogAcqFifoTool acqFifoTool = new CogAcqFifoTool();
// 创建图像文件算子
CogImageFileTool imageFileTool = new CogImageFileTool();
imageFileTool.Operator.Open(@"C:\Images\test.bmp", CogImageFileModeConstants.Read);
imageFileTool.Run();
// 将文件图像作为采集输出
acqFifoTool.OutputImage = imageFileTool.OutputImage;
// 关联到编辑控件
cogAcqFifoEditV2.Subject = acqFifoTool;
Console.WriteLine($"已加载测试图像: {imageFileTool.OutputImage.Width}x{imageFileTool.OutputImage.Height}");
5.11.5 连续采集与实时显示
csharp
// 连续采集并实时显示
CogAcqFifoTool acqFifoTool = cogAcqFifoEditV2.Subject;
// 设置连续采集模式
acqFifoTool.AcquireContinuous = true;
// 监听每帧完成事件
acqFifoTool.AcqComplete += (sender, e) =>
{
if (acqFifoTool.RunStatus == CogToolResultConstants.Accept)
{
// 更新显示
cogDisplay1.Image = acqFifoTool.OutputImage;
// 更新帧计数
this.Invoke((MethodInvoker)delegate
{
lblFrameCount.Text = $"帧数: {acqFifoTool.FrameCount}";
});
}
};
// 开始连续采集
acqFifoTool.StartContinuous();
// 停止采集(在停止按钮事件中)
private void btnStop_Click(object sender, EventArgs e)
{
acqFifoTool.StopContinuous();
Console.WriteLine($"采集停止,总帧数: {acqFifoTool.FrameCount}");
}
5.11.6 序列化/反序列化工具(保存/加载 .vpp)
csharp
// 保存采集配置到 .vpp 文件
CogAcqFifoTool acqFifoTool = cogAcqFifoEditV2.Subject;
string savePath = @"C:\AcqConfig\my_camera.vpp";
acqFifoTool.Save(savePath, CogSerializationOptionsConstants.All);
Console.WriteLine($"采集配置已保存到: {savePath}");
// 从 .vpp 文件加载采集配置
string loadPath = @"C:\AcqConfig\my_camera.vpp";
CogAcqFifoTool loadedTool =
(CogAcqFifoTool)CogSerializer.LoadObjectFromFile(loadPath);
// 关联到编辑控件
cogAcqFifoEditV2.Subject = loadedTool;
Console.WriteLine("已加载采集配置");
5.11.7 在 ToolGroup 中获取子工具并关联编辑控件
csharp
// 从 ToolGroup 中按名称查找采集工具
CogToolGroup toolGroup = myToolGroup; // 从流程中获取
// 方法1:按名称查找
CogAcqFifoTool acqFifoTool =
(CogAcqFifoTool)toolGroup.Tools["CogAcqFifoTool1"];
// 方法2:按类型遍历查找
CogAcqFifoTool acqFifoTool2 = null;
foreach (ICogTool tool in toolGroup.Tools)
{
if (tool is CogAcqFifoTool)
{
acqFifoTool2 = (CogAcqFifoTool)tool;
break;
}
}
// 关联到编辑控件
if (acqFifoTool != null)
{
cogAcqFifoEditV2.Subject = acqFifoTool;
Console.WriteLine($"已关联采集工具: {acqFifoTool.Name}");
}
5.11.8 硬件触发采集与图像处理链
csharp
// 硬件触发模式:与运动控制联动
CogAcqFifoTool acqFifoTool = new CogAcqFifoTool();
// 配置硬件触发
acqFifoTool.TriggerMode = CogAcqFifoTriggerModeConstants.Hardware;
acqFifoTool.Exposure = 5000; // 5ms 短曝光(配合运动速度)
acqFifoTool.Gain = 10; // 适当增益补偿短曝光
// 创建处理链
CogPMAlignTool pmAlignTool = new CogPMAlignTool(); // 模板匹配
CogFindCircleTool findCircleTool = new CogFindCircleTool(); // 查找圆
// 监听采集完成,自动触发处理
acqFifoTool.AcqComplete += (sender, e) =>
{
if (acqFifoTool.RunStatus == CogToolResultConstants.Accept)
{
ICogImage image = acqFifoTool.OutputImage;
// 传递图像给下游工具
pmAlignTool.InputImage = image;
findCircleTool.InputImage = image;
// 执行处理
pmAlignTool.Run();
findCircleTool.Run();
// 检查结果
if (pmAlignTool.RunStatus == CogToolResultConstants.Accept)
{
Console.WriteLine($"定位成功: ({pmAlignTool.Results[0].GetPose().TranslationX:F1}, " +
$"{pmAlignTool.Results[0].GetPose().TranslationY:F1})");
}
if (findCircleTool.RunStatus == CogToolResultConstants.Accept)
{
Console.WriteLine($"圆: ({findCircleTool.Results.X:F1}, {findCircleTool.Results.Y:F1}), " +
$"R={findCircleTool.Results.Radius:F1}");
}
}
};
// 开始采集
acqFifoTool.StartContinuous();
5.12 常见问题
5.12.1 找不到相机怎么办?
- 确认相机已正确连接并上电
- 检查网卡设置(GigE 相机需配置同一网段)
- 确认已安装正确的相机驱动
- 在设备管理器中检查相机是否被识别
- 尝试使用相机厂商的配置工具先测试连接
5.1.2.2 采集图像全黑或全白?
- 全黑:检查曝光时间是否过短、增益是否过低、镜头光圈是否关闭
- 全白:检查曝光时间是否过长、增益是否过高、是否有过曝
- 建议:从默认参数开始,逐步调整曝光和增益
5.12.3 采集超时怎么处理?
csharp
// 增加超时时间
acqFifoTool.Timeout = 10000; // 10秒
// 检查缓冲区数量
acqFifoTool.NumBuffers = 5; // 增加缓冲区
// 清空缓冲区后重试
acqFifoTool.FlushAcqFifo();
acqFifoTool.Run();
5.12.4 如何提高采集帧率?
- 降低图像分辨率(减小 ImageWidth/ImageHeight)
- 使用更快的像素格式(Mono8比RGB24 快)
- 减少曝光时间(在不影响图像质量的前提下)
- 使用硬件触发避免软件延迟
- 确保缓冲区数量足够(至少3个)
5.12.5 丢帧怎么解决?
- 增加缓冲区数量:
acqFifoTool.NumBuffers = 5; - 确保处理速度跟上采集速度
- 使用多线程:采集线程与处理线程分离
- 减少单帧处理时间
- 检查系统资源(CPU、内存、总线带宽)
5.12.6 如何在连续采集时获取最新帧?
csharp
// 连续采集时,清空缓冲区获取最新帧
acqFifoTool.FlushAcqFifo(); // 丢弃旧帧
acqFifoTool.Run(); // 获取最新帧
// 或在 AcqComplete 事件中直接使用
acqFifoTool.AcqComplete += (sender, e) =>
{
ICogImage latestImage = acqFifoTool.OutputImage; // 总是最新帧
// 处理...
};
6.CogImageFileEditV2---图像文件设置窗体控
6.1 概述
| 项目 | 说明 |
|---|---|
| 主要作用 | 提供图像文件工具的可视化配置界面,可设置文件路径、读取/保存模式、图像格式等参数 |
| 依赖库 | Cognex.VisionPro.dll |
| 关联方式 | CogImageFileEditV2.Subject = CogImageFileTool1; |
| 关联工具类型 | CogImageFileTool |
CogImageFileEditV2 是 VisionPro 中用于配置 CogImageFileTool 的编辑控件。它提供了直观的图形界面,支持设置图像文件的读取(Read)和写入(Write)模式,浏览文件路径,以及预览加载的图像。CogImageFileTool 则是实际执行图像文件读写操作的工具,支持 BMP、JPEG、PNG、TIFF 等多种图像格式。
6.2 引用与命名空间
6.2.1 程序集引用(Assembly References)
| 程序集名称 | 说明 | 典型路径 |
|---|---|---|
Cognex.VisionPro.dll |
VisionPro 核心库,包含 CogImageFileTool、CogImageFileEditV2 等类型 | %ProgramFiles%\Cognex\VisionPro\bin\ |
Cognex.VisionPro.Display.dll |
显示控件库(配合 CogDisplay 使用) | %ProgramFiles%\Cognex\VisionPro\bin\ |
6.2.2 命名空间(Namespaces)
csharp
// 必需命名空间
using Cognex.VisionPro; // 核心类型(ICogImage, CogImage8Grey, CogRunStatus 等)
using Cognex.VisionPro.ImageFile; // CogImageFileTool, CogImageFileOperator, CogImageFileModeConstants
// 常用配套命名空间
using Cognex.VisionPro.Display; // CogDisplay 显示控件
using Cognex.VisionPro.Exceptions; // CogException 异常类型
using Cognex.VisionPro.ToolBlock; // CogToolBlock(工具块集成时使用)
// 系统命名空间
using System;
using System.Drawing;
using System.Windows.Forms;
using System.IO;
6.3 核心属性(Properties)
6.3.1 CogImageFileEditV2控件属性
| 属性 | 类型 | 说明 |
|---|---|---|
Subject |
CogImageFileTool |
获取或设置编辑控件关联的 CogImageFileTool 对象,是最核心的绑定属性 |
Display |
CogDisplay |
获取控件内置的图像显示对象 |
LocalDisplayVisible |
bool |
是否显示本地图像预览区域 |
ShowToolbar |
bool |
是否显示顶部工具栏 |
AllowEdit |
bool |
是否允许用户在界面上修改工具配置 |
6.3.2 CogImageFileTool对象属性
| 属性 | 类型 | 说明 |
|---|---|---|
Operator |
CogImageFileOperator |
获取或设置图像文件操作器,包含实际的文件读写逻辑 |
OutputImage |
ICogImage |
获取工具运行后输出的图像对象(Read 模式下的结果) |
InputImage |
ICogImage |
设置或获取待保存的输入图像(Write 模式下使用) |
RunStatus |
CogRunStatus |
获取工具的运行状态信息 |
Name |
string |
工具名称 |
LastRunRecord |
ICogRecord |
获取最后一次运行的记录(用于调试和显示) |
CurrentRunRecord |
ICogRecord |
获取当前运行的记录 |
6.3.3 CogImageFileOperator属性
| 属性 | 类型 | 说明 |
|---|---|---|
FilePath |
string |
图像文件的完整路径 |
Mode |
CogImageFileModeConstants |
文件操作模式:Read(读取)或 Write(写入) |
OpenMode |
CogImageFileOpenModeConstants |
打开模式:OpenExisting(打开已有文件)或 CreateNew(创建新文件) |
ImageFormat |
CogImageFileFormatConstants |
图像保存格式(BMP、JPEG、PNG、TIFF 等) |
LastFileName |
string |
最后一次操作的文件名 |
LastImage |
ICogImage |
最后一次读取或保存的图像 |
6.4 核心方法(Methods)
6.4.1 CogImageFileTool方法
| 方法 | 签名 | 说明 |
|---|---|---|
Run |
void Run() |
执行图像文件读取或写入操作 |
Open |
void Open(string filePath, CogImageFileModeConstants mode) |
以指定模式打开文件(一步完成路径和模式设置) |
Copy |
ICogTool Copy() |
创建工具的深拷贝 |
Serialize |
byte[] Serialize() |
将工具序列化为字节数组 |
Deserialize |
static CogImageFileTool Deserialize(byte[]) |
从字节数组反序列化 |
6.4.2 CogImageFileOperator方法
| 方法 | 签名 | 说明 |
|---|---|---|
Open |
void Open(string filePath, CogImageFileModeConstants mode) |
打开指定文件路径并设置读写模式 |
Close |
void Close() |
关闭当前打开的文件 |
Read |
ICogImage Read() |
从文件读取图像并返回 ICogImage 对象 |
Write |
void Write(ICogImage image) |
将图像写入文件 |
Save |
void Save() |
保存当前图像到已打开的文件路径 |
SaveAs |
void SaveAs(string filePath, CogImageFileFormatConstants format) |
另存为指定路径和格式 |
6.5 关键运行参数
6.5.1 文件操作模式(CogImageFileModeConstants)
| 枚举值 | 数值 | 说明 |
|---|---|---|
CogImageFileModeConstants.Read |
0 | 从文件读取图像 |
CogImageFileModeConstants.Write |
1 | 将图像写入文件 |
6.5.2 文件打开模式(CogImageFileOpenModeConstants)
| 枚举值 | 说明 |
|---|---|
CogImageFileOpenModeConstants.OpenExisting |
打开已存在的文件 |
CogImageFileOpenModeConstants.CreateNew |
创建新文件(若已存在则覆盖) |
6.5.3 图像格式(CogImageFileFormatConstants)
| 枚举值 | 说明 |
|---|---|
CogImageFileFormatConstants.Bmp |
BMP 位图格式 |
CogImageFileFormatConstants.Jpeg |
JPEG 压缩格式 |
CogImageFileFormatConstants.Png |
PNG 无损格式 |
CogImageFileFormatConstants.Tiff |
TIFF 格式 |
CogImageFileFormatConstants.BmpWithVppHeader |
带 VisionPro 头信息的 BMP(默认格式) |
6.5.4 运行状态(CogRunResultConstants)
| 枚举值 | 说明 |
|---|---|
CogRunResultConstants.Accept |
运行成功且结果被接受 |
CogRunResultConstants.Reject |
运行成功但结果被拒绝 |
CogRunResultConstants.Error |
运行出错(如文件不存在、格式错误等) |
6.5.5 支持的图像文件格式
| 格式 | 扩展名 | 读 | 写 | 说明 |
|---|---|---|---|---|
| BMP | .bmp |
✅ | ✅ | Windows 位图,无压缩 |
| JPEG | .jpg / .jpeg |
✅ | ✅ | 有损压缩,适合照片 |
| PNG | .png |
✅ | ✅ | 无损压缩,支持透明通道 |
| TIFF | .tif / .tiff |
✅ | ✅ | 工业标准,支持多页 |
| VPP BMP | .bmp |
✅ | ✅ | 带 VisionPro 专有头信息 |
6.6 代码示例
6.6.1 基本关联
最简单的使用方式,将编辑控件绑定到一个已有的 CogImageFileTool。
csharp
using Cognex.VisionPro.ImageFile;
// 将编辑控件与 CogImageFileTool 关联
cogImageFileEditV21.Subject = cogImageFileTool1;
6.6.2 编程设置文件路径并加载
通过代码配置文件路径和读取模式,然后执行读取操作。
csharp
using Cognex.VisionPro;
using Cognex.VisionPro.ImageFile;
// 方式一:通过 Open 方法一步完成路径和模式设置
cogImageFileTool1.Operator.Open(
@"C:\Images\test.bmp",
CogImageFileModeConstants.Read);
// 执行读取
cogImageFileTool1.Run();
// 获取输出图像
CogDisplay1.Image = cogImageFileTool1.OutputImage;
// 绑定到编辑控件(用于可视化查看和修改配置)
cogImageFileEditV21.Subject = cogImageFileTool1;
6.6.3 分步设置文件路径和模式
通过分别设置 Operator 的属性来配置文件读取。
csharp
using Cognex.VisionPro;
using Cognex.VisionPro.ImageFile;
// 方式二:分别设置属性
cogImageFileTool1.Operator.FilePath = @"C:\Images\sample.png";
cogImageFileTool1.Operator.Mode = CogImageFileModeConstants.Read;
cogImageFileTool1.Operator.OpenMode = CogImageFileOpenModeConstants.OpenExisting;
// 执行读取
cogImageFileTool1.Run();
// 检查运行结果
if (cogImageFileTool1.RunStatus.Result == CogRunResultConstants.Accept)
{
ICogImage image = cogImageFileTool1.OutputImage;
Console.WriteLine($"图像加载成功: {image.Width} x {image.Height}");
}
else
{
Console.WriteLine($"加载失败: {cogImageFileTool1.RunStatus.Message}");
}
6.6.4 保存图像到文件
将图像写入文件并指定保存格式。
csharp
using Cognex.VisionPro;
using Cognex.VisionPro.ImageFile;
// 设置写入模式
cogImageFileTool1.Operator.Open(
@"C:\Output\result.bmp",
CogImageFileModeConstants.Write);
// 设置输入图像
cogImageFileTool1.InputImage = myCogImage;
// 执行保存
cogImageFileTool1.Run();
if (cogImageFileTool1.RunStatus.Result == CogRunResultConstants.Accept)
{
Console.WriteLine("图像保存成功");
}
6.6.5 另存为不同格式
使用Operator的SaveAs方法将图像保存为多种格式。
csharp
using Cognex.VisionPro;
using Cognex.VisionPro.ImageFile;
// 读取原始图像
cogImageFileTool1.Operator.Open(@"C:\Images\original.bmp", CogImageFileModeConstants.Read);
cogImageFileTool1.Run();
ICogImage image = cogImageFileTool1.OutputImage;
// 保存为 JPEG
cogImageFileTool1.Operator.Open(@"C:\Output\result.jpg", CogImageFileModeConstants.Write);
cogImageFileTool1.InputImage = image;
cogImageFileTool1.Run();
// 保存为 PNG
cogImageFileTool1.Operator.Open(@"C:\Output\result.png", CogImageFileModeConstants.Write);
cogImageFileTool1.InputImage = image;
cogImageFileTool1.Run();
// 保存为 TIFF
cogImageFileTool1.Operator.Open(@"C:\Output\result.tiff", CogImageFileModeConstants.Write);
cogImageFileTool1.InputImage = image;
cogImageFileTool1.Run();
Console.WriteLine("已保存为 JPEG、PNG、TIFF 三种格式");
6.6.6 批量读取文件夹中的图像
遍历文件夹中的图像文件并逐一加载处理。
csharp
using Cognex.VisionPro;
using Cognex.VisionPro.ImageFile;
using System.IO;
string imageFolder = @"C:\Images\TestSet";
string[] extensions = { "*.bmp", "*.jpg", "*.png", "*.tif" };
List<string> imageFiles = new List<string>();
foreach (string ext in extensions)
{
imageFiles.AddRange(Directory.GetFiles(imageFolder, ext));
}
Console.WriteLine($"找到 {imageFiles.Count} 个图像文件");
for (int i = 0; i < imageFiles.Count; i++)
{
string filePath = imageFiles[i];
Console.WriteLine($"[{i + 1}/{imageFiles.Count}] 加载: {Path.GetFileName(filePath)}");
cogImageFileTool1.Operator.Open(filePath, CogImageFileModeConstants.Read);
cogImageFileTool1.Run();
if (cogImageFileTool1.RunStatus.Result == CogRunResultConstants.Accept)
{
ICogImage img = cogImageFileTool1.OutputImage;
Console.WriteLine($" 尺寸: {img.Width}x{img.Height}");
// 在此进行其他处理,如模板匹配、测量等
// cogPMAlignTool1.InputImage = img;
// cogPMAlignTool1.Run();
}
else
{
Console.WriteLine($" ⚠ 加载失败: {cogImageFileTool1.RunStatus.Message}");
}
}
6.6.7 使用CogDisplay预览图像
将加载的图像显示在CogDisplay控件上,并适配窗口大小。
csharp
using Cognex.VisionPro;
using Cognex.VisionPro.ImageFile;
using Cognex.VisionPro.Display;
// 加载图像
cogImageFileTool1.Operator.Open(@"C:\Images\test.jpg", CogImageFileModeConstants.Read);
cogImageFileTool1.Run();
if (cogImageFileTool1.RunStatus.Result == CogRunResultConstants.Accept)
{
// 设置图像到显示控件
cogDisplay1.Image = cogImageFileTool1.OutputImage;
// 自动适配窗口大小
cogDisplay1.Fit();
// 可选:设置缩放模式
// cogDisplay1.ZoomFit();
}
6.6.8 在ToolBlock中集成CogImageFileTool
将CogImageFileTool作为ToolBlock的一部分,与其他视觉工具串联使用。
csharp
using Cognex.VisionPro;
using Cognex.VisionPro.ToolBlock;
using Cognex.VisionPro.ImageFile;
using Cognex.VisionPro.PMAlign;
using Cognex.VisionPro.Caliper;
// 创建 ToolBlock
CogToolBlock tb = new CogToolBlock();
tb.Name = "FileBasedInspection";
// 添加图像文件工具(用于读取输入图像)
CogImageFileTool fileTool = new CogImageFileTool();
fileTool.Name = "ImageLoader";
fileTool.Operator.Open(@"C:\Images\input.bmp", CogImageFileModeConstants.Read);
tb.Tools.Add(fileTool);
// 添加模板匹配工具
CogPMAlignTool pma = new CogPMAlignTool();
pma.Name = "PMAlign";
tb.Tools.Add(pma);
// 添加卡尺测量工具
CogCaliperTool caliper = new CogCaliperTool();
caliper.Name = "Caliper";
tb.Tools.Add(caliper);
// 定义输出终端
tb.Outputs.Add(new CogToolBlockTerminal("MatchScore", typeof(double)));
tb.Outputs.Add(new CogToolBlockTerminal("Width", typeof(double)));
// 运行整个工具块
tb.Run();
// 获取结果
if (tb.RunStatus.Result == CogRunResultConstants.Accept)
{
double score = (double)tb.Outputs["MatchScore"].Value;
double width = (double)tb.Outputs["Width"].Value;
Console.WriteLine($"匹配分数: {score:F3}, 宽度: {width:F3}");
}
6.6.9 图像格式转换工具
编写一个简单的图像格式转换函数。
csharp
using Cognex.VisionPro;
using Cognex.VisionPro.ImageFile;
using System.IO;
/// <summary>
/// 将图像文件转换为指定格式
/// </summary>
/// <param name="inputPath">输入文件路径</param>
/// <param name="outputPath">输出文件路径</param>
/// <param name="format">目标格式</param>
public static void ConvertImageFormat(
string inputPath,
string outputPath,
CogImageFileFormatConstants format)
{
CogImageFileTool reader = new CogImageFileTool();
CogImageFileTool writer = new CogImageFileTool();
// 读取
reader.Operator.Open(inputPath, CogImageFileModeConstants.Read);
reader.Run();
if (reader.RunStatus.Result != CogRunResultConstants.Accept)
throw new Exception($"读取失败: {reader.RunStatus.Message}");
// 写入
writer.Operator.Open(outputPath, CogImageFileModeConstants.Write);
writer.InputImage = reader.OutputImage;
writer.Run();
if (writer.RunStatus.Result != CogRunResultConstants.Accept)
throw new Exception($"写入失败: {writer.RunStatus.Message}");
Console.WriteLine($"转换完成: {Path.GetFileName(inputPath)} → {Path.GetFileName(outputPath)}");
}
// 使用示例
ConvertImageFormat(
@"C:\Images\photo.bmp",
@"C:\Output\photo.png",
CogImageFileFormatConstants.Png);
6.6.10 带错误处理的完整图像加载流程
生产环境中推荐的健壮性写法。
csharp
using Cognex.VisionPro;
using Cognex.VisionPro.ImageFile;
using Cognex.VisionPro.Exceptions;
using System;
using System.IO;
/// <summary>
/// 安全加载图像文件
/// </summary>
/// <param name="filePath">图像文件路径</param>
/// <param name="display">可选的显示控件</param>
/// <returns>加载成功返回 ICogImage,失败返回 null</returns>
public ICogImage SafeLoadImage(string filePath, CogDisplay display = null)
{
// 1. 检查文件是否存在
if (!File.Exists(filePath))
{
Console.WriteLine($"[错误] 文件不存在: {filePath}");
return null;
}
// 2. 检查文件扩展名
string ext = Path.GetExtension(filePath).ToLower();
string[] supportedExts = { ".bmp", ".jpg", ".jpeg", ".png", ".tif", ".tiff" };
if (Array.IndexOf(supportedExts, ext) < 0)
{
Console.WriteLine($"[错误] 不支持的文件格式: {ext}");
return null;
}
try
{
// 3. 配置工具
CogImageFileTool fileTool = new CogImageFileTool();
fileTool.Operator.Open(filePath, CogImageFileModeConstants.Read);
// 4. 执行读取
fileTool.Run();
// 5. 检查结果
if (fileTool.RunStatus.Result == CogRunResultConstants.Accept)
{
ICogImage image = fileTool.OutputImage;
Console.WriteLine($"[成功] 加载图像: {Path.GetFileName(filePath)}, " +
$"尺寸: {image.Width}x{image.Height}");
// 6. 可选:显示图像
if (display != null)
{
display.Image = image;
display.Fit();
}
return image;
}
else
{
Console.WriteLine($"[错误] 读取失败: {fileTool.RunStatus.Message}");
return null;
}
}
catch (CogException ex)
{
Console.WriteLine($"[异常] VisionPro 错误: {ex.Message}");
return null;
}
catch (Exception ex)
{
Console.WriteLine($"[异常] 未知错误: {ex.Message}");
return null;
}
}
// 使用示例
ICogImage img = SafeLoadImage(@"C:\Images\test.bmp", cogDisplay1);
if (img != null)
{
// 继续后续处理...
}
6.7 控件界面功能说明
CogImageFileEditV2控件提供以下界面区域和操作:
| 区域/按钮 | 功能 |
|---|---|
| 文件路径输入框 | 显示和编辑当前图像文件的完整路径 |
| 浏览按钮 (...) | 打开文件选择对话框,浏览并选择图像文件 |
| 模式选择 (Mode) | 切换 Read(读取)或 Write(写入)模式 |
| 运行按钮 (Run) | 执行当前配置的图像文件读取或写入操作 |
| 本地显示区域 | 预览加载的图像内容 |
| 状态栏 | 显示工具运行状态和错误信息 |
6.8 注意事项
- 文件路径有效性 :运行前确保文件路径存在且有读写权限,否则会返回
CogRunResultConstants.Error。 - 图像格式兼容:VPP 头格式的 BMP 文件是 VisionPro 专有格式,其他软件可能无法直接打开。
- 大文件处理 :加载高分辨率图像时注意内存占用,建议及时释放不需要的
ICogImage对象。 - Operator 与 Tool 关系 :
CogImageFileTool.Operator是实际执行文件操作的对象,Tool 本身是包装器。 - 线程安全:VisionPro 工具通常非线程安全,多线程场景下需要加锁或使用独立实例。
- 路径中的特殊字符:文件路径中避免使用中文和特殊字符,可能导致加载失败。
- Run 后再取结果 :必须先调用
Run()才能获取OutputImage,否则返回 null。
6.9 典型应用场景
| 场景 | 说明 |
|---|---|
| 离线图像测试 | 从文件加载图像进行算法调试,无需连接相机 |
| 图像归档保存 | 将检测过程中的图像保存到文件系统,用于追溯和存档 |
| 批量图像处理 | 遍历文件夹中的图像文件,逐一执行视觉检测 |
| 格式转换 | 在 BMP、JPEG、PNG、TIFF 等格式之间转换 |
| 测试图像库管理 | 构建和管理验证用的图像测试集 |
| 与 ToolBlock 集成 | 作为 ToolBlock 的输入源,配合其他视觉工具使用 |