news 2026/9/1 11:57:51

机器视觉13-1

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
机器视觉13-1

案例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");
}

案例2:引脚缺失

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


//判断引脚是否偏移

//根据blob个数结果
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");
}
}

案例3:液位高度检测

1.预处理工具 处理图像对比度

1.边缘提取工具 突出图像边缘效果

1.模板匹配

2.中心原点位置 调整到正常液位坐标 用于后续对比

1.卡尺工具 目的:测量瓶口端基准线位置

1.利用卡尺测量出瓶口端基准线位置

1.创建线工具

2.根据卡尺工具线的坐标 创建线

1.卡尺工具 目的 找到液位高点的基准线

2.模板匹配中心点位置确定卡尺工具的位置

1.点到线距离工具

2. x y是卡尺工具上端线的点信息

3.Line 创建线工具的结果

#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.Dimensioning;
using Cognex.VisionPro.Caliper;
#endregion

public class CogToolBlockAdvancedScript : CogToolBlockAdvancedScriptBase
{
#region Private Member Variables
private Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock;
#endregion
//创建图像集合
CogGraphicCollection col = new CogGraphicCollection();
CogPMAlignTool pma;
//
CogCaliperTool cal;
//
CogCreateLineTool line;
//
CogDistancePointLineTool dis;
public override bool GroupRun(ref string message, ref CogToolResultConstants result)
{

//工具映射
pma = mToolBlock.Tools["CogPMAlignTool1"] as CogPMAlignTool;
cal = mToolBlock.Tools["CogCaliperTool1"] as CogCaliperTool;
line = mToolBlock.Tools["CogCreateLineTool1"] as CogCreateLineTool;
dis = mToolBlock.Tools["CogDistancePointLineTool1"] as CogDistancePointLineTool;


//清空图形集合
col.Clear();
// Run each tool using the RunTool function
foreach(ICogTool tool in mToolBlock.Tools)
mToolBlock.RunTool(tool, ref message, ref result);


//根据pma个数结果 循环
for (int i = 0; i < pma.Results.Count; i++)
{
//液位上端卡尺工具的位置
cal.Region.CenterX = pma.Results[i].GetPose().TranslationX;
cal.Region.CenterY = pma.Results[i].GetPose().TranslationY;
//运行卡尺工具
cal.Run();

//获得点到线距离工具的信息
dis.X = cal.Results[0].Edge0.PositionX;
dis.Y = cal.Results[0].Edge0.PositionY;
dis.Line = line.GetOutputLine();
//运行工具
dis.Run();


//创建液位上端线段
double x0 = cal.Results[0].Edge0.PositionX+20;
double y0 = cal.Results[0].Edge0.PositionY;
double x1 = cal.Results[0].Edge0.PositionX-20;
double y1 = cal.Results[0].Edge0.PositionY;

CogLineSegment segment = new CogLineSegment();
segment.SetStartEnd(x0, y0, x1, y1);
segment.Color = CogColorConstants.Red;

//创建文本图形
CogGraphicLabel label = new CogGraphicLabel();
string res = "";

//判断液位误差范围
if (dis.Distance > 130 || dis.Distance < 110)
{
res = "NG: " + dis.Distance.ToString("0.00");
label.Color = CogColorConstants.Red;
}
else
{
res = "OK: " + dis.Distance.ToString("0.00");
label.Color = CogColorConstants.Green;
}
label.SetXYText(dis.X, dis.Y, res);
//添加label到集合
col.Add(label);
//添加线段到集合
col.Add(segment);
}
return false;
}

#region When the Current Run Record is Created
/// <summary>
/// Called when the current record may have changed and is being reconstructed
/// </summary>
/// <param name="currentRecord">
/// The new currentRecord is available to be initialized or customized.</param>
public override void ModifyCurrentRunRecord(Cognex.VisionPro.ICogRecord currentRecord)
{
}
#endregion

#region When the Last Run Record is Created
/// <summary>
/// Called when the last run record may have changed and is being reconstructed
/// </summary>
/// <param name="lastRecord">
/// The new last run record is available to be initialized or customized.</param>
public override void ModifyLastRunRecord(Cognex.VisionPro.ICogRecord lastRecord)
{
//显示图形
for (int i = 0; i < col.Count; i++)
{
mToolBlock.AddGraphicToRunRecord(col[i], lastRecord, "CogIPOneImageTool1.InputImage", "Script");
}
}
#endregion

#region When the Script is Initialized
/// <summary>
/// Perform any initialization required by your script here
/// </summary>
/// <param name="host">The host tool</param>
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

}

案例4:图像去噪

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 11:57:27

闭源大模型API避坑指南:幽灵扣费、移动靶心与参数迷雾

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/1 11:56:19

STC89C52抢答器设计与仿真全解析:从原理到Proteus调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/1 11:55:58

逻辑芯片采购怎么选:先看供货与核验能力

逻辑芯片采购看起来是选供应商&#xff0c;实际上是在选交付确定性。对不少项目来说&#xff0c;真正影响进度的&#xff0c;不是宣传口径有多完整&#xff0c;而是三件事&#xff1a;供货是否稳定、交期是否可控、来源和资料是否能够核验。 先分清供应商站位 在逻辑芯片这类物…

作者头像 李华
网站建设 2026/9/1 11:53:10

Hister 标签系统实战:5 种方式给你的知识库贴上自定义标签

Hister 标签系统实战&#xff1a;5 种方式给你的知识库贴上自定义标签 【免费下载链接】hister Your own search engine 项目地址: https://gitcode.com/GitHub_Trending/hi/hister Hister 是一个自托管的个人搜索引擎&#xff0c;它能把你浏览过的网页、本地文件、聊天…

作者头像 李华