VisionPro 判断圆是不是无限接近圆或存在缺陷

项目上可能需要判断圆是否是无限接近圆或者判断圆边缘是否存在缺陷等。
第一种方法:找圆工具和点到点的距离计算圆边缘上的点到圆心距离的最大值和最小值的差值。
在这里插入图片描述

#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.Caliper;
using Cognex.VisionPro.Dimensioning;
#endregionpublic class CogToolBlockAdvancedScript : CogToolBlockAdvancedScriptBase
{#region Private Member Variablesprivate Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock;private CogGraphicCollection gc;#endregion/// <summary>/// Called when the parent tool is run./// Add code here to customize or replace the normal run behavior./// </summary>/// <param name="message">Sets the Message in the tool's RunStatus.</param>/// <param name="result">Sets the Result in the tool's RunStatus</param>/// <returns>True if the tool should run normally,///          False if GroupRun customizes run behavior</returns>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 DEBUGif (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break();#endif// Run each tool using the RunTool functionforeach(ICogTool tool in mToolBlock.Tools)mToolBlock.RunTool(tool, ref message, ref result);if(gc == null)gc = new CogGraphicCollection();gc.Clear();double Min_Distance = 0.0;double Max_Distance = 0.0;double Minus_Value = 0;double Point_CenterD = 0;//string[] Price_Distance = {};CogGraphicLabel label6 = new CogGraphicLabel();CogFindCircleTool FindCircle = mToolBlock.Tools["CogFindCircleTool1"] as CogFindCircleTool;CogDistancePointPointTool PointP_Distance = mToolBlock.Tools["CogDistancePointPointTool1"]as CogDistancePointPointTool;FindCircle.Run();PointP_Distance.Run();double[] SaveDistance = new double[FindCircle.Results.NumPointsFound];//if(FindCircle.Results.Count > 0){System.Windows.Forms.MessageBox.Show("FindCircle.Results.NumPointsFound" + FindCircle.Results.Count.ToString());try{for(int i = 0;i < FindCircle.Results.Count;i++){System.Windows.Forms.MessageBox.Show(i.ToString());//System.Windows.Forms.MessageBox.Show("FindCircle.Results[i].Used :" + FindCircle.Results[i].Used);if(FindCircle.Results[i].Used)//没有找到的点过滤点,不是过滤的红色点{PointP_Distance.StartX = FindCircle.Results[i].X;PointP_Distance.StartY = FindCircle.Results[i].Y;PointP_Distance.EndX = FindCircle.Results.GetCircle().CenterX;PointP_Distance.EndY = FindCircle.Results.GetCircle().CenterY;Point_CenterD = PointP_Distance.Distance;  //将每个边缘点到圆心的距离存double数组中SaveDistance[i] = Point_CenterD;}          }System.Windows.Forms.MessageBox.Show("存储点到圆距离个数" + SaveDistance.Length);ArrayList List_SaveDistance = new ArrayList(SaveDistance);List_SaveDistance.Sort();Min_Distance = Convert.ToDouble(List_SaveDistance[0]);Max_Distance = Convert.ToDouble(List_SaveDistance[List_SaveDistance.Count - 1]);System.Windows.Forms.MessageBox.Show("最大值" + Max_Distance.ToString());System.Windows.Forms.MessageBox.Show("最小值" + Min_Distance.ToString());Minus_Value = Max_Distance - Min_Distance;System.Windows.Forms.MessageBox.Show("真圆度" + Minus_Value.ToString());} catch(Exception e){MessageBox.Show(e.ToString());}System.Windows.Forms.MessageBox.Show("点到圆距离" + Point_CenterD.ToString());label6.SetXYText(100, 400, "圆度:" + Minus_Value.ToString("f3"));label6.SelectedSpaceName = "#";label6.Font = new Font("宋体", 12);label6.Color = Cognex.VisionPro.CogColorConstants.Green;gc.Add(label6);}mToolBlock.Outputs["Actual_Value"].Value = Minus_Value;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){}#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 REMOVEbase.Initialize(host);// Store a local copy of the script hostthis.mToolBlock = ((Cognex.VisionPro.ToolBlock.CogToolBlock) (host));}#endregion}

第二种方法:通过灰度工具:CogHistogramTool1 Blob工具:CogBlobTool1
判断面积大小进行是否存储缺陷
在这里插入图片描述
在这里插入图片描述

#region 真圆度检测Histogram.InputImage = Fix.OutputImage;Histogram.Run();Minus_Blob.InputImage = Fix.OutputImage;Minus_Blob.Run();double Blob_Area = 0;Blob_Area = Convert.ToDouble(mToolBlock.Inputs["Input_MinusArea"].Value.ToString());if(Minus_Blob.Results.GetBlobs().Count > 0){if(Minus_Blob.Results.GetBlobs()[0].Area > Blob_Area){label6.SetXYText(100, 400, "圆度检测:" + Minus_Blob.Results.GetBlobs()[0].Area.ToString());label6.Color = CogColorConstants.Green;gc.Add(label6);gc.Add(Minus_Blob.Results.GetBlobs()[0].CreateResultGraphics(CogBlobResultGraphicConstants.All));mToolBlock.Outputs["MinusArea_Value"].Value = Minus_Blob.Results.GetBlobs()[0].Area.ToString();}else{mToolBlock.Outputs["Result"].Value = 1;label6.SetXYText(100, 400, "圆度检测NG");label6.Color = CogColorConstants.Red;mToolBlock.Outputs["MinusArea_Value"].Value = Minus_Blob.Results.GetBlobs()[0].Area.ToString();gc.Add(label6);}}#endregion

第三方法:通过圆上工具的属性获取点到圆拟合边的距离,获取最大值,大于最大值判定为NG;
在这里插入图片描述

#region 通过提取点到圆边缘距离进行判断double[] SaveDistance = new double[FindCircle.Results.Count];if (FindCircle.Results.Count > 0){try{for (int i = 0; i < FindCircle.Results.Count; i++){//System.Windows.Forms.MessageBox.Show(i.ToString());//System.Windows.Forms.MessageBox.Show("FindCircle.Results[i].Used :" + FindCircle.Results[i].Used);if (FindCircle.Results[i].Used)//没有找到的点过滤点,不是过滤的红色点{//将每个边缘点到圆心的距离存double数组中SaveDistance[i] = FindCircle.Results[i].DistanceToCircle;}}//System.Windows.Forms.MessageBox.Show("存储点到圆距离个数" + SaveDistance.Length);ArrayList List_SaveDistance = new ArrayList(SaveDistance);List_SaveDistance.Sort();//System.Windows.Forms.MessageBox.Show("List_SaveDistance:" + List_SaveDistance.ToString());int k = 0;//for(int k = 0;k < List_SaveDistance.Count;k++)if (k < List_SaveDistance.Count){do{Min_Distance = Convert.ToDouble(List_SaveDistance[k]);k++;} while (Convert.ToDouble(List_SaveDistance[k].ToString()) == 0);}Min_Distance = Convert.ToDouble(List_SaveDistance[k]);Max_Distance = Convert.ToDouble(List_SaveDistance[List_SaveDistance.Count - 1]);System.Windows.Forms.MessageBox.Show("最小值" + Min_Distance.ToString());System.Windows.Forms.MessageBox.Show("k" + k);System.Windows.Forms.MessageBox.Show("最大值" + Max_Distance.ToString());ArrayList List_MaxStore = new ArrayList();for(int w = 0;w < List_SaveDistance.Count;w++){if(Convert.ToDouble(List_SaveDistance[w].ToString()) > Convert.ToDouble(mToolBlock.Inputs["Input_Distance"].Value.ToString())){List_MaxStore.Add(List_SaveDistance[w]);}}System.Windows.Forms.MessageBox.Show("List_MaxStore长度:" + List_MaxStore.Count);if (List_MaxStore.Count > 3)//表明大于点到圆上的距离最大值有三个数视为NG{label6.SetXYText(100, 400, "圆度检测:OK");label6.Color = CogColorConstants.Green;gc.Add(label6);mToolBlock.Outputs["Out_DistanceMax"].Value = Minus_Value.ToString();}else{label6.SetXYText(100, 400, "圆度检测:NG");label6.Color = CogColorConstants.Red;gc.Add(label6);mToolBlock.Outputs["Out_DistanceMax"].Value = Minus_Value.ToString();}}catch (Exception e){MessageBox.Show(e.ToString());}}else{mToolBlock.Outputs["Result"].Value = 1;label6.SetXYText(100, 400, "找圆NG");label6.Color = CogColorConstants.Red;gc.Add(label6);}#endregion

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/519210.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1分钟带你搞定Python函数分类

python语言中&#xff0c;函数可以分为内置函数、自定义函数、有参数函数、无参数函数、有名字函数和匿名函数。其中&#xff0c;内置函数可以直接使用&#xff0c;自定义函数需要根据需求定义。有参数函数在定义时需要指定参数&#xff0c;调用时传入参数。无参数函数在定义时…

通过对话式人工智能打破语言障碍

「AI突破语言障碍」智能人工智能如何让全球交流无障碍 在当今互联的世界中&#xff0c;跨越语言界限进行交流的能力比以往任何时候都更加重要。 对话式人工智能&#xff08;包括聊天机器人和语音助手等技术&#xff09;在打破这些语言障碍方面发挥着关键作用。 在这篇博文中&am…

3.7 day2 Free RTOS

使用ADC采样光敏电阻数值&#xff0c;如何根据这个数值调节LED灯亮度。2.总结DMA空闲中断接收数据的使用方法 while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */adc_value HAL_ADC_GetValue(&hadc);TIM3->CCR3 adc_value * 999 / 4095;printf("%d …

【mogoose】对查询的数据进行过滤不需要展示的信息

数据库结构如下 我只要email userName sex role 几个数据&#xff0c;其余不要 {_id: new ObjectId(65e7b6df8d06a0623fa899f5),email: 12345qq.com,pwd: $2a$10$eLJ9skKEsQxvzHf5X8hbaOXKtg8GCHBeieieSN6Usu17D2DPaI44i,userName: 默认昵称0769,sex: 0,token: {upCount: 0,_…

数学建模【模糊综合评价分析】

一、模糊综合评价分析简介 提到模糊综合评价分析&#xff0c;就先得知道模糊数学。1965年美国控制论学家L.A.Zadeh发表的论文“Fuzzy sets”标志着模糊数学的诞生。 模糊数学又称Fuzzy数学&#xff0c;是研究和处理模糊性现象的一种数学理论和方法。模糊性数学发展的主流是在…

【你也能从零基础学会网站开发】Web建站之HTML+CSS入门篇 常用HTML标签(1)

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 HTML中的双…

Domain Driven Design (DDD)

Domain Driven Design (DDD领域驱动设计)主要是业务分类例如&#xff08;订单、合同、生产、检测、物流、运输等&#xff09;&#xff0c;独立单元相互不干扰&#xff0c;仅暴露接口的模型。核心在Domain&#xff0c;所有业务模块放这边&#xff0c;当然我们做的时候微服务是一…

day2:keil5基础2

思维导图 使用ADC采样光敏电阻数值&#xff0c;如何根据这个数值调节LED灯亮度。2.总结DMA空闲中断接收数据的使用方法 while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */adc_value HAL_ADC_GetValue(&hadc);TIM3->CCR3 adc_value * 999 / 4095;printf(&q…

“python -m experiments.cifar10_test“是什么意思

具体解释如下&#xff1a; "python" 是运行 Python 解释器的命令。"-m" 是一个选项&#xff0c;用于指定要运行的模块。"experiments.cifar10_test" 是要运行的 Python 模块的名称。 其中 虽说main.py文件在上一级目录中&#xff0c;仍然可以在…

dbeaver更换下载驱动地址

DBeaver 是一个免费开源的数据库工具&#xff0c;提供对多种数据库系统的支持&#xff0c;包括 MySQL、PostgreSQL、Oracle、SQLite 等。它是一个通用的数据库管理工具&#xff0c;可以帮助用户连接、管理和查询各种类型的数据库。 下载地址 使用dbeaver连接数据库时需要先下…

一次简单操作代替所有异常处理

一、背景 在服务端处理前端发过来的响应的时候&#xff0c;开发者不可能穷尽用户的所有奇怪的操作。除此之外&#xff0c;我们还需要应付前端人员对我们的无情吐槽&#xff0c;你对XXXX请求返回的为啥是奇怪的响应数据呢&#xff1f;于是全局异常处理应运而生&#xff0c;一次处…

网络编程套接字(1)—网络编程基础

目录 一、为什么需要网络编程? 二、什么是网络编程 三、网络编程中的基本概念 1、发送端和接收端 2、请求和响应 3、客户端和服务端 四、常见的客户端服务端模型 1、一问一答模型 2、一问多答模型 3、多问一答模型 4、多问多答模型 一、为什么需要网络编程? 为什么…