齿轮缺角 引脚缺失 图像去噪

1.案例 齿轮缺角

1.预留图形预处理工具

1.边缘提取工具

利用copyRegin工具 实现 齿轮环 分割效果 为blob分析 齿轮缺失做准备

1和2 把 blob中的灰度图添加到 copyRegin的俩个图像输入参数中

3.把blob匹配结果中心坐标给copyRegin 匹配区域坐标

4.设置填充数值 128 目的 为了 使填充的区域灰度值和 目标图像背景灰度值 一致

5.填充区域设置

6.区域外 调整像素 调整为 不写入像素

1.勾选使用图像配对

1.运行

2.运行后最终效果 (此 图效果 可以清晰的匹配 每个齿轮)

1.使用blob工具

2.设置参数

3.匹配效果图

根据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.ImageProcessing;

using Cognex.VisionPro.PMAlign;

using Cognex.VisionPro.Blob;

#endregion

public class CogToolBlockAdvancedScript : CogToolBlockAdvancedScriptBase

{

#region Private Member Variables

private Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock;

#endregion

//定义图形集合

CogGraphicLabel label = new CogGraphicLabel();

public override bool GroupRun(ref string message, ref CogToolResultConstants result)

{

int count = (int)mToolBlock.Inputs["Count"].Value;

CogBlobTool blob = mToolBlock.Tools["CogBlobTool2"] as CogBlobTool;

// Run each tool using the RunTool function

foreach(ICogTool tool in mToolBlock.Tools)

mToolBlock.RunTool(tool, ref message, ref result);

//获取blob结果个数

int currentCount = blob.Results.GetBlobs().Count;

//获取齿轮差值

int diff = count - currentCount;

string res = "";

label.Color = CogColorConstants.Green;

label.Font = new Font("宋体", 20);

//根据差值判断是否有缺失

if (diff > 0)

{

res = "缺失:" + diff;

label.Color = CogColorConstants.Red;

}

else

{

res = "良品";

}

label.SetXYText(100, 250, res);

return false;

}
public override void ModifyLastRunRecord(Cognex.VisionPro.ICogRecord lastRecord)

{

mToolBlock.AddGraphicToRunRecord(label, lastRecord, "CogIPOneImageTool1.InputImage", "Script");

}

1使用cogIPoneImage去掉背景图中的白色噪点

2.添加灰阶形态NxM 内核高度与宽度 设置 3 x3

1.使用blob 匹配出图像中的引脚

1.设置过滤参数

1.使用卡尺工具 测量每个引脚距离 目的:检测是否有缺失的引脚

#region namespace imports

using 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.ImageProcessing;

using Cognex.VisionPro.Blob;

using Cognex.VisionPro.Caliper;

#endregion

public class CogToolBlockAdvancedScript : CogToolBlockAdvancedScriptBase

{

#region Private Member Variables

private Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock;

#endregion

//声明图形集合

private CogGraphicCollection col = new CogGraphicCollection();

//声明BlobTool成员变量

CogBlobTool blob;

// 声明卡尺工具成员变量

CogCaliperTool cal1;

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();

#endif

//映射blob

blob = mToolBlock.Tools["CogBlobTool1"] as CogBlobTool;

//映射卡尺工具

cal1 = mToolBlock.Tools["CogCaliperTool1"] as CogCaliperTool;

//判断是否有图形缺陷 true 为无缺陷 false反之

bool b = true;

//清空图形集合

col.Clear();

// Run each tool using the RunTool function

foreach(ICogTool tool in mToolBlock.Tools)

mToolBlock.RunTool(tool, ref message, ref result);

//

for (int i = 0; i < blob.Results.GetBlobs().Count; i++)

{

//获取角度

double angle = Math.Abs((blob.Results.GetBlobs()[i].Angle) * 180 / Math.PI);

//通过角度大小判断是否NG

if (Math.Abs(angle- 90) > 5)

{

//初始化

CogPolygon polygon = new CogPolygon();

polygon = blob.Results.GetBlobs()[i].GetBoundary();

polygon.Color = CogColorConstants.Red;

col.Add(polygon);

b = false;

}

//获取blob检测的高度

double h = blob.Results.GetBlobs()[i].GetMeasure(CogBlobMeasureConstants.BoundingBoxExtremaAngleHeight);

//通过Y坐标判断 斑点在上方还是下方

//上方

if (blob.Results.GetBlobs()[i].CenterOfMassY < 220)

{

//判断高度 大于110或者小于90 上方特征有缺陷

if (h > 110 || h < 90)

{

//

CogPolygon polygon = new CogPolygon();

polygon = blob.Results.GetBlobs()[i].GetBoundary();

polygon.Color = CogColorConstants.Red;

col.Add(polygon);

b = false;

}

}

//下方

else if(blob.Results.GetBlobs()[i].CenterOfMassY > 220)

{

//判断高度 大于65或者小于50 下方特征有缺陷

if (h > 65 || h < 50)

{

//初始化边界显示线

CogPolygon polygon = new CogPolygon();

polygon = blob.Results.GetBlobs()[i].GetBoundary();

polygon.Color = CogColorConstants.Red;

//添加到图形集合工具

col.Add(polygon);

b = false;

}

}

}

//卡尺判断间距 判断引脚是否有缺失

//初始化泛型集合

List<double> listX = new List<double>();

//循环 卡尺工具结果个数

for (int j = 0; j < cal1.Results.Count; j++)

{

//添加每个结果X坐标点到泛型集合中

listX.Add(cal1.Results[j].Edge0.PositionX);

}

listX.Sort();//升序 目的:把做升序排列 方便后续 进行差值计算

for (int i = 0; i < listX.Count - 1; i++)

{

//相邻坐标点求 差值

double width = listX[i + 1] - listX[i];

//差值大于80 证明引脚有缺失

if (width > 80)

{

//初始化图形限定框

CogRectangleAffine rec = new CogRectangleAffine();

//限定款位置

rec.CenterX = (listX[i + 1] + listX[i]) / 2;

rec.CenterY = cal1.Results[i].Edge0.PositionY;

rec.SideXLength = width;

rec.SideYLength = 100;

rec.Color = CogColorConstants.Red;

//添加到图形集合工具

col.Add(rec);

b = false;

}

}

//初始化label 显示NG 或者OK信息

CogGraphicLabel label = new CogGraphicLabel();

label.Font = new Font("微软雅黑", 20);

if (b)

{

label.SetXYText(100, 80, "OK");

label.Color = CogColorConstants.Green;

}

else

{

label.SetXYText(100, 80, "NG");

label.Color = CogColorConstants.Red;

}

//添加到图形集合工具

col.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, "CogIPOneImageTool1.InputImage", "Script");

}

}

1.图像去噪

中值Nxm: 内核高度和宽度 设置 7x7 消除干扰像素

灰度形态调整:设置腐蚀 来缩小白色区域 扩大黑色区域 加粗字体效果

相关推荐
极客小张6 分钟前
基于STM32的智能家居语音控制系统:集成LD3320、ESP8266设计流程
c语言·stm32·物联网·算法·毕业设计·课程设计·语言识别
Winner13004 小时前
STM32 OLED
stm32·单片机·嵌入式硬件
浅陌pa4 小时前
01:(寄存器开发)点亮一个LED灯
c语言·stm32·单片机·嵌入式硬件
嵌入式详谈4 小时前
基于STM32的数字温度传感器设计与实现
stm32·单片机·嵌入式硬件
AAA 建材批发王哥(天道酬勤)4 小时前
单片机在控制和自动化任务中的应用场景广泛
单片机·嵌入式硬件·自动化
每天一杯冰美式oh5 小时前
51单片机的水质检测系统【proteus仿真+程序+报告+原理图+演示视频】
嵌入式硬件·51单片机·proteus
武汉芯景科技有限公司7 小时前
关于武汉芯景科技有限公司的IIC电平转换芯片XJ9509开发指南(兼容PCa9509)
科技·stm32·单片机·嵌入式硬件
马浩同学8 小时前
【ESP32】Arduino开发 | Timer定时器+定时器闹钟例程
c语言·单片机·嵌入式硬件·mcu
千千道8 小时前
STM32 实现 UDP 广播通信
stm32·单片机·物联网·网络协议·udp