作业1: 线序识别 :通过线的颜色来判断线序颜色 并标注颜色
1. 二值图转换
2.模板匹配
3.定位工具
4.使用色彩匹配工具 对每个位置的线 都进行匹配 一共需要7个工具
1.提取7中色彩
2.对于每个线分别进行区域检测
#region namespace imports
using 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.ImageProcessing;
using Cognex.VisionPro.PMAlign;
using Cognex.VisionPro.CalibFix;
using Cognex.VisionPro.ColorMatch;
#endregionpublic class CogToolBlockAdvancedScript : CogToolBlockAdvancedScriptBase
{
#region Private Member Variables
private Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock;
//设置7个匹配工具字段
private CogColorMatchTool pnt01;
private CogColorMatchTool pnt02;
private CogColorMatchTool pnt03;
private CogColorMatchTool pnt04;
private CogColorMatchTool pnt05;
private CogColorMatchTool pnt06;
private CogColorMatchTool pnt07;
//设置7个文字工具
private CogGraphicLabel pnt01Label;
private CogGraphicLabel pnt02Label;
private CogGraphicLabel pnt03Label;
private CogGraphicLabel pnt04Label;
private CogGraphicLabel pnt05Label;
private CogGraphicLabel pnt06Label;
private CogGraphicLabel pnt07Label;
public override bool GroupRun(ref string message, ref CogToolResultConstants result)
{
//初始化 7个工具
pnt01Label = new CogGraphicLabel();
pnt02Label = new CogGraphicLabel();
pnt03Label = new CogGraphicLabel();
pnt04Label = new CogGraphicLabel();
pnt05Label = new CogGraphicLabel();
pnt06Label = new CogGraphicLabel();
pnt07Label = new CogGraphicLabel();
// 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();
// #endif
// Run each tool using the RunTool function
foreach(ICogTool tool in mToolBlock.Tools)
mToolBlock.RunTool(tool, ref message, ref result);
//映射对应的颜色匹配工具
pnt01 = mToolBlock.Tools["CogColorMatchTool1"]as CogColorMatchTool;
pnt02 = mToolBlock.Tools["CogColorMatchTool2"]as CogColorMatchTool;
pnt03 = mToolBlock.Tools["CogColorMatchTool3"]as CogColorMatchTool;
pnt04 = mToolBlock.Tools["CogColorMatchTool4"]as CogColorMatchTool;
pnt05 = mToolBlock.Tools["CogColorMatchTool5"]as CogColorMatchTool;
pnt06 = mToolBlock.Tools["CogColorMatchTool6"]as CogColorMatchTool;
pnt07 = mToolBlock.Tools["CogColorMatchTool7"]as CogColorMatchTool;
//文字工具设置颜色
pnt01Label.Color = CogColorConstants.Green;
pnt02Label.Color = CogColorConstants.Green;
pnt03Label.Color = CogColorConstants.Green;
pnt04Label.Color = CogColorConstants.Green;
pnt05Label.Color = CogColorConstants.Green;
pnt06Label.Color = CogColorConstants.Green;
pnt07Label.Color = CogColorConstants.Green;
//文字工具设置位置 和对应结果
pnt01Label.SetXYText(100, 400, pnt01.Result.ResultOfBestMatch.Color.Name);
pnt02Label.SetXYText(300, 400, pnt02.Result.ResultOfBestMatch.Color.Name);
pnt03Label.SetXYText(500, 400, pnt03.Result.ResultOfBestMatch.Color.Name);
pnt04Label.SetXYText(700, 400, pnt04.Result.ResultOfBestMatch.Color.Name);
pnt05Label.SetXYText(900, 400, pnt05.Result.ResultOfBestMatch.Color.Name);
pnt06Label.SetXYText(1100, 400, pnt06.Result.ResultOfBestMatch.Color.Name);
pnt07Label.SetXYText(1300, 400, pnt07.Result.ResultOfBestMatch.Color.Name);
return false;
}
public override void ModifyCurrentRunRecord(Cognex.VisionPro.ICogRecord currentRecord)
{
}
public override void ModifyLastRunRecord(Cognex.VisionPro.ICogRecord lastRecord)
{
//文字工具添加到窗口中
mToolBlock.AddGraphicToRunRecord(pnt01Label, lastRecord, "CogImageConvertTool1.InputImage", "script");
mToolBlock.AddGraphicToRunRecord(pnt02Label, lastRecord, "CogImageConvertTool1.InputImage", "script");
mToolBlock.AddGraphicToRunRecord(pnt03Label, lastRecord, "CogImageConvertTool1.InputImage", "script");
mToolBlock.AddGraphicToRunRecord(pnt04Label, lastRecord, "CogImageConvertTool1.InputImage", "script");
mToolBlock.AddGraphicToRunRecord(pnt05Label, lastRecord, "CogImageConvertTool1.InputImage", "script");
mToolBlock.AddGraphicToRunRecord(pnt06Label, lastRecord, "CogImageConvertTool1.InputImage", "script");
mToolBlock.AddGraphicToRunRecord(pnt07Label, lastRecord, "CogImageConvertTool1.InputImage", "script");
}
public override void Initialize(Cognex.VisionPro.ToolGroup.CogToolGroup host)
{
// DO NOT REMOVE - Call the base class implementation first - DO NOT REMOVE
base.Initialize(host);
// Store a local copy of the script host
this.mToolBlock = ((Cognex.VisionPro.ToolBlock.CogToolBlock)(host));
}
}
作业2:注胶有无识别:判断图中产品周边槽及中心孔内注胶有无。蓝色为有胶,黑色为无胶 并标注颜色
1.添加提取颜色工具
2.对有胶的图片进行颜色提取
3.依据获得的像素值 (如果是0 就是无胶 )
作业3: 密封条胶塞颜色识别:识别图中出现的密封条胶塞的颜色,并标注颜色
1.使用颜色提取工具对 每张图中的 不同颜色的密封胶条 提取色彩
2.使用blob工具 提取结果 如果能提取出 结果 说明 有对应颜色密封胶条
1.哪个blob中有结果 证明 颜色存在
#region namespace imports
using 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.Blob;
#endregionpublic class CogToolBlockAdvancedScript : CogToolBlockAdvancedScriptBase
{
#region Private Member Variables
private Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock;
//设置4个blob工具字段
private CogBlobTool orange;
private CogBlobTool yellow;
private CogBlobTool red;
private CogBlobTool blue;
//设置4个文本工具字段
private CogGraphicLabel orangeLabel;
private CogGraphicLabel yellowLabel;
private CogGraphicLabel redLabel;
private CogGraphicLabel blueLabel;
#endregion
public override bool GroupRun(ref string message, ref CogToolResultConstants result)
{
//初始化4个文本工具
orangeLabel = new CogGraphicLabel();
yellowLabel = new CogGraphicLabel();
redLabel = new CogGraphicLabel();
blueLabel = new CogGraphicLabel();
// 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();
// #endif
// Run each tool using the RunTool function
foreach(ICogTool tool in mToolBlock.Tools)
mToolBlock.RunTool(tool, ref message, ref result);
//根据blob检测结果的个数判断 颜色是否符合
orange = mToolBlock.Tools["CogBlobToolOrange"]as CogBlobTool;
if(orange.Results.GetBlobs().Count >= 1)
{
orangeLabel.Color = CogColorConstants.White;
orangeLabel.SetXYText(200, 200, "橙色");
}
yellow = mToolBlock.Tools["CogBlobToolYellow"]as CogBlobTool;
if(yellow.Results.GetBlobs().Count >= 1)
{
yellowLabel.Color = CogColorConstants.White;
yellowLabel.SetXYText(200,200,"黄色");
}
red = mToolBlock.Tools["CogBlobToolRed"]as CogBlobTool;
if(red.Results.GetBlobs().Count >= 1)
{
redLabel.Color = CogColorConstants.White;
redLabel.SetXYText(200, 200, "红色");
}
blue = mToolBlock.Tools["CogBlobToolBlue"]as CogBlobTool;
if(blue.Results.GetBlobs().Count >= 1)
{
blueLabel.Color = CogColorConstants.White;
blueLabel.SetXYText(200, 200, "蓝色");
}return false;
}
public override void ModifyCurrentRunRecord(Cognex.VisionPro.ICogRecord currentRecord)
{
}
public override void ModifyLastRunRecord(Cognex.VisionPro.ICogRecord lastRecord)
{
// 根据blob检测结果的个数判断 添加对应文本工具
if(orange.Results.GetBlobs().Count >= 1)
{
mToolBlock.AddGraphicToRunRecord(orangeLabel, lastRecord, "CogColorExtractorToolOrange.InputImage", "script");
}
if(yellow.Results.GetBlobs().Count >= 1)
{
mToolBlock.AddGraphicToRunRecord(yellowLabel, lastRecord, "CogColorExtractorToolOrange.InputImage", "script");
}
if(red.Results.GetBlobs().Count >= 1)
{
mToolBlock.AddGraphicToRunRecord(redLabel, lastRecord, "CogColorExtractorToolOrange.InputImage", "script");
}
if(blue.Results.GetBlobs().Count >= 1)
{
mToolBlock.AddGraphicToRunRecord(blueLabel, lastRecord, "CogColorExtractorToolOrange.InputImage", "script");
}
}
public override void Initialize(Cognex.VisionPro.ToolGroup.CogToolGroup host)
{
// DO NOT REMOVE - Call the base class implementation first - DO NOT REMOVE
base.Initialize(host);
// Store a local copy of the script host
this.mToolBlock = ((Cognex.VisionPro.ToolBlock.CogToolBlock)(host));
}
#endregion}
CogCalibCheckerboardTool 工具原理:
校正图像以保证其返回的结果具有意义的值,
以及确定所找到图像的位置与校正板的物理尺寸之间的二维转换
作用1:像素和真实单位(mm)之间的转换
(比如卡尺工具测量宽度:校正前为像素单位,校正后为长度单位)
作用2:纠正线性或者非线性转换畸变,非线性转换说明存在光学或者透视扭曲。有三种常见的扭曲类型需要说明:纵横,透视,放射
标定片类别
无基准符号版
无基准符号版 校正原点:在视野中心最近的格子顶点或点中心作为原点
有基准符号版
有基准符号版 校正原点:以两个交叉矩形表示
如果找到,该点将成为原始校准空间的原点
如果没有找到,校准原点是最接近校准图像中心的顶点
有基准符号版 -数据矩阵版(DataMatrix代码版)
DataMatrix代码板:记录多个网格顶点的位置以及板的网格间距
校准板特点总结:
黑白瓷块必须以交叉图案方式排列
黑白瓷块必须具有同样的尺寸
瓷块必须为矩形,其纵横比范围是0.90 到1.10
在通过相机采集的校正板图像时。
1.所采集的图像必须包括至少9个完整瓷块
2.所采集的图像中的瓷块必须至少为15×15像素
3.增加校准图像中可见的瓷块数量(通过减小校准板上瓷块的尺寸) 提高校准的精确度
校准工具做了什么?
获得两组点:
1. 校准版校正原点
2. 采集的图像中的原点
完成的功能:
3.经过工具计算 表示两个图像中对应点之间的映射关系(单位转换)
4.经过工具计算畸变图像消除在校准过程中扭曲(消除畸变)
校准的基本方法与过程
- 架设好图像采集系统,固定相机、镜头、光源等器件
- 选择合适的标定片,放置到视野下,采集1张清晰的图像
- 将标定板照片,导入校准工具(CogCalibCheckerboard),设置参数计算标定
1.校正工具
1.无基准符号的校正版使用方式
(1)调整校正版样式
(2)调整校正板的基准符号
(3 )调整棋盘格的大小 (现实中校正板 棋盘格尺寸)
(4) 抓取校正图形
(5) 计算校正
原点
点结果
转换结果界面
1.RMS误差 越小 矫正效果越好
2.纵横比 越接近1 矫正效果越好
3.旋转 缩放 越接近0 矫正效果越好
2.有基准符号的校正板使用
3. 带有二维码的校准板
案例:利用标定工具 -测量卡尺工具边缘对距离 (像素转换成毫米)
1.先选择校正板图片 校准后 换测量图片
2.进行模板匹配和定位
4.使用校准工具后 测量的 结果
未使用校正板
CogPatInspectTool工具解析
用途:
检测产品特征缺失或错位、产品上存在错误或无用的标记、表面颜色错误等等场合;
原理:
通过PMAlign工具实现,用训练图片和当前输入图片进行对比从而得到缺陷.
使用场景:
案例:标签信息缺陷检测
1.添加模板匹配工具 用于缺陷检测图形定位处理
1.添加缺陷检测工具
1.“pose”链接到CogPMAlignTool的GetPose输出 用于定位
1.点击外层ToolGroup的运行按钮,使得CogPatInspectTool 获取到一幅良品图像,点击“抓取训练图像与原点”,得到用于训练的图像;
2.在右侧的下拉列表中选择Current.TrainImage,选择检测区域,可以通过掩膜对检测区域进行调整,屏蔽变量部分与光照不稳定部分,从而避免检测过程中的误检。
3.点击“训练新模式”,此时相当于提供了一幅良品图像到工具中,
4.如果想添加多副训练图像需要从外层运行程序,使得CogPatInspectTool重新获取一幅图像,点击“统计训练当前模式”。注意,在训练过程中的添加的图像必须是良品图像,如果误将不良品图像添加到训练数据中会造成灾难性的后果。
5.训练图像添加完成之后,点击“结束统计训练”,
6.如果对当前的训练结果不满意,点击“取消训练模式”,所有的训练数据清空,可以重新进行添加训练图像。
1.选择 lastRun.MatchImage 然后点击外层ToolGroup的运行按钮, 对当前输入图像进行检测即可以看到运行效果。match image 时将当前图像的待检测区域与训练图像对其之后的结果图 ,在明显的缺陷区域标注出来。
1.CogPatInspectTool 最终目的是获取DifferenceImageAbsolute图像,将此图像输出到blob等工具根据检测面积、位置等进行过滤,最后得出检测结果。
1.添加blob工具对于缺陷部位进行分析
扩展内容:
1.选择对应的归一化算法 目的 调整图形亮度算法
为了抑制因光照不稳定引起的误检,运行时图像与训练图像进行对比前需要对运行时图像进行归一化,调节整体亮度水平,使得运行时图像与训练后图像在同一亮度环境中进行比较。CogPatInspectTool的方法有以下几种:
- Identity
对运行时图像不进行归一化,主要是在测试阶段用来进行观察,确定不进行归一化可能出现的缺陷位置与缺陷类型 - Histogram Equalization
直方图均衡化,调整运行时图像的灰度直方图与训练后图像的灰度直方图相匹配,适用于检测面积比较小的情况,因为大面积出现缺陷会影响灰度直方图分布。 - Match Tails
忽略“高尾部”与“低尾部”对运行时图像的直方图进行调整与训练后的图像相匹配,适用于图像中可能出现阴影或者耀光的情况。 - Mean and Standard Deviation
通过运行时图像灰度直方图的平均值与标准差对灰度直方图进行调整,适用于大小适中的缺陷检测以及光照变换比较明显的情况。 - Robust Line Fit
通过选择最佳拟合的线性直方图均衡化函数来调整像素值。与其它的归一化方法相比,该方法可以容忍更大的缺陷,但需要更多的处理时间。当缺陷面积超过加检测区域的四分之一甚至更多时,并且缺陷像素值可以位于参考图像的左右尾部之外时,请使用稳健的线拟合方法。 - Local Correction or Enhanced Local Correction
局部修正方法,先对运行时图像进行矩形分割,再对每个区域进行归一化处理
阈值
阈值就是训练基准图案和检查的图片之间的差异,值越大,忽略的细节就越多
如:图案很相似,但是当阈值小的时候,还是会计算出一些差距
如果想忽略一些细微差距,就可以调整阈值