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

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.Resultsj.Edge0.PositionX);

}

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

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

{

//相邻坐标点求 差值

double width = listXi + 1 - listXi;

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

if (width > 80)

{

//初始化图形限定框

CogRectangleAffine rec = new CogRectangleAffine();

//限定款位置

rec.CenterX = (listXi + 1 + listXi) / 2;

rec.CenterY = cal1.Resultsi.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(coli, lastRecord, "CogIPOneImageTool1.InputImage", "Script");

}

}

1.图像去噪

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

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

相关推荐
KOAN凯擎小妹6 小时前
无源晶振为什么有串联谐振和并联谐振?MCU为什么使用并联晶体?
单片机·嵌入式硬件·晶振·元器件
茯苓gao7 小时前
嵌入式开发笔记:CAN与CAN FD完全指南——从帧格式差异到MCU选型实战
网络·笔记·stm32·嵌入式硬件·学习·汽车
木木_王7 小时前
嵌入式学习 | STM32 裸板驱动开发(Day06) | DHT11温湿度传感器超详解(单总线时序+全套驱动代码+智能温湿度报警项目)
驱动开发·stm32·学习
论迹复利8 小时前
蓝牙 OTA 升级断连、升级失败底层链路问题定位
嵌入式硬件·安全·bt
振南的单片机世界9 小时前
3.5T静默分帧,CRC16校验:Modbus-RTU帧结构解析
arm开发·stm32·单片机·嵌入式硬件
LingzhiPi9 小时前
零知派ESP32--AS5600磁吸旋钮音量控制器
c++·单片机·嵌入式硬件
尼喃9 小时前
42V热拔插认证过压保护芯片:70V耐压+响应<1μs+可调OVP+SOT23-6
嵌入式硬件
0x3F(小茶)10 小时前
STM32 SPI的5种方向模式
c语言·stm32·单片机·嵌入式硬件
BSD_CGQ11 小时前
FSR压力传感器信号调理电路设计要点
单片机·嵌入式硬件·压力传感器·源头工厂·薄膜压力传感器
爱就是恒久忍耐11 小时前
CanFestival移植到STM32 F103芯片(基于HAL库)
stm32·单片机·嵌入式硬件