VisionPro 工具调用和工具组(ToolBlock)调用

发布时间 2023-08-25 13:31:41作者: 一杯清酒邀明月
VisionPro是Cognex的机器视觉算法软件,通常的做法是使用VS做二次开发。
这里主要分享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);