该程序演示了如何使用CogToolBlock进行图像交互.
-
从vpp文件中加载一个ToolBlock。
-
用户可以通过应用程序窗体上的数字增减控件修改ToolBlock输入端子的值。
-
用户还可以从coins.idb或采集FIFO中选择图像。
-
"运行一次"按钮执行以下操作:
- 获取下一个图像或读取下一个图像
- 将图像传递给ToolBlock输入图像
- 运行ToolBlock一次
-
通过读取输出端子的值,以更新应用程序标签,显示检查结果。
-
用户可以更改代码以创建一个与可用摄像头特定配合的采集FIFO。
-
顶层脚本是一个简单的C#脚本,它运行工具。
-
TBInspectionTest ToolBlock被用作结果分析工具,以决定检查是通过还是失败,并设置输出端子的值。
-
用户通过菜单按钮运行ToolBlock,但ToolBlock将针对相同的图像运行。
-
还利用了运行事件,以便用来自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. 加载工具
- 将
cogToolBlockEditV21
的本地显示设置为不可见。这通常用于在不需要显示工具块的情况下运行工具,比如在后台处理图像。
csharp
cogToolBlockEditV21.LocalDisplayVisible = false;
- 创建一个新的图像文件工具实例,
imageFileTool
将用于处理图像文件。
csharp
imageFileTool = new CogImageFileTool();
- 打开一个图像数据库文件(
coins.idb
),文件路径是相对于当前应用程序的基目录。这允许工具读取图像数据。
csharp
imageFileTool.Operator.Open(AppDomain.CurrentDomain.BaseDirectory + @"\project\images\coins.idb", CogImageFileModeConstants.Read);
- 创建一个新的采集FIFO工具实例,
acqFifoTool
,用于处理图像采集。
csharp
acqFifoTool = new CogAcqFifoTool();
- 检查
acqFifoTool
的操作符是否为null
。如果是,则禁用与相机相关的控件(如radCamera
),表示没有有效的相机连接。
csharp
if (acqFifoTool.Operator == null)
{
radCamera.Enabled = false;
}
- 如果
acqFifoTool
的操作符不为null
,则设置曝光参数为10,配置相机的曝光时间。
csharp
else
{
acqFifoTool.Operator.OwnedExposureParams.Exposure = 10;
}
- 从指定的文件(
tb.vpp
)加载一个ToolBlock对象,并将其设置为cogToolBlockEditV21
的主题。这使得工具块可以在编辑器中进行操作。
csharp
cogToolBlockEditV21.Subject = CogSerializer.LoadObjectFromFile(AppDomain.CurrentDomain.BaseDirectory + @"\Project\tb.vpp") as CogToolBlock;
- 为
cogToolBlockEditV21
的主题(ToolBlock)添加一个事件处理程序,监听ToolBlock运行完成后的事件。
csharp
cogToolBlockEditV21.Subject.Ran += Subject_Ran;
- 设置ToolBlock的输入参数
FilterLowValue
和FilterHighValue
的值,这些值来自用户界面上的数值控件(如nAreaLow
和nAreaHigh
)。
csharp
cogToolBlockEditV21.Subject.Inputs["FilterLowValue"].Value = nAreaLow.Value;
cogToolBlockEditV21.Subject.Inputs["FilterHighValue"].Value = nAreaHigh.Value;
- 为
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的数量,均已正确显示.另外,我们可以在下方输入的数字框通过更改面积上下限来查找指定范围内的硬币.