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

2023-12-14 13:52

本文主要是介绍齿轮缺角 引脚缺失 图像去噪,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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                                    消除干扰像素  

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

这篇关于齿轮缺角 引脚缺失 图像去噪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/492776

相关文章

单片机XTAL引脚引出的晶振分析

51单片机的18,19脚XTAL1,XTAL2用来提供外部振荡源给片内的时钟电路。 XTAL1和XTAL2引脚,该单片机可以使用外部时钟也可以使用内部时钟。 当使用内部时钟时,此二引线端用于外接石英晶体和微调电容; 当使用外部时钟时,用于接外部时钟信号,NMOS接XTAL2,CMOS接XTAL1。 原理: XTAL1和XTAL2分别是一个反相器的输入和输出。NMOS的反相器是

orcad画封装,如何隐藏引脚编号,线宽

1 电阻,有引脚号,如何隐藏,精度,功率如何添加   1 隐藏脚号效果图   2 精度添加,功率添加   2 更改精度效果图  2 更改线

LeetCode 热题100-17 缺失的第一个正数

缺失的第一个正数 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输入:nums = [1,2,0]输出:3解释:范围 [1,2] 中的数字都在数组中。 示例 2: 输入:nums = [3,4,-1,1]输出:2解释:1 在数组中,但 2 没有。 示例 3: 输

wps for linux wps-office_10.1.0.5460~a20p1_i386.deb字体库缺失

ubuntu环境,安装完wps-office_10.1.0.5460~a20p1_i386.deb,提示Some formula symbols might not be displayed correctly******,按其提供的解决方案,打开后无法解决,在此提供解决方案如下: 1、网上下载wps_symbol_fonts.zip字体库,或搜寻.tff字体库也可; 2、在用户目录下打开~/

图像去噪实验:基于全变分(TV)模型的MATLAB实现

一、背景        全变分模型在图像处理领域中被广泛用于去除噪声,同时保持图像边缘的清晰度。 二、实验步骤         图像的读取、噪声添加、去噪处理以及结果的显示。 三、实验仿真结果图     四、结论       全变分模型是一种有效的图像去噪方法,它能够在去除噪声的同时,保持图像的重要特征。通过调整模型参数,我们可以优化去噪效果,达到更好的视觉效果。

缺失值插补解释:六种插补方法?

目录 一、说明 二、什么是缺失值,为什么会出现缺失值? 2.1 什么是缺失值? 2.2 为什么会出现缺失值? 2.3 缺失数据类型 2.4 为什么要关注缺失值? 三、数据集 四、缺失数据的插值方式 4.1 方法 1:List-wise Deletion 4.2 方法 2:简单插补 — 均值和众数 4.3 方法 3:线性插值 4.4 方法 4:向前/向后填充 4.5 方法 5:常数值插补 4.

LintCode 寻找缺失的数

给出一个包含 0 .. N 中 N 个数的序列,找出0 .. N 中没有出现在序列中的那个数。 样例 N = 4 且序列为 [0, 1, 3] 时,缺失的数为2。 题目说的不是很清楚,意思就是如下: 给定给一个序列,有N个数,对于{0,1,2,……N}这个N+1个数的序列中,少了哪一个数? 这道题和LintCode上另一道题类似——《落单的数》 给出2*n + 1 个的数字,除其中一

leetcode 41:缺失的第一个正数

因为所要求的时间复杂度是O(n),且空间复杂度是常数,所以我们每个位置对应一个正整数 第一个位置是1 第二个位置是2 以此类推 先对数组使用交换,之后再访问数组 当位置与正整数不对应时返回结果 int firstMissingPositive(std::vector<int>& nums) {int temp=0;int i=0;int t=0;if(nums.size()==0)retu

COCO数据集缺失文件补全方法

COCO2017数据集图片文件缺失自动补全方法 一、前言 本文代码是以目标检测(object detection)和实例分割(instance segmentation)任务的标签文件为例,即instances_train/val/test2017.json文件。 其他任务的标签文件内容略有不同,但是图片来源表示字段完全相同,因此代码可通用。另外如果是非2017版本COCO应该也通用

Pandas-高级处理(三):缺失值处理【isnull:判断是否有缺失数据NaN】【fillna:实现缺失值的填充】【dropna:实现缺失值的删除】【replace:实现数据的替换】

缺失值处理 应用isnull判断是否有缺失数据NaN应用fillna实现缺失值的填充应用dropna实现缺失值的删除应用replace实现数据的替换 1 如何处理nan 获取缺失值的标记方式(NaN或者其他标记方式) 如果缺失值的标记方式是NaN 判断数据中是否包含NaN: pd.isnull(df),pd.notnull(df) 存在缺失值nan: 1、删除存在缺失值的:dr