VisionPro二次开发学习笔记13-使用CogToolBlock进行图像交互

该程序演示了如何使用CogToolBlock进行图像交互.

  1. 从vpp文件中加载一个ToolBlock。

  2. 用户可以通过应用程序窗体上的数字增减控件修改ToolBlock输入端子的值。

  3. 用户还可以从coins.idb或采集FIFO中选择图像。

  4. "运行一次"按钮执行以下操作:

    1. 获取下一个图像或读取下一个图像
    2. 将图像传递给ToolBlock输入图像
    3. 运行ToolBlock一次
  5. 通过读取输出端子的值,以更新应用程序标签,显示检查结果。

  6. 用户可以更改代码以创建一个与可用摄像头特定配合的采集FIFO。

  7. 顶层脚本是一个简单的C#脚本,它运行工具。

  8. TBInspectionTest ToolBlock被用作结果分析工具,以决定检查是通过还是失败,并设置输出端子的值。

  9. 用户通过菜单按钮运行ToolBlock,但ToolBlock将针对相同的图像运行。

  10. 还利用了运行事件,以便用来自Blob工具的结果更新显示。

具体操作如下:

1. 界面设计

添加CogRecordDisplay,CogToolBlockEditV2控件,GroupBox,RadioButton,NumbericUpAndDown,Button,Label.

2. 添加引用

Csharp 复制代码
using Cognex.VisionPro;
using Cognex.VisionPro.ImageFile;
using Cognex.VisionPro.ToolBlock;
using Cognex.VisionPro.Blob;

3. 声明变量

Csharp 复制代码
        private CogImageFileTool imageFileTool;
        private CogAcqFifoTool acqFifoTool;
        private long numPass=0;
        private long numFail = 0; 

4. 加载工具

  1. cogToolBlockEditV21的本地显示设置为不可见。这通常用于在不需要显示工具块的情况下运行工具,比如在后台处理图像。
csharp 复制代码
cogToolBlockEditV21.LocalDisplayVisible = false;
  1. 创建一个新的图像文件工具实例,imageFileTool将用于处理图像文件。
csharp 复制代码
imageFileTool = new CogImageFileTool();
  1. 打开一个图像数据库文件(coins.idb),文件路径是相对于当前应用程序的基目录。这允许工具读取图像数据。
csharp 复制代码
imageFileTool.Operator.Open(AppDomain.CurrentDomain.BaseDirectory + @"\project\images\coins.idb", CogImageFileModeConstants.Read);
  1. 创建一个新的采集FIFO工具实例,acqFifoTool,用于处理图像采集。
csharp 复制代码
acqFifoTool = new CogAcqFifoTool();
  1. 检查acqFifoTool的操作符是否为null。如果是,则禁用与相机相关的控件(如radCamera),表示没有有效的相机连接。
csharp 复制代码
if (acqFifoTool.Operator == null)
{
    radCamera.Enabled = false;
}
  1. 如果acqFifoTool的操作符不为null,则设置曝光参数为10,配置相机的曝光时间。
csharp 复制代码
else
{
    acqFifoTool.Operator.OwnedExposureParams.Exposure = 10;
}
  1. 从指定的文件(tb.vpp)加载一个ToolBlock对象,并将其设置为cogToolBlockEditV21的主题。这使得工具块可以在编辑器中进行操作。
csharp 复制代码
cogToolBlockEditV21.Subject = CogSerializer.LoadObjectFromFile(AppDomain.CurrentDomain.BaseDirectory + @"\Project\tb.vpp") as CogToolBlock;
  1. cogToolBlockEditV21的主题(ToolBlock)添加一个事件处理程序,监听ToolBlock运行完成后的事件。
csharp 复制代码
cogToolBlockEditV21.Subject.Ran += Subject_Ran;
  1. 设置ToolBlock的输入参数FilterLowValueFilterHighValue的值,这些值来自用户界面上的数值控件(如nAreaLownAreaHigh)。
csharp 复制代码
cogToolBlockEditV21.Subject.Inputs["FilterLowValue"].Value = nAreaLow.Value;
cogToolBlockEditV21.Subject.Inputs["FilterHighValue"].Value = nAreaHigh.Value;
  1. cogToolBlockEditV21添加一个事件处理程序,监听主题变化的事件。这通常用于处理ToolBlock的更改,例如更新界面或执行其他操作。
csharp 复制代码
cogToolBlockEditV21.SubjectChanged += CogToolBlockEditV21_SubjectChanged;

5. 处理CogToolBlock事件

Csharp 复制代码
        private void CogToolBlockEditV21_SubjectChanged(object sender, EventArgs e)
        {
            //这意味着如果用户修改了ToolBlock的内容,那么为了避免在不稳定或未配置的状态下运行处理,该按钮将被禁用。
            btnRun.Enabled = false;
        }

        private void Subject_Ran(object sender, EventArgs e)
        {
            //检查 ToolBlock 的输出 InspectionPassed 的值。这个输出是一个布尔值,表示检测是否通过。如果通过,numPass(通过的计数)增加 1;如果未通过,则 numFail(未通过的计数)增加 1。
            if ((bool)cogToolBlockEditV21.Subject.Outputs["InspectionPassed"].Value==true)
            {
                numPass++;
            }
            else
            {
                numFail++;
            }
            lblPass.Text = numPass.ToString();
            lblFail.Text = numFail.ToString();
            //将 ToolBlock 的输入 Image 的值(应为一个图像对象)赋值给 cogRecordDisplay1.Image,将其显示在记录显示控件中
            cogRecordDisplay1.Image = cogToolBlockEditV21.Subject.Inputs["Image"].Value as CogImage8Grey;
            //从 ToolBlock 的工具集中获取名为 CogBlobTool1 的工具,并将其转换为 CogBlobTool 类型
            CogBlobTool blobTool = cogToolBlockEditV21.Subject.Tools["CogBlobTool1"] as CogBlobTool;
            //调用 blobTool 的 CreateLastRunRecord 方法,生成该工具上次运行的记录,并将其赋值给 cogRecordDisplay1.Record,以便在记录显示控件中显示相关信息
            cogRecordDisplay1.Record = blobTool.CreateLastRunRecord();
            //调用 cogRecordDisplay1.Fit(true) 方法,调整显示控件的内容以适应其可见区域。这使得用户能够清晰地看到图像和记录信息
            cogRecordDisplay1.Fit(true);
        }

6. 更新CogToolBlock输入值

Csharp 复制代码
        private void nAreaLow_ValueChanged(object sender, EventArgs e)
        {
            cogToolBlockEditV21.Subject.Inputs["FilterLowValue"].Value = nAreaLow.Value;
        }

        private void nAreaHigh_ValueChanged(object sender, EventArgs e)
        {
            cogToolBlockEditV21.Subject.Inputs["FilterHighValue"].Value=nAreaHigh.Value;
        }

7. 界面效果

到这里使用C#和CogToolBlock进行图像交互就完成了,当我们点击RunOnce按钮时,会查找面积范围在5000-8000范围内的硬币,找到的话会更新输出的Pass数量,没找到的话会更新Fail的数量,均已正确显示.另外,我们可以在下方输入的数字框通过更改面积上下限来查找指定范围内的硬币.

8. 项目示例

Visionpro二次开发:使用CogToolBlock进行图像交互

相关推荐
李小星同志31 分钟前
高级算法设计与分析 学习笔记6 B树
笔记·学习
霜晨月c43 分钟前
MFC 使用细节
笔记·学习·mfc
Jhxbdks1 小时前
C语言中的一些小知识(二)
c语言·开发语言·笔记
AlexMercer10121 小时前
【C++】二、数据类型 (同C)
c语言·开发语言·数据结构·c++·笔记·算法
friklogff1 小时前
【无标题】云端之C#:全面解析6种云服务提供商的SDK
开发语言·flask·c#
qq_15321452641 小时前
【2023工业异常检测文献】SimpleNet
图像处理·人工智能·深度学习·神经网络·机器学习·计算机视觉·视觉检测
微刻时光2 小时前
Redis集群知识及实战
数据库·redis·笔记·学习·程序人生·缓存
c#上位机2 小时前
C#事件的用法
java·javascript·c#
极客代码2 小时前
OpenCV Python 深度指南
开发语言·人工智能·python·opencv·计算机视觉
chnyi6_ya2 小时前
一些写leetcode的笔记
笔记·leetcode·c#