
案例1蓝色工件破损检测 并且标绘出缺陷轮廓1.颜色提取工具 目的获取输出一个灰度图像用于blob检测1.提取多的特征颜色 目的: 是灰度图的特征更明显1.提取效果图1.blob工具#region namespace importsusing System;using System.Collections;using System.Drawing;using System.IO;using System.Windows.Forms;using Cognex.VisionPro;using Cognex.VisionPro.ToolBlock;using Cognex.VisionPro3D;using Cognex.VisionPro.ColorExtractor;using Cognex.VisionPro.ImageProcessing;using Cognex.VisionPro.PMAlign;using Cognex.VisionPro.CalibFix;using Cognex.VisionPro.Caliper;using Cognex.VisionPro.Blob;#endregionpublic class CogToolBlockAdvancedScript : CogToolBlockAdvancedScriptBase{#region Private Member Variablesprivate Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock;#endregionCogGraphicCollection col;public override bool GroupRun(ref string message, ref CogToolResultConstants result){// To let the execution stop in this script when a debugger is attached, uncomment the following lines.// #if DEBUG// if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break();// #endifcol new CogGraphicCollection();CogBlobTool blob mToolBlock.Tools[CogBlobTool1] as CogBlobTool;// Run each tool using the RunTool functionforeach(ICogTool tool in mToolBlock.Tools)mToolBlock.RunTool(tool, ref message, ref result);for (int i 0; i blob.Results.GetBlobs().Count; i){// CogPolygon边界显示图形CogPolygon p new CogPolygon();// 获取blob结果的Boundary边界p blob.Results.GetBlobs()[i].GetBoundary();p.Color CogColorConstants.Red;col.Add(p);}return false;}public override void ModifyLastRunRecord(Cognex.VisionPro.ICogRecord lastRecord){for (int i 0; i col.Count; i){mToolBlock.AddGraphicToRunRecord(col[i], lastRecord, CogIPOneImageTool1.InputImage, script);}}public override void Initialize(Cognex.VisionPro.ToolGroup.CogToolGroup host){// DO NOT REMOVE - Call the base class implementation first - DO NOT REMOVEbase.Initialize(host);// Store a local copy of the script hostthis.mToolBlock ((Cognex.VisionPro.ToolBlock.CogToolBlock)(host));}#endregion}案例2:齿轮内径检测1.使用模板匹配2.设置匹配区域3.使用掩膜不必要的干扰 保留两个内径的圆形1.添加找圆工具2.添加模板匹配中心坐标3.给外圈圆添加找圆工具RunParams.ExpectedCircularArc.CenterXRunParams.ExpectedCircularArc.CenterY 找圆工具圆心坐标因为我们模板匹配的是圆形 所引 匹配的圆形坐标 就是 找圆工具坐标1.显示结果添加了 圆形图案 CogCircle circle文本 CogGraphicLabel labelpublic class CogToolBlockAdvancedScript : CogToolBlockAdvancedScriptBase{#region Private Member Variablesprivate Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock;#endregion//声明图形集合private CogGraphicCollection col new CogGraphicCollection();public override bool GroupRun(ref string message, ref CogToolResultConstants result){//声明pmaCogPMAlignTool pma mToolBlock.Tools[CogPMAlignTool1] as CogPMAlignTool;//声明找圆CogFindCircleTool fc mToolBlock.Tools[CogFindCircleTool1] as CogFindCircleTool;//声明一个圆图形变量 目的是在图形界面显示每一个找到的圆CogCircle circle;//声明一个label标签 目的是在图形界面显示每一个找到的圆半径CogGraphicLabel label;//清空col.Clear();// Run each tool using the RunTool functionforeach(ICogTool tool in mToolBlock.Tools)mToolBlock.RunTool(tool, ref message, ref result);//遍历pma结果for (int i 0; i pma.Results.Count; i){//为找圆工具添加圆心fc.RunParams.ExpectedCircularArc.CenterX pma.Results[i].GetPose().TranslationX;fc.RunParams.ExpectedCircularArc.CenterY pma.Results[i].GetPose().TranslationY;//运行找圆fc.Run();//给变量圆赋值circle new CogCircle();//获取找圆工具结果的圆形对象circle fc.Results.GetCircle();circle.Color CogColorConstants.Orange;//向集合中添加圆图形col.Add(circle);//创建文字图像对象label new CogGraphicLabel();label.SetXYText(circle.CenterX, circle.CenterY, 半径 circle.Radius.ToString(0.00));label.Color CogColorConstants.Red;//向集合中添加labelcol.Add(label);}return false;}public override void ModifyLastRunRecord(Cognex.VisionPro.ICogRecord lastRecord){for (int i 0; i col.Count; i){mToolBlock.AddGraphicToRunRecord(col[i], lastRecord, CogPMAlignTool1.InputImage, Script);}}案例3齿轮圆形到齿轮角距离检测 求出最大值最小值 平均值1.模板匹配齿轮 目的匹配整个齿轮特征1.FixTure齿轮定位 后续提供定位参考1.模板匹配单个齿轮角2.设置查找概数 等其他参数 目的匹配所有齿轮角特征1.模板匹配单个齿轮角1.卡尺工具 查找每个齿轮角的边线2. 模板匹配每个卡尺坐标赋值给 卡尺工具的仿射矩形中心点坐标 Region.centerX Region.centerY 目的为了给卡尺工具 提供坐标点参考2.不要需要使用fixTure 原因模板匹配2 提供坐标1.找圆 目的找到圆心坐标 用于后续点到点测量1.点到点的距离测量工具2.卡尺工具 Edge0.PositionX 和Edge0.PositionY 的坐标赋值给 点到点工具的 起点坐标3.找圆工具的圆心坐标赋值给 点到点工具的 终点坐标#region namespace importsusing System;using System.Collections;using System.Collections.Generic;using System.Drawing;using System.IO;using System.Windows.Forms;using Cognex.VisionPro;using Cognex.VisionPro.ToolBlock;using Cognex.VisionPro3D;using Cognex.VisionPro.PMAlign;using Cognex.VisionPro.CalibFix;using Cognex.VisionPro.Caliper;using Cognex.VisionPro.Dimensioning;#endregionpublic class CogToolBlockAdvancedScript : CogToolBlockAdvancedScriptBase{#region Private Member Variablesprivate Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock;#endregion//声明图像集合CogGraphicCollection col new CogGraphicCollection();public override bool GroupRun(ref string message, ref CogToolResultConstants result){// To let the execution stop in this script when a debugger is attached, uncomment the following lines.#if DEBUGif (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break();#endif//映射模板匹配对象CogPMAlignTool pma mToolBlock.Tools[CogPMAlignTool2] as CogPMAlignTool;//映射卡尺工具对象CogCaliperTool cal mToolBlock.Tools[CogCaliperTool1] as CogCaliperTool;//映射找圆工具对象CogFindCircleTool fc mToolBlock.Tools[CogFindCircleTool1] as CogFindCircleTool;//映射点到点距离工具对象CogDistancePointPointTool dis mToolBlock.Tools[CogDistancePointPointTool1] as CogDistancePointPointTool;//清空图像集合col.Clear();//声明集合 --存储距离数据Listdouble distances new Listdouble();foreach(ICogTool tool in mToolBlock.Tools)mToolBlock.RunTool(tool, ref message, ref result);//以模板匹配结果个数遍历for (int i 0; i pma.Results.Count; i){//获取pma结果的中心点坐标double x pma.Results[i].GetPose().TranslationX;double y pma.Results[i].GetPose().TranslationY;//角度 弧度 *180/PI//弧度 角度/180*PI//获取pma结果的弧度 转化成角度double angle pma.Results[i].GetPose().Rotation * 180 / Math.PI;//角度-90度 转换成弧度 供卡尺工具使用 目的确定卡尺 投影和搜索方向double rad (angle - 90) / 180 * Math.PI;//给卡尺工具赋值并运行卡尺工具cal.Region.CenterX x;cal.Region.CenterY y;//获取卡尺功的旋转度 弧度cal.Region.Rotation rad;cal.Run();//给点到点距离工具赋值dis.StartX fc.Results.GetCircle().CenterX;dis.StartY fc.Results.GetCircle().CenterY;dis.EndX cal.Results[0].Edge0.PositionX;dis.EndY cal.Results[0].Edge0.PositionY;dis.Run();//保存距离到距离集合distances.Add(dis.Distance);//创建线段t图形CogLineSegment line new CogLineSegment();//设置线段的起点和终点line.SetStartEnd(fc.Results.GetCircle().CenterX, fc.Results.GetCircle().CenterY, cal.Results[0].Edge0.PositionX, cal.Results[0].Edge0.PositionY);//设置线段颜色line.Color CogColorConstants.Red;//添加线段到图形集合中col.Add(line);//创建文本CogGraphicLabel label new CogGraphicLabel();// 设置文本的位置 和文本内容label.SetXYText(cal.Results[0].Edge0.PositionX, cal.Results[0].Edge0.PositionY, dis.Distance.ToString(0.00));//设置文本颜色label.Color CogColorConstants.Orange;//添加文本到图形集合中col.Add(label);}//筛选最大值和最小值和平均值double max 0;double min distances[0];double mean;double total 0;//遍历距离集合for (int i 0; i distances.Count; i){//取最大值if (distances[i] max)max distances[i];//取最小值if (distances[i] min)min distances[i];//累加所有数值 计算平均数total distances[i];}//取平均数mean total / distances.Count;//创建文本 显示最大值 最小值 平均值CogGraphicLabel label2 new CogGraphicLabel();label2.SetXYText(200, 150, 最大值 max.ToString(0.00));label2.Color CogColorConstants.Green;label2.Font new Font(宋体, 20);CogGraphicLabel label3 new CogGraphicLabel();label3.SetXYText(200, 180, 最小值 min.ToString(0.00));label3.Color CogColorConstants.Green;label3.Font new Font(宋体, 20);CogGraphicLabel label4 new CogGraphicLabel();label4.SetXYText(200, 210, 平均值 max.ToString(0.00));label4.Color CogColorConstants.Green;label4.Font new Font(宋体, 20);//添加到图形集合col.Add(label2);col.Add(label3);col.Add(label4);//把结果给赋值给Block 输出属性mToolBlock.Outputs[Max].Value max;mToolBlock.Outputs[Min].Value min;mToolBlock.Outputs[Mean].Value mean;return false;}public override void ModifyLastRunRecord(Cognex.VisionPro.ICogRecord lastRecord){//添加图形到lastRunRecord窗口for (int i 0; i col.Count; i){mToolBlock.AddGraphicToRunRecord(col[i], lastRecord, CogPMAlignTool1.InputImage, script);}}