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

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

相关文章

电脑开机提示krpt.dll丢失怎么解决? krpt.dll文件缺失的多种解决办法

《电脑开机提示krpt.dll丢失怎么解决?krpt.dll文件缺失的多种解决办法》krpt.dll是Windows操作系统中的一个动态链接库文件,它对于系统的正常运行起着重要的作用,本文将详细介绍... 在使用 Windows 操作系统的过程中,用户有时会遇到各种错误提示,其中“找不到 krpt.dll”

电脑报错cxcore100.dll丢失怎么办? 多种免费修复缺失的cxcore100.dll文件的技巧

《电脑报错cxcore100.dll丢失怎么办?多种免费修复缺失的cxcore100.dll文件的技巧》你是否也遇到过“由于找不到cxcore100.dll,无法继续执行代码,重新安装程序可能会解... 当电脑报错“cxcore100.dll未找到”时,这通常意味着系统无法找到或加载这编程个必要的动态链接库

单片机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