VisionPro之工具窗体设置控件一

文章目录

  • 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.TrainImageCurrent.InputImageLastRun.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() 使用当前 TrainImagePattern.TrainRegion 训练模板
CreateCurrentRecord() 创建当前状态的记录对象

1.9 CogPMAlignTool 主要事件

事件 说明
Ran 工具运行完成后触发
Changed 工具属性发生变化时触发

1.10 使用方法

  1. 在工具箱中拖拽 CogPMAlignEditV2 到窗体
  2. 在代码中将工具实例赋值给 Subject 属性
  3. 用户可在运行时通过该窗体训练模板、调整匹配参数、查看匹配结果

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 使用流程

  1. 添加引用 → 引入 Cognex.VisionPro.CalibFix 程序集
  2. 放置控件 → 在 WinForms 窗体上放置 CogFixtureEditV2
  3. 创建工具 → 实例化 CogFixtureTool
  4. 关联控件 → 设置 EditV2.Subject = tool
  5. 配置变换类型 → 根据应用需求选择变换类型
  6. 设置输入源 → 绑定 X/Y/角度数据来源(可来自定位工具输出)
  7. 配置变换参数 → 设置平移量、旋转角度、缩放因子
  8. 执行变换 → 调用 Run() 或通过控件界面运行
  9. 使用结果 → 将变换后的坐标传递给下游工具(如标定工具、测量工具)

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 输入坐标从哪里获取?

最常见的方式是将定位工具(如 CogPMAlignToolCogBlobTool)的输出作为 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:像素坐标 X
  • UncalibratedY:像素坐标 Y
  • CalibratedX:物理坐标 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 使用流程

  1. 添加引用 → 引入 Cognex.VisionPro.CalibFix 程序集
  2. 放置控件 → 在 WinForms 窗体上放置 CogCalibNPointToNPointEditV2
  3. 创建工具 → 实例化 CogCalibNPointToNPointTool
  4. 关联控件 → 设置 EditV2.Subject = tool
  5. 添加标定点 → 至少添加满足映射类型要求的最少点数
  6. 配置参数 → 选择映射类型等参数
  7. 执行标定 → 调用 Run() 或通过控件界面运行
  8. 验证结果 → 检查残差统计,确认标定质量
  9. 使用标定 → 通过 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 使用流程

  1. 添加引用 → 引入 Cognex.VisionPro.Caliper 程序集
  2. 放置控件 → 在 WinForms 窗体上放置 CogFindCircleEditV2
  3. 创建工具 → 实例化 CogFindCircleTool
  4. 关联控件 → 设置 EditV2.Subject = tool
  5. 设置输入图像 → 将待检测图像赋给 InputImage
  6. 配置搜索区域 → 在控件界面或代码中定义环形/扇形搜索区域
  7. 配置边缘参数 → 设置极性、阈值、卡尺数量等
  8. 执行查找 → 调用 Run() 或通过控件界面运行
  9. 分析结果 → 查看圆心、半径、拟合分数、边缘点分布

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 使用流程

  1. 添加引用 → 引入 Cognex.VisionPro 及相机驱动程序集
  2. 放置控件 → 在 WinForms 窗体上放置 CogAcqFifoEditV2
  3. 创建工具 → 实例化 CogAcqFifoTool
  4. 关联控件 → 设置 EditV2.Subject = tool
  5. 选择采集源 → 配置相机或图像文件源
  6. 配置采集参数 → 设置曝光、增益、触发模式、图像尺寸等
  7. 测试采集 → 单帧采集测试,确认图像质量
  8. 集成到流程 → 将采集工具连接到后续视觉处理工具

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 注意事项

  1. 文件路径有效性 :运行前确保文件路径存在且有读写权限,否则会返回 CogRunResultConstants.Error
  2. 图像格式兼容:VPP 头格式的 BMP 文件是 VisionPro 专有格式,其他软件可能无法直接打开。
  3. 大文件处理 :加载高分辨率图像时注意内存占用,建议及时释放不需要的 ICogImage 对象。
  4. Operator 与 Tool 关系CogImageFileTool.Operator 是实际执行文件操作的对象,Tool 本身是包装器。
  5. 线程安全:VisionPro 工具通常非线程安全,多线程场景下需要加锁或使用独立实例。
  6. 路径中的特殊字符:文件路径中避免使用中文和特殊字符,可能导致加载失败。
  7. Run 后再取结果 :必须先调用 Run() 才能获取 OutputImage,否则返回 null。

6.9 典型应用场景

场景 说明
离线图像测试 从文件加载图像进行算法调试,无需连接相机
图像归档保存 将检测过程中的图像保存到文件系统,用于追溯和存档
批量图像处理 遍历文件夹中的图像文件,逐一执行视觉检测
格式转换 在 BMP、JPEG、PNG、TIFF 等格式之间转换
测试图像库管理 构建和管理验证用的图像测试集
与 ToolBlock 集成 作为 ToolBlock 的输入源,配合其他视觉工具使用
相关推荐
不会编程的懒洋洋1 天前
VisionPro 中 卡尺 CogCaliperTool
图像处理·人工智能·笔记·计算机视觉·visionpro·cogcalipertool
不会编程的懒洋洋1 天前
VisionPro 中 直方图 CogHistogramTool
图像处理·人工智能·笔记·计算机视觉·机器视觉·visionpro·康耐视
预见AI1 个月前
康耐视VisionPro连接海康相机教程(Gige)及常见错误问题
人工智能·计算机视觉·visionpro·海康相机
幻想趾于现实1 个月前
CogFitLineTool 工具调用多个卡尺得分
机器学习·visionpro
刘程云1 个月前
AI机器视觉硬件之工业相机
人工智能·机器视觉·工业相机·visionmaster·visionpro·硬件选型·机器视觉调试
【ql君】qlexcel4 个月前
机器视觉软件介绍:opencv、halcon、康耐视visionpro、海康visionmaster
人工智能·opencv·计算机视觉·halcon·visionmaster·visionpro
kylezhao20194 个月前
C# 语言基础(变量、数据类型、流程控制、面向对象编程)
开发语言·计算机视觉·c#·visionpro
kylezhao20195 个月前
工业机器视觉基础认知
计算机视觉·c#·visionpro
专注VB编程开发20年5 个月前
上位机开发-工厂流水线机器视频VisionPro、LabVIEW 实现多物品识别的
labview·机器视觉·visionpro