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进行图像交互

相关推荐
准橙考典27 分钟前
怎么能更好的通过驾考呢?
人工智能·笔记·自动驾驶·汽车·学习方法
喵~来学编程啦1 小时前
【论文精读】LPT: Long-tailed prompt tuning for image classification
人工智能·深度学习·机器学习·计算机视觉·论文笔记
密码小丑2 小时前
11月4日(内网横向移动(一))
笔记
鸭鸭梨吖3 小时前
产品经理笔记
笔记·产品经理
Envyᥫᩣ3 小时前
C#语言:从入门到精通
开发语言·c#
齐 飞3 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
丫头,冲鸭!!!4 小时前
B树(B-Tree)和B+树(B+ Tree)
笔记·算法
听忆.4 小时前
手机屏幕上进行OCR识别方案
笔记
Selina K5 小时前
shell脚本知识点记录
笔记·shell
5 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习