本示例演示了如何通过图像数据库使用 CogImageFileTool,并将其放入 CogToolGroup 中,对于数据库中的每个图像运行一次检测.
当用户按下 运行 按钮时,程序执行以下操作:
如果工具组中没有 CogImageFileTools,它将显示一条消息,告知用户该应用程序至少需要一个 CogImageFileTool,并且不再继续执行。
它遍历工具组,并将所有 CogImageFileTools 重置为其图像数据库中的第一张图像(如果它们有打开的数据库)。
它遍历工具组,并重置找到的任何 CogDataAnalysisTools 的统计信息。
它反复运行工具组,直到工具组中的第一个 CogImageFileTool 达到其数据库中的最后一张图像.
1. 界面设计
添加CogToolGroup控件和ListView,Button,一些文本和文本框.
2. 添加引用
using Cognex.VisionPro;
using Cognex.VisionPro.Exceptions;
using Cognex.VisionPro.ImageFile;
using Cognex.VisionPro.ToolGroup;
3. 声明变量
private string TItle = "Cognex VisionPro CogToolGroup Test Applicaiton";
private bool mTestInProgress;
private long mAccept;
private long mWarn;
private long mReject;
private long mError;
private CogToolGroup toolGroup;
private CogImageFileTool imageFileTool;
4. 运行按钮事件处理
-
try-catch 块:
- 代码的主要逻辑放在
try
块中,目的是捕捉在执行过程中可能出现的异常。catch
块用于处理特定类型的异常(如CogException
和一般的Exception
),并显示相应的错误信息。
- 代码的主要逻辑放在
-
测试进行状态检查:
if (mTestInProgress) { mTestInProgress = false; return; }
- 检查是否有测试正在进行。如果有,则将
mTestInProgress
设置为false
并返回,停止当前操作。
- 检查是否有测试正在进行。如果有,则将
-
工具组初始化:
toolGroup = cogToolGroupEditV21.Subject;
- 从
cogToolGroupEditV21
获取当前的工具组。
- 从
-
重置统计计数器:
mAccept = 0; mWarn = 0; mReject = 0; mError = 0; UpdateTotals(); listView1.Items.Clear(); listView1.Activation = ItemActivation.OneClick;
- 初始化接受、警告、拒绝和错误的计数器,并更新总计。清空
listView1
的项目,并设置激活模式为单击。
- 初始化接受、警告、拒绝和错误的计数器,并更新总计。清空
-
重置图像工具:
for (int i = toolGroup.Tools.Count - 1; i >= 0; i--) { if (toolGroup.Tools[i] is CogImageFileTool) { imageFileTool = (CogImageFileTool)toolGroup.Tools[i]; imageFileTool.NextImageIndex = 0; // 重置为第一张图片 } }
- 遍历工具组中的所有工具,查找
CogImageFileTool
类型的工具,并将其NextImageIndex
重置为 0(即第一张图片)。
- 遍历工具组中的所有工具,查找
-
工具有效性检查:
- 检查
imageFileTool
是否为null
,确保工具组至少有一个图像文件工具。 - 检查
imageFileTool.Operator.Count
,确保工具有可处理的图像文件。 - 检查
imageFileTool.ImageIndexIncrement
,确保图像索引增量非零。
- 检查
-
重置数据分析工具的参数:
foreach (var item in toolGroup.Tools) { if (item is CogDataAnalysisTool dataAnalysisTool) { dataAnalysisTool.RunParams.ResetBufferedValues(); dataAnalysisTool.RunParams.ResetRunningStatistics(); } }
- 遍历工具组中的所有工具,重置数据分析工具的缓冲值和运行统计信息。
-
开始测试:
button1.Text = "停止运行"; mTestInProgress = true;
- 更新按钮文本为“停止运行”,并将
mTestInProgress
设置为true
。
- 更新按钮文本为“停止运行”,并将
-
处理图像:
long numProcessed = 0; do { this.Text = $"{TItle}({numProcessed}) of {imageFileTool.Operator.Count}"; toolGroup.Run(); numProcessed++; ListViewItem newItem = new ListViewItem((numProcessed - 1).ToString()); // 添加处理时间和结果到 ListView ... listView1.Items.Add(newItem); UpdateTotals(); Application.DoEvents(); } while (mTestInProgress && imageFileTool.CurrentImageIndex < imageFileTool.Operator.Count - 1);
- 使用
do-while
循环处理图像,更新窗口标题以显示处理状态。每次处理后将结果添加到listView1
中,并更新统计信息。
- 使用
-
结束测试:
button1.Text = "运行"; mTestInProgress = false; this.Text = TItle;
- 更新按钮文本为“运行”,将
mTestInProgress
设置为false
,并重置窗口标题。
- 更新按钮文本为“运行”,将
-
异常处理:
catch (CogException ex) { MessageBox.Show(ex.Message); } catch (Exception gex) { MessageBox.Show(gex.Message); }
- 捕捉
CogException
和一般的Exception
,并显示相应的错误消息。
- 捕捉
5. ListView事件处理
这段代码包含三个事件处理程序,主要用于处理 ListView
控件中的特定用户交互。下面是对每个方法的详细解释:
listView1_BeforeLabelEdit
private void listView1_BeforeLabelEdit(object sender, LabelEditEventArgs e)
{
e.CancelEdit = true;
}
- 目的:此方法在用户尝试编辑
ListView
控件中的标签(即项目名称)之前触发。 - 参数:
sender
:触发事件的对象,通常是listView1
。e
:包含事件数据的LabelEditEventArgs
对象。
- 逻辑:
- 通过设置
e.CancelEdit = true;
,此方法阻止用户编辑ListView
项目的名称。这意味着用户无法更改ListView
中项目的标签。
- 通过设置
listView1_ColumnClick
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
if (listView1.Sorting == SortOrder.Ascending || listView1.Sorting == SortOrder.None)
{
listView1.Sorting = SortOrder.Descending;
}
else
{
listView1.Sorting = SortOrder.Ascending;
}
}
- 目的:此方法在用户点击
ListView
的列标题时触发,目的是切换排序顺序。 - 参数:
sender
:触发事件的对象,通常是listView1
。e
:包含事件数据的ColumnClickEventArgs
对象,提供有关单击的列的信息。
- 逻辑:
- 检查当前的排序状态:
- 如果当前排序为升序(
SortOrder.Ascending
)或没有排序(SortOrder.None
),则将排序状态切换为降序(SortOrder.Descending
)。 - 如果当前排序为降序,则将排序状态切换为升序(
SortOrder.Ascending
)。
- 如果当前排序为升序(
- 这种实现允许用户通过单击列标题来快速切换排序方式。
- 检查当前的排序状态:
listView1_ItemActivate
private void listView1_ItemActivate(object sender, EventArgs e)
{
if (mTestInProgress)
{
return;
}
CogToolGroup toolGroup = cogToolGroupEditV21.Subject;
CogImageFileTool imageFileTool = null;
for (int i = 0; i < toolGroup.Tools.Count; i++)
{
if (toolGroup.Tools[i] is CogImageFileTool)
{
imageFileTool = (CogImageFileTool)toolGroup.Tools[i];
imageFileTool.NextImageIndex = int.Parse(listView1.SelectedItems[0].SubItems[0].Text);
}
}
toolGroup.Run();
}
- 目的:此方法在用户激活(单击)
ListView
中的某个项目时触发。 - 参数:
sender
:触发事件的对象,通常是listView1
。e
:包含事件数据的EventArgs
对象。
- 逻辑:
- 首先检查是否有测试正在进行(
mTestInProgress
)。如果是,则直接返回,不执行后续操作。 - 获取当前的工具组
toolGroup
。 - 遍历工具组中的所有工具,寻找类型为
CogImageFileTool
的工具。- 一旦找到,设置其
NextImageIndex
为用户在ListView
中选择的项目的索引。这个索引是通过解析所选项目的第一个子项(通常是图像索引)来获取的。
- 一旦找到,设置其
- 调用
toolGroup.Run()
来运行工具组,处理新的图像。
- 首先检查是否有测试正在进行(
6. 添加工具
运行程序,在CogToolGroup控件添加CogImageFileTool,CogIDTool,CogDataAnalysisTool工具,并连线
- 图片选择C:\Program Files\Cognex\VisionPro\Images\barcode.cdb使用.
- 运行图片文件可知,至少2个条码,最多4个.因此CogDataAnalysisTool工具设置拒绝下限为0,警告下限为1.
7. 界面效果
运行项目,发现所有条码均已检测到,listView和计数器均正常显示结果.
到这里,使用C#和CogToolGroup控件进行二次开发进行图像检测就完成了.
8. 项目示例
VisionPro二次开发:使用CogToolGroup控件进行图像检测