这里主要分享VisionPro中通过ToolBlock实现一个视觉检测,以及通过调用单个Tool实现一个视觉检测。
最终实现一个硬币数量检测以及坐标位置输出的应用:
使用ToolBlock的方式:
声明CogToolBlock类型的实例,并且序列化一个Vpp文件,编写vpp的过程这里不做赘述。
1 private CogToolBlock cogToolBlock2;
2 cogToolBlock2 = CogSerializer.LoadObjectFromFile(@"D:\C#Project\VisionPro_Control\VisionPro_Control\bin\x64\Debug\SampleVpp.vpp") as CogToolBlock;
3 //订阅ToolBlock的Ran事件,当ToolBlock执行完毕后程序会执行这个回调函数。
4 cogToolBlock2.Ran += new EventHandler(OnToolBlockRan);
由于这里使用的图片回放的方式,并非工业相机,所以需要申明一个CogImageFileTool类型,以获取图像或者图像集(idb、cdb)文件。(如果是接入工业相机,则需要声明CogAcqFifoTool采像工具,或者实现ICogFrameGrabber接口的方式从相机中取像。)
1 private CogImageFileTool cogImageFileTool2;
2 cogImageFileTool2.Operator.Open(@"F:\VPRO_Install\VisionPro\Images\coins.idb", CogImageFileModeConstants.Read);
为ToolBlock传入图像,并运行ToolBlock
1 //运行一次imageFileTool,则可以通过OutputImage属性获取到一张ICogImage类型的图片
2 cogImageFileTool2.Run();
3 //将获取的图片赋值给ToolBlock的Image引脚,这里的Inputs是一个只读索引器
4 //可以通过["Image"]赋值,前提是"Image"没有被重命名。也可以通过[0]的方式赋值。
5 cogToolBlock2.Inputs["Image"].Value = cogImageFileTool2.OutputImage as CogImage8Grey;
6 //除了传图片给ToolBlock之外,还可以传参数进去,比如传入Pattern的查找概数限制。
7 cogToolBlock2.Inputs["SetCount"].Value = (int)nud_SetCount.Value;
8 //图片有了,参数有了,运行ToolBlock
9 cogToolBlock2.Run();
获取运行结果:
1 private void OnToolBlockRan(object sender, EventArgs e)
2 {
3 //声明一个List集合获取ToolBlock的各种类型的运行结果
4 List<DataObj> dataList = new List<DataObj>();
5 //获取ToolBlock的结果输出引脚集合
6 CogPMAlignResults resultList = (CogPMAlignResults)cogToolBlock2.Outputs["ResultList"].Value;
7 //遍历,并添加到List集合中
8 foreach (CogPMAlignResult item in resultList)
9 {
10 dataList.Add(new DataObj(item.ID, item.GetPose().TranslationX, item.GetPose().TranslationY, item.GetPose().Rotation, item.GetPose().Scaling, item.Score));
11 }
12 //将获取到的集合赋值给DataGridView控件作为显示的图像源
13 dgv_DataList.DataSource = dataList;
14
15 //一般来说这里要做界面图片显示部分,这里不再赘述
16 }
使用单工具调用的方式:
声明工具实例:工具vpp文件的编写这里不做赘述
1 private CogImageFileTool cogImageFileTool; //图像文件
2 private CogPMAlignTool cogPMAlignTool; //PMAlign图像识别工具
3 private CogFixtureTool cogFixtureTool; //位置修正工具
4 private CogBlobTool cogBlobTool; //斑点工具
5
6 cogImageFileTool = new CogImageFileTool();
7 cogPMAlignTool = new CogPMAlignTool();
8 cogImageFileTool.Operator.Open(@"F:\VPRO_Install\VisionPro\Images\bracket_std.idb", CogImageFileModeConstants.Read);
9 cogPMAlignTool = CogSerializer.LoadObjectFromFile(toolVpp + "pmalign_tool.vpp") as CogPMAlignTool;
按顺序运行工具:
1 //获取图像
2 cogImageFileTool.Run();
3 //将图像赋值给PMAlign工具,并运行
4 cogPMAlignTool.InputImage = cogImageFileTool.OutputImage as CogImage8Grey;
5 cogPMAlignTool.Run();
6 //将图像赋值给定位修正工具,并获取PMAlign工具的线性转换矩阵
7 cogFixtureTool.InputImage = cogImageFileTool.OutputImage as CogImage8Grey;
8 cogFixtureTool.RunParams.UnfixturedFromFixturedTransform = cogPMAlignTool.Results[0].GetPose();
9 cogFixtureTool.Run();
10 //将位置修正后的图像赋值给Blob工具,并运行
11 cogBlobTool.InputImage = cogFixtureTool.OutputImage as CogImage8Grey;
12 cogBlobTool.Run();
获取Blob工具的结果:
1 //这里显示在CogDisplay控件上,当然也可以显示在CogRecordDisplay控件上
2 cogDisplay1.StaticGraphics.Clear();
3 cogDisplay1.Image = image;
4 //遍历Blob的结果集合,然后添加到CogDisplay绘制,这里显示斑点中心|边框
5 foreach (CogBlobResult item in cogBlobTool.Results.GetBlobs())
6 {
7 //CogBlobResult包含了这个斑点的所有信息,包括CenterOfMassX,CenterOfMassY,Area等等。。
8 cogDisplay1.StaticGraphics.Add(item.CreateResultGraphics(CogBlobResultGraphicConstants.Boundary | CogBlobResultGraphicConstants.CenterOfMass), "");
9 }
10 cogDisplay1.Fit(true);