文章目录
- 1.CogAcqFifoTool---相机采集工具
-
- [1.1 核心属性与方法](#1.1 核心属性与方法)
- [1.2 ICogAcqFifo(Operator)核心方法](#1.2 ICogAcqFifo(Operator)核心方法)
- [1.3 ICogFrameGrabber 核心方法](#1.3 ICogFrameGrabber 核心方法)
- [1.4 使用方法](#1.4 使用方法)
-
- [1.4.1 通过VPP文件加载并采集(推荐方式)](#1.4.1 通过VPP文件加载并采集(推荐方式))
- [1.4.2 编程方式枚举并连接相机](#1.4.2 编程方式枚举并连接相机)
- [1.4.3 实时显示与单次采集切换](#1.4.3 实时显示与单次采集切换)
- [1.4.4 连续采集并统计帧率](#1.4.4 连续采集并统计帧率)
- [1.4.5 采集后保存图像到文件](#1.4.5 采集后保存图像到文件)
- [1.4.6 释放相机资源(重要!关闭窗体时必须调用)](#1.4.6 释放相机资源(重要!关闭窗体时必须调用))
- 2.CogBlobTool---斑点检测工具
-
- [2.1 基本斑点检测](#2.1 基本斑点检测)
- [2.2 设置阈值并过滤特定大小的斑点](#2.2 设置阈值并过滤特定大小的斑点)
- [3.CogCaliperTool --- 卡尺工具](#3.CogCaliperTool — 卡尺工具)
-
- [3.1 核心属性与方法](#3.1 核心属性与方法)
- [3.2 CogCaliperRunParams核心参数](#3.2 CogCaliperRunParams核心参数)
- [3.3 CogCaliperResult 核心属性](#3.3 CogCaliperResult 核心属性)
- 4.CogPMAlignTool---模板匹配工具
-
- [4.1 核心属性与方法](#4.1 核心属性与方法)
- [4.2 CogPMAlignRunParams核心参数](#4.2 CogPMAlignRunParams核心参数)
- [4.3 CogPMAlignResult核心属性](#4.3 CogPMAlignResult核心属性)
- [4.4 ICogTransform2D(GetPose() 返回值)](#4.4 ICogTransform2D(GetPose() 返回值))
-
- [4.4.1 基本模板匹配并获取完整位姿信息](#4.4.1 基本模板匹配并获取完整位姿信息)
- [4.4.2 多目标匹配并按分数排序](#4.4.2 多目标匹配并按分数排序)
- [4.4.3 使用PatMax算法进行高精度匹配(抗光照变化)](#4.4.3 使用PatMax算法进行高精度匹配(抗光照变化))
- [4.4.4 配合FixtureTool实现相对坐标定位](#4.4.4 配合FixtureTool实现相对坐标定位)
- 5.CogCNLSearchTool---形状与轮廓匹配工具
-
- [5.1 基本轮廓匹配](#5.1 基本轮廓匹配)
- [5.2 设置搜索参数](#5.2 设置搜索参数)
- 6.CogPatInspectTool---模式检测工具
-
- [6.1 基本缺陷检测](#6.1 基本缺陷检测)
- [6.2 设置检测灵敏度](#6.2 设置检测灵敏度)
- 7.CogSearchMaxTool---高精度模板搜寻工具
-
- [7.1 高精度匹配](#7.1 高精度匹配)
- [7.2 设置搜索范围和角度范围](#7.2 设置搜索范围和角度范围)
- 8.CogDataAnalysisTool---数据分析工具
-
- [8.1 基本数据分析](#8.1 基本数据分析)
- [8.2 从其他工具接收数据进行分析](#8.2 从其他工具接收数据进行分析)
- 9.CogResultsAnalysisTool---结果分析工具
-
- [9.1 获取表达式计算结果](#9.1 获取表达式计算结果)
- [9.2 遍历所有分析结果](#9.2 遍历所有分析结果)
- 10.CogImageFileTool---图像文件工具
-
- [10.1 核心属性与方法](#10.1 核心属性与方法)
-
- [10.1.1 从文件加载图像并检查状态](#10.1.1 从文件加载图像并检查状态)
- [10.1.2 批量读取文件夹中的图像](#10.1.2 批量读取文件夹中的图像)
- [10.1.3 保存图像为不同格式](#10.1.3 保存图像为不同格式)
| 项目 |
说明 |
| 主要作用 |
从相机或其他图像捕获设备中获取图像,是 VisionPro 图像采集的核心工具 |
| 依赖库 |
Cognex.VisionPro |
| 分类 |
图像获取 |
1.1 核心属性与方法
| 属性/方法 |
类型 |
说明 |
Operator |
ICogAcqFifo |
相机采集操作对象,管理实际的相机连接和采集 |
OutputImage |
ICogImage |
采集到的输出图像(运行后可用) |
Run() |
void |
执行一次采集,采集一张图像 |
RunStatus |
ICogRunStatus |
工具运行状态(包含 Result、耗时等信息) |
RunStatus.Result |
CogToolResultConstants |
运行结果(Accept/Fail/N/A) |
RunStatus.ProcessingTime |
double |
本次采集耗时(秒) |
1.2 ICogAcqFifo(Operator)核心方法
| 方法 |
说明 |
Acquire(out int triggerNumber) |
执行一次采集,返回图像和触发编号 |
Flush() |
清空采集缓冲区 |
AvailableVideoFormats |
获取相机支持的视频格式列表 |
1.3 ICogFrameGrabber 核心方法
| 方法 |
说明 |
CreateAcqFifo(string videoFormat, CogAcqFifoPixelFormatConstants pixelFormat, int fifoNum, bool bufferImages) |
创建采集 FIFO 对象 |
AvailableVideoFormats |
获取支持的视频格式数组 |
Disconnect(bool waitForComplete) |
断开相机连接 |
Name |
相机名称 |
SerialNumber |
相机序列号 |
1.4 使用方法
1.4.1 通过VPP文件加载并采集(推荐方式)
csharp
复制代码
using Cognex.VisionPro;
// 加载预先在 VisionPro QuickBuild 中配置好的 VPP
CogAcqFifoTool acqTool = CogSerializer.LoadObjectFromFile(
@"C:\Config\camera.vpp") as CogAcqFifoTool;
// 检查连接状态
if (acqTool.Operator == null)
{
MessageBox.Show("相机连接失败,请检查 VPP 配置");
return;
}
// 执行采集
acqTool.Run();
// 检查运行结果
if (acqTool.RunStatus.Result == CogToolResultConstants.Accept)
{
cogDisplay1.Image = acqTool.OutputImage;
cogDisplay1.Fit(true);
Console.WriteLine($"采集成功,耗时: {acqTool.RunStatus.ProcessingTime * 1000:F1} ms");
}
else
{
MessageBox.Show("采集失败: " + acqTool.RunStatus.Message);
}
1.4.2 编程方式枚举并连接相机
csharp
复制代码
using Cognex.VisionPro;
// 枚举所有已连接的 GigE 相机
CogFrameGrabberGigEs gigECameras = new CogFrameGrabberGigEs();
Console.WriteLine($"找到 {gigECameras.Count} 个 GigE 相机");
for (int i = 0; i < gigECameras.Count; i++)
{
ICogFrameGrabber grabber = gigECameras[i];
Console.WriteLine($"相机{i}: {grabber.Name}, 序列号: {grabber.SerialNumber}");
Console.WriteLine($" 支持的格式: {string.Join(", ", grabber.AvailableVideoFormats)}");
}
// 连接第一个相机
if (gigECameras.Count > 0)
{
ICogFrameGrabber grabber = gigECameras[0];
string videoFormat = grabber.AvailableVideoFormats[0];
ICogAcqFifo acqFifo = grabber.CreateAcqFifo(
videoFormat,
CogAcqFifoPixelFormatConstants.Format8Grey,
0, true);
// 采集一张图像
int trigNum;
CogImage8Grey image = (CogImage8Grey)acqFifo.Acquire(out trigNum);
cogDisplay1.Image = image;
}
1.4.3 实时显示与单次采集切换
csharp
复制代码
private ICogAcqFifo mAcqFifo;
private bool mIsLive = false;
// 启动/停止实时显示
private void btnLive_Click(object sender, EventArgs e)
{
if (!mIsLive)
{
// 启动实时显示
CogFrameGrabberGigEs cameras = new CogFrameGrabberGigEs();
ICogFrameGrabber grabber = cameras[0];
mAcqFifo = grabber.CreateAcqFifo(
grabber.AvailableVideoFormats[0],
CogAcqFifoPixelFormatConstants.Format8Grey, 0, true);
cogDisplay1.StartLiveDisplay(mAcqFifo, false);
btnLive.Text = "停止实时";
mIsLive = true;
}
else
{
// 停止实时显示
cogDisplay1.StopLiveDisplay();
btnLive.Text = "实时显示";
mIsLive = false;
}
}
// 单次拍照(停止实时后)
private void btnSnap_Click(object sender, EventArgs e)
{
if (mIsLive)
{
cogDisplay1.StopLiveDisplay();
mIsLive = false;
}
int trigNum;
CogImage8Grey image = (CogImage8Grey)mAcqFifo.Acquire(out trigNum);
cogDisplay1.Image = image;
cogDisplay1.Fit(true);
}
1.4.4 连续采集并统计帧率
csharp
复制代码
private void btnContinuous_Click(object sender, EventArgs e)
{
CogAcqFifoTool acqTool = cogAcqFifoEditV21.Subject;
if (acqTool?.Operator == null) return;
int frameCount = 0;
var sw = System.Diagnostics.Stopwatch.StartNew();
for (int i = 0; i < 100; i++)
{
acqTool.Run();
if (acqTool.RunStatus.Result == CogToolResultConstants.Accept)
{
cogDisplay1.Image = acqTool.OutputImage;
frameCount++;
}
}
sw.Stop();
double fps = frameCount / sw.Elapsed.TotalSeconds;
Console.WriteLine($"采集 {frameCount} 帧,FPS: {fps:F1}," +
$"平均每帧: {sw.Elapsed.TotalMilliseconds / frameCount:F1} ms");
}
1.4.5 采集后保存图像到文件
csharp
复制代码
using Cognex.VisionPro;
using Cognex.VisionPro.ImageFile;
using System.IO;
CogAcqFifoTool acqTool = CogSerializer.LoadObjectFromFile(path) as CogAcqFifoTool;
acqTool.Run();
if (acqTool.RunStatus.Result == CogToolResultConstants.Accept)
{
// 创建保存目录
string saveDir = Path.Combine(Directory.GetCurrentDirectory(), "Images");
if (!Directory.Exists(saveDir))
Directory.CreateDirectory(saveDir);
// 保存图像
string fileName = $"img_{DateTime.Now:yyyyMMdd_HHmmss_fff}.bmp";
CogImageFileTool fileTool = new CogImageFileTool();
fileTool.InputImage = acqTool.OutputImage;
fileTool.Operator.Open(
Path.Combine(saveDir, fileName),
CogImageFileModeConstants.Write);
fileTool.Run();
Console.WriteLine($"图像已保存: {fileName}");
}
1.4.6 释放相机资源(重要!关闭窗体时必须调用)
csharp
复制代码
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
// 停止实时显示
cogDisplay1.StopLiveDisplay();
// 断开所有相机连接
CogFrameGrabbers allCameras = new CogFrameGrabbers();
foreach (ICogFrameGrabber camera in allCameras)
{
camera.Disconnect(false);
}
}
**示例 7:通过 ToolGroup 方式采集**
```csharp
CogAcqFifoTool acqTool = toolGroup.Tools["CogAcqFifoTool1"] as CogAcqFifoTool;
acqTool.Run();
ICogImage outputImage = acqTool.OutputImage;
cogDisplay1.Image = outputImage;
| 项目 |
说明 |
| 主要作用 |
检测图像中的斑点(Blob),可用于检测脏污、亮度异常区域,分析对象的尺寸、形状、方向 |
| 依赖库 |
Cognex.VisionPro |
| 分类 |
斑点与特征检测 |
2.1 基本斑点检测
csharp
复制代码
using Cognex.VisionPro;
CogBlobTool blobTool = new CogBlobTool();
blobTool.InputImage = image;
blobTool.Run();
// 获取斑点数量
int count = blobTool.Results.GetBlobs().Count;
MessageBox.Show($"检测到 {count} 个斑点");
// 遍历斑点信息
for (int i = 0; i < count; i++)
{
ICogBlobResult blob = blobTool.Results.GetBlobs()[i];
double area = blob.Area;
double cx = blob.CenterOfMassX;
double cy = blob.CenterOfMassY;
}
2.2 设置阈值并过滤特定大小的斑点
csharp
复制代码
CogBlobTool blobTool = toolGroup.Tools["CogBlobTool1"] as CogBlobTool;
blobTool.InputImage = image;
// 设置固定阈值分割
blobTool.RunParams.SegmentationParams.Mode =
CogBlobSegmentationModeConstants.HardFixedThreshold;
blobTool.RunParams.SegmentationParams.HardFixedThreshold = 128;
// 设置面积过滤(只保留面积大于 100 的斑点)
blobTool.RunParams.FilterBlobs = true;
blobTool.RunParams.BlobFilterMode = CogBlobFilterModeConstants.Area;
blobTool.RunParams.BlobFilterMin = 100;
blobTool.RunParams.BlobFilterMax = 999999;
blobTool.Run();
| 项目 |
说明 |
| 主要作用 |
查找边缘(单边或边缘对),是一切测量工具的基础 |
| 依赖库 |
Cognex.VisionPro |
| 分类 |
测量 |
3.1 核心属性与方法
| 属性/方法 |
类型 |
说明 |
InputImage |
ICogImage |
输入图像(通常来自 FixtureTool 的输出) |
RunParams |
CogCaliperRunParams |
运行参数 |
Results |
CogCaliperResults |
运行结果集合 |
Results.Count |
int |
找到的边缘数量 |
Results[i] |
CogCaliperResult |
第 i 个结果 |
Run() |
void |
执行边缘查找 |
3.2 CogCaliperRunParams核心参数
| 参数 |
类型 |
说明 |
Edge0Polarity |
CogCaliperPolarityConstants |
第一个边缘极性(DarkToLight/LightToDark/DontCare) |
Edge1Polarity |
CogCaliperPolarityConstants |
第二个边缘极性 |
ContrastThreshold |
double |
对比度阈值(边缘检测灵敏度) |
FilterHalfSizeInPixels |
int |
滤波器半径(平滑噪声) |
CaliperRunMode |
CogCaliperRunModeConstants |
运行模式(SingleEdge/EdgePair) |
SingleEdgeScoringEnabled |
bool |
是否启用单边评分 |
3.3 CogCaliperResult 核心属性
| 属性 |
类型 |
说明 |
Edge0.PositionX |
double |
第一个边缘 X 坐标 |
Edge0.PositionY |
double |
第一个边缘 Y 坐标 |
Edge0.Score |
double |
第一个边缘分数(0~1) |
Edge0.Transition |
CogCaliperEdgeTransitionConstants |
边缘过渡方向 |
Edge1.PositionX |
double |
第二个边缘 X 坐标 |
Edge1.PositionY |
double |
第二个边缘 Y 坐标 |
Edge1.Score |
double |
第二个边缘分数 |
Width |
double |
边缘对的宽度(EdgePair 模式) |
示例 1:查找单个边缘并获取详细信息
csharp
复制代码
using Cognex.VisionPro;
CogCaliperTool caliper = new CogCaliperTool();
caliper.InputImage = image;
// 设置查找模式为单边
caliper.RunParams.CaliperRunMode = CogCaliperRunModeConstants.SingleEdge;
caliper.RunParams.Edge0Polarity = CogCaliperPolarityConstants.DarkToLight;
caliper.RunParams.ContrastThreshold = 20;
caliper.RunParams.FilterHalfSizeInPixels = 3;
caliper.Run();
if (caliper.RunStatus.Result != CogToolResultConstants.Accept || caliper.Results.Count == 0)
{
Console.WriteLine("未找到边缘");
return;
}
// 获取边缘详细信息
double x = caliper.Results[0].Edge0.PositionX;
double y = caliper.Results[0].Edge0.PositionY;
double score = caliper.Results[0].Edge0.Score;
Console.WriteLine($"边缘位置: ({x:F2}, {y:F2}), 分数: {score:F3}");
// 在图像上标记边缘位置
CogPointMarker marker = new CogPointMarker();
marker.X = x; marker.Y = y;
marker.Color = CogColorConstants.Red;
marker.SizeInScreenPixels = 10;
cogDisplay1.StaticGraphics.Add(marker, "EdgePoint");
示例 2:查找边缘对(测量宽度)
csharp
复制代码
CogCaliperTool caliper = new CogCaliperTool();
caliper.InputImage = image;
// 设置边缘对模式
caliper.RunParams.CaliperRunMode = CogCaliperRunModeConstants.EdgePair;
caliper.RunParams.Edge0Polarity = CogCaliperPolarityConstants.DarkToLight;
caliper.RunParams.Edge1Polarity = CogCaliperPolarityConstants.LightToDark;
caliper.Run();
if (caliper.Results != null && caliper.Results.Count > 0)
{
double edge0X = caliper.Results[0].Edge0.PositionX;
double edge0Y = caliper.Results[0].Edge0.PositionY;
double edge1X = caliper.Results[0].Edge1.PositionX;
double edge1Y = caliper.Results[0].Edge1.PositionY;
double width = Math.Abs(edge1X - edge0X);
Console.WriteLine($"边缘0: ({edge0X:F2}, {edge0Y:F2}), 分数: {caliper.Results[0].Edge0.Score:F3}");
Console.WriteLine($"边缘1: ({edge1X:F2}, {edge1Y:F2}), 分数: {caliper.Results[0].Edge1.Score:F3}");
Console.WriteLine($"宽度: {width:F2} 像素");
// 判断是否在公差范围内
double nominal = 50.0; // 标称宽度
double tolerance = 2.0; // 公差
if (Math.Abs(width - nominal) <= tolerance)
Console.WriteLine($"OK: 宽度 {width:F2} 在公差 [{nominal - tolerance}, {nominal + tolerance}] 内");
else
Console.WriteLine($"NG: 宽度 {width:F2} 超出公差");
}
示例 3:多个卡尺同时测量(ToolBlock 中)
csharp
复制代码
// 在 ToolBlock 中有多个卡尺工具,分别测量不同位置的宽度
string[] caliperNames = { "Width_Left", "Width_Center", "Width_Right" };
double nominalWidth = 25.0;
double tolerance = 1.0;
bool allPass = true;
foreach (string name in caliperNames)
{
CogCaliperTool caliper = mToolBlock.Tools[name] as CogCaliperTool;
caliper.Run();
if (caliper.Results.Count == 0)
{
Console.WriteLine($"{name}: 未找到边缘");
allPass = false;
continue;
}
double width = caliper.Results[0].Edge1.PositionX - caliper.Results[0].Edge0.PositionX;
mToolBlock.Outputs[name].Value = width;
bool pass = Math.Abs(width - nominalWidth) <= tolerance;
Console.WriteLine($"{name}: {width:F3} mm, {(pass ? "OK" : "NG")}");
if (!pass) allPass = false;
}
mToolBlock.Outputs["OverallResult"].Value = allPass ? "PASS" : "FAIL";
| 项目 |
说明 |
| 主要作用 |
基于灰度的模板匹配,用于定位和识别图像中与训练模板相似的目标 |
| 依赖库 |
Cognex.VisionPro.PMAlign |
| 分类 |
模板匹配与模式识别 |
4.1 核心属性与方法
| 属性/方法 |
类型 |
说明 |
InputImage |
ICogImage |
输入图像(需要 8 位灰度图像) |
RunParams |
CogPMAlignRunParams |
运行参数 |
Results |
CogPMAlignResults |
运行结果集合 |
Results.Count |
int |
匹配到的目标数量 |
Results.Item[i] |
CogPMAlignResult |
第 i 个匹配结果 |
SearchRegion |
ICogRegion |
搜索区域 |
Run() |
void |
执行匹配 |
TrainImage |
ICogImage |
训练图像 |
TrainRegion |
ICogRegion |
训练区域 |
4.2 CogPMAlignRunParams核心参数
| 参数 |
类型 |
说明 |
RunAlgorithm |
CogPMAlignRunAlgorithmConstants |
匹配算法(PatMax/PatQuick/PatFlex) |
AcceptThreshold |
double |
接受阈值(0~1,低于此分数的结果被丢弃) |
MaxResults |
int |
最大结果数量 |
ZonedRotationAngle |
double |
旋转角度搜索范围(弧度) |
ZonedRotationMax |
double |
最大旋转角度 |
ZonedRotationMin |
double |
最小旋转角度 |
Speed |
CogPMAlignSpeedConstants |
速度模式(VeryHigh/High/Medium/Low) |
Tolerance |
CogPMAlignToleranceConstants |
容差模式 |
4.3 CogPMAlignResult核心属性
| 属性/方法 |
类型 |
说明 |
GetPose() |
ICogTransform2D |
获取位姿(含平移+旋转) |
Score |
double |
匹配分数(0~1) |
GetHashCode() |
int |
结果哈希值 |
| 属性 |
类型 |
说明 |
TranslationX |
double |
X 方向平移量 |
TranslationY |
double |
Y 方向平移量 |
Rotation |
double |
旋转角度(弧度) |
Scaling |
double |
缩放比例 |
4.4.1 基本模板匹配并获取完整位姿信息
csharp
复制代码
using Cognex.VisionPro;
using Cognex.VisionPro.PMAlign;
CogPMAlignTool pmTool = new CogPMAlignTool();
pmTool.InputImage = image8grey; // 注意:需要8位灰度图像
// 检查输入图像类型
if (!(pmTool.InputImage is CogImage8Grey))
{
Console.WriteLine("警告:PMAlign 需要 8 位灰度图像,正在转换...");
CogImageConvertTool convTool = new CogImageConvertTool();
convTool.InputImage = image;
convTool.Run();
pmTool.InputImage = convTool.OutputImage as CogImage8Grey;
}
pmTool.Run();
if (pmTool.RunStatus.Result != CogToolResultConstants.Accept)
{
Console.WriteLine("匹配失败: " + pmTool.RunStatus.Message);
return;
}
if (pmTool.Results.Count == 0)
{
Console.WriteLine("未找到匹配目标(分数低于阈值)");
return;
}
// 获取第一个匹配结果的完整信息
CogPMAlignResult result = pmTool.Results.Item[0];
ICogTransform2D pose = result.GetPose();
Console.WriteLine($"匹配成功!");
Console.WriteLine($" 位置: ({pose.TranslationX:F2}, {pose.TranslationY:F2})");
Console.WriteLine($" 角度: {pose.Rotation * 180 / Math.PI:F2}°");
Console.WriteLine($" 缩放: {pose.Scaling:F3}");
Console.WriteLine($" 分数: {result.Score:F3}");
Console.WriteLine($" 耗时: {pmTool.RunStatus.ProcessingTime * 1000:F1} ms");
// 在图像上显示匹配结果
cogDisplay1.StaticGraphics.Clear();
cogDisplay1.StaticGraphics.Add(
result.CreateResultGraphics(CogPMAlignResultGraphicConstants.CoordinateAxes),
"MatchAxes");
cogDisplay1.StaticGraphics.Add(
result.CreateResultGraphics(CogPMAlignResultGraphicConstants.Boundary),
"MatchBoundary");
4.4.2 多目标匹配并按分数排序
csharp
复制代码
CogPMAlignTool pmTool = toolGroup.Tools["CogPMAlignTool1"] as CogPMAlignTool;
// 配置多目标匹配
pmTool.RunParams.RunAlgorithm = CogPMAlignRunAlgorithmConstants.PatMax;
pmTool.RunParams.AcceptThreshold = 0.6;
pmTool.RunParams.MaxResults = 20;
// 设置搜索区域
CogRectangle searchRect = new CogRectangle();
searchRect.SetXYWidthHeight(0, 0, 640, 480);
pmTool.SearchRegion = searchRect;
pmTool.Run();
Console.WriteLine($"共找到 {pmTool.Results.Count} 个匹配目标:");
// 按分数降序排列
var sortedResults = new List<CogPMAlignResult>();
for (int i = 0; i < pmTool.Results.Count; i++)
sortedResults.Add(pmTool.Results.Item[i]);
sortedResults.Sort((a, b) => b.Score.CompareTo(a.Score));
for (int i = 0; i < sortedResults.Count; i++)
{
var pose = sortedResults[i].GetPose();
Console.WriteLine($" 目标{i}: 位置({pose.TranslationX:F1}, {pose.TranslationY:F1}), " +
$"角度{pose.Rotation * 180 / Math.PI:F1}°, 分数{sortedResults[i].Score:F3}");
}
4.4.3 使用PatMax算法进行高精度匹配(抗光照变化)
csharp
复制代码
CogPMAlignTool pmTool = new CogPMAlignTool();
// 训练模板(通常在 QuickBuild 中完成,这里演示编程方式)
pmTool.TrainImage = trainImage;
pmTool.TrainRegion = new CogRectangle();
((CogRectangle)pmTool.TrainRegion).SetXYWidthHeight(100, 100, 150, 150);
// 使用 PatMax 算法(基于边缘特征,抗光照变化)
pmTool.RunParams.RunAlgorithm = CogPMAlignRunAlgorithmConstants.PatMax;
pmTool.RunParams.Speed = CogPMAlignSpeedConstants.Medium;
pmTool.RunParams.AcceptThreshold = 0.5;
// 设置旋转搜索范围(±30度)
pmTool.RunParams.ZonedRotationAngle = Math.PI / 6;
pmTool.RunParams.ZonedRotationMax = Math.PI / 6;
pmTool.RunParams.ZonedRotationMin = -Math.PI / 6;
pmTool.Run();
csharp
复制代码
// 第一步:PMAlign 定位工件
CogPMAlignTool pmTool = toolGroup.Tools["PMAlign1"] as CogPMAlignTool;
pmTool.Run();
if (pmTool.Results.Count == 0)
{
Console.WriteLine("未找到工件");
return;
}
// 第二步:将定位结果传给 FixtureTool
CogFixtureTool fixTool = toolGroup.Tools["Fixture1"] as CogFixtureTool;
fixTool.InputImage = image;
fixTool.RunParams.UnfixturedFromFixturedTransform =
pmTool.Results.Item[0].GetPose();
fixTool.Run();
// 第三步:在 FixturedSpace 下进行测量
CogCaliperTool caliper = toolGroup.Tools["Caliper1"] as CogCaliperTool;
caliper.InputImage = fixTool.OutputImage;
caliper.Run();
// 此时卡尺测量的坐标是在工件自身坐标系下,不受工件位置影响
| 项目 |
说明 |
| 主要作用 |
在图像中找寻像素值的训练模板,支持形状和轮廓匹配 |
| 依赖库 |
Cognex.VisionPro |
| 分类 |
模板匹配与模式识别 |
5.1 基本轮廓匹配
csharp
复制代码
CogCNLSearchTool cnlTool = new CogCNLSearchTool();
cnlTool.InputImage = image;
cnlTool.Run();
if (cnlTool.Results != null && cnlTool.Results.Count > 0)
{
double x = cnlTool.Results[0].GetPose().TranslationX;
double y = cnlTool.Results[0].GetPose().TranslationY;
Console.WriteLine($"匹配位置: ({x:F2}, {y:F2})");
}
5.2 设置搜索参数
csharp
复制代码
CogCNLSearchTool cnlTool = toolGroup.Tools["CogCNLSearchTool1"] as CogCNLSearchTool;
cnlTool.RunParams.AcceptThreshold = 0.6;
cnlTool.RunParams.MaxResults = 5;
cnlTool.Run();
| 项目 |
说明 |
| 主要作用 |
比较输入图像的特征和训练模板的特征,产生高亮差异图,用于缺陷检测 |
| 依赖库 |
Cognex.VisionPro |
| 分类 |
模板匹配与模式识别 |
6.1 基本缺陷检测
csharp
复制代码
CogPatInspectTool inspectTool = new CogPatInspectTool();
inspectTool.InputImage = image;
inspectTool.Run();
// 获取差异图
ICogImage diffImage = inspectTool.OutputImage;
cogDisplay1.Image = diffImage;
6.2 设置检测灵敏度
csharp
复制代码
CogPatInspectTool inspectTool = toolGroup.Tools["CogPatInspectTool1"] as CogPatInspectTool;
inspectTool.RunParams.InspectionRegionMode = CogPatInspectRegionModeConstants.TrainRegion;
inspectTool.Run();
| 项目 |
说明 |
| 主要作用 |
高精度模板匹配,适用于对定位精度要求更高的场景 |
| 依赖库 |
Cognex.VisionPro |
| 分类 |
模板匹配与模式识别 |
7.1 高精度匹配
csharp
复制代码
CogSearchMaxTool searchTool = new CogSearchMaxTool();
searchTool.InputImage = image;
searchTool.Run();
if (searchTool.Results != null && searchTool.Results.Count > 0)
{
double x = searchTool.Results[0].GetPose().TranslationX;
double y = searchTool.Results[0].GetPose().TranslationY;
Console.WriteLine($"高精度位置: ({x:F3}, {y:F3})");
}
7.2 设置搜索范围和角度范围
csharp
复制代码
CogSearchMaxTool searchTool = toolGroup.Tools["CogSearchMaxTool1"] as CogSearchMaxTool;
searchTool.RunParams.AcceptThreshold = 0.8;
searchTool.RunParams.AngleRange = Math.PI / 6; // ±30度
searchTool.Run();
| 项目 |
说明 |
| 主要作用 |
对视觉检测数据进行统计分析 |
| 依赖库 |
Cognex.VisionPro |
| 分类 |
数据分析 |
8.1 基本数据分析
csharp
复制代码
CogDataAnalysisTool analysisTool = new CogDataAnalysisTool();
analysisTool.Run();
Console.WriteLine($"分析结果数量: {analysisTool.Results.NumSamples}");
8.2 从其他工具接收数据进行分析
csharp
复制代码
CogDataAnalysisTool daTool = toolGroup.Tools["CogDataAnalysisTool1"] as CogDataAnalysisTool;
daTool.Run();
// 获取统计结果
Console.WriteLine($"均值: {daTool.Results.Mean:F3}");
Console.WriteLine($"标准差: {daTool.Results.StandardDeviation:F3}");
| 项目 |
说明 |
| 主要作用 |
对需要输出的结果进行简单的处理和分析,支持表达式求值 |
| 依赖库 |
Cognex.VisionPro |
| 分类 |
数据分析 |
9.1 获取表达式计算结果
csharp
复制代码
CogResultsAnalysisTool raTool = toolGroup.Tools["CogResultsAnalysisTool1"] as CogResultsAnalysisTool;
raTool.Run();
double result = (double)raTool.Result.EvaluatedExpressions["ExprB"].Value;
MessageBox.Show($"计算结果: {result:F3}");
9.2 遍历所有分析结果
csharp
复制代码
CogResultsAnalysisTool raTool = toolGroup.Tools["CogResultsAnalysisTool1"] as CogResultsAnalysisTool;
raTool.Run();
string results = "";
foreach (string key in raTool.Result.EvaluatedExpressions.Keys)
{
if (key != "Output")
{
double val = (double)raTool.Result.EvaluatedExpressions[key].Value;
results += $"{key}: {val:F3}\r\n";
}
}
MessageBox.Show(results);
| 项目 |
说明 |
| 主要作用 |
将图像保存至文件或从文件中获取图像 |
| 依赖库 |
Cognex.VisionPro |
| 分类 |
图像获取与处理 |
10.1 核心属性与方法
| 属性/方法 |
类型 |
说明 |
InputImage |
ICogImage |
输入图像(写入模式时使用) |
OutputImage |
ICogImage |
输出图像(读取模式时使用) |
Operator |
CogImageFileToolOperator |
文件操作对象 |
Operator.Open(string path, CogImageFileModeConstants mode) |
void |
打开文件(Read/Write) |
Operator.Open(string path, CogImageFileModeConstants mode, CogImageFileVisionProBitmapFileTypeConstants fileType) |
void |
打开文件并指定格式 |
Run() |
void |
执行读取或写入 |
RunStatus |
ICogRunStatus |
运行状态 |
10.1.1 从文件加载图像并检查状态
csharp
复制代码
CogImageFileTool imgFileTool = new CogImageFileTool();
imgFileTool.Operator.Open(@"C:\Images\test.bmp",
CogImageFileModeConstants.Read);
imgFileTool.Run();
if (imgFileTool.RunStatus.Result == CogToolResultConstants.Accept)
{
cogDisplay1.Image = imgFileTool.OutputImage;
Console.WriteLine($"图像尺寸: {imgFileTool.OutputImage.Width} x {imgFileTool.OutputImage.Height}");
}
else
{
Console.WriteLine("图像加载失败: " + imgFileTool.RunStatus.Message);
}
10.1.2 批量读取文件夹中的图像
csharp
复制代码
string[] imageFiles = Directory.GetFiles(@"C:\Images", "*.bmp");
CogImageFileTool imgFileTool = new CogImageFileTool();
foreach (string file in imageFiles)
{
imgFileTool.Operator.Open(file, CogImageFileModeConstants.Read);
imgFileTool.Run();
if (imgFileTool.RunStatus.Result == CogToolResultConstants.Accept)
{
// 对每张图像执行检测
pmAlignTool.InputImage = imgFileTool.OutputImage;
pmAlignTool.Run();
Console.WriteLine($"{Path.GetFileName(file)}: 找到 {pmAlignTool.Results.Count} 个目标");
}
}
10.1.3 保存图像为不同格式
示例 3:保存图像为不同格式
csharp
复制代码
CogImageFileTool imgFileTool = new CogImageFileTool();
imgFileTool.InputImage = cogDisplay1.Image;
// 保存为 BMP
imgFileTool.Operator.Open(@"C:\Output\result.bmp",
CogImageFileModeConstants.Write,
CogImageFileVisionProBitmapFileTypeConstants.Bmp);
imgFileTool.Run();
// 保存为 PNG
imgFileTool.Operator.Open(@"C:\Output\result.png",
CogImageFileModeConstants.Write,
CogImageFileVisionProBitmapFileTypeConstants.Png);
imgFileTool.Run();
Console.WriteLine("图像已保存为 BMP 和 PNG 格式");