VisionPro通用工具---个人学习篇

文章目录

  • 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 保存图像为不同格式)

1.CogAcqFifoTool---相机采集工具

项目 说明
主要作用 从相机或其他图像捕获设备中获取图像,是 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;

2.CogBlobTool---斑点检测工具

项目 说明
主要作用 检测图像中的斑点(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();

3.CogCaliperTool --- 卡尺工具

项目 说明
主要作用 查找边缘(单边或边缘对),是一切测量工具的基础
依赖库 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";

4.CogPMAlignTool---模板匹配工具

项目 说明
主要作用 基于灰度的模板匹配,用于定位和识别图像中与训练模板相似的目标
依赖库 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 结果哈希值

4.4 ICogTransform2D(GetPose() 返回值)

属性 类型 说明
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();

4.4.4 配合FixtureTool实现相对坐标定位

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();
// 此时卡尺测量的坐标是在工件自身坐标系下,不受工件位置影响

5.CogCNLSearchTool---形状与轮廓匹配工具

项目 说明
主要作用 在图像中找寻像素值的训练模板,支持形状和轮廓匹配
依赖库 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();

6.CogPatInspectTool---模式检测工具

项目 说明
主要作用 比较输入图像的特征和训练模板的特征,产生高亮差异图,用于缺陷检测
依赖库 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();

7.CogSearchMaxTool---高精度模板搜寻工具

项目 说明
主要作用 高精度模板匹配,适用于对定位精度要求更高的场景
依赖库 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();

8.CogDataAnalysisTool---数据分析工具

项目 说明
主要作用 对视觉检测数据进行统计分析
依赖库 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}");

9.CogResultsAnalysisTool---结果分析工具

项目 说明
主要作用 对需要输出的结果进行简单的处理和分析,支持表达式求值
依赖库 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);

10.CogImageFileTool---图像文件工具

项目 说明
主要作用 将图像保存至文件或从文件中获取图像
依赖库 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 格式");
相关推荐
爱凤的小光19 小时前
VisionPro之工具窗体设置控件一
visionpro
不会编程的懒洋洋2 天前
VisionPro 中 卡尺 CogCaliperTool
图像处理·人工智能·笔记·计算机视觉·visionpro·cogcalipertool
不会编程的懒洋洋2 天前
VisionPro 中 直方图 CogHistogramTool
图像处理·人工智能·笔记·计算机视觉·机器视觉·visionpro·康耐视
预见AI1 个月前
康耐视VisionPro连接海康相机教程(Gige)及常见错误问题
人工智能·计算机视觉·visionpro·海康相机
幻想趾于现实1 个月前
CogFitLineTool 工具调用多个卡尺得分
机器学习·visionpro
刘程云1 个月前
AI机器视觉硬件之工业相机
人工智能·机器视觉·工业相机·visionmaster·visionpro·硬件选型·机器视觉调试
【ql君】qlexcel4 个月前
机器视觉软件介绍:opencv、halcon、康耐视visionpro、海康visionmaster
人工智能·opencv·计算机视觉·halcon·visionmaster·visionpro
kylezhao20195 个月前
C# 语言基础(变量、数据类型、流程控制、面向对象编程)
开发语言·计算机视觉·c#·visionpro
kylezhao20195 个月前
工业机器视觉基础认知
计算机视觉·c#·visionpro