工业视觉_58:常见图形(三角形,四边形,圆,多边形)的判别

2023-11-01 19:32

本文主要是介绍工业视觉_58:常见图形(三角形,四边形,圆,多边形)的判别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/*             工业视觉_58:常见图形(三角形,四边形,圆,多边形)的判别* 机器人工业应用中常常要执行分拣铁片,布片,塑料片等任务.* 确定基本图形(三角形,四边形,圆,多边形)的类别,是机器视觉能力的简单表现.* 在产品的分拣中,摄像头传入的是照片,要用"连通域-->关键点",或"轮廓-->角点"等提取本文中的点集,再进行图形识别分类.* 其他异形的图形,如苹果形,心形,花瓣形,手掌形,瓢形.它们的识别与定位,方位角的识别等,见我自己的算法,在另一篇论述.* 工业视觉,目标很明确:快,准,稳. 快:开发快,运行速度快;准:高精度;稳:稳健* 在嵌入式中编写,找到合适的库函数最好,如果没有,自己要重新编写很多库函数. * 所以,目前"机器换人"项目大多采用工控电脑,搭建 Windows7+VS2019+EMGU(或AForge+Accord,或Halcon),这一方案见效最快.* Halcon,Emgu的视觉库都很强大,而AForge+Accord库更全面更丰富(如:数学,人工智能,机器学习).* * 在自动化行业的机器视觉,常常与机器人或车床协作,如分拣,钻孔,激光切割,计算各类数据都是必需的.* Accord.SimpleShapeChecker中IsConvexPolygon使用时要谨慎,它仍不够成熟.---------     编撰:    项道德(微信:daode1212),2021-07-09*///pictureBox1.Image = Image.FromFile("2D106_直线与圆.jpg");//Bitmap bmp = (Bitmap)(pictureBox1.Image);Bitmap bmp = new Bitmap(800,800);int ww = bmp.Width;int hh = bmp.Height;Graphics g = Graphics.FromImage(bmp);SolidBrush bh = new SolidBrush(Color.FromArgb(0, 120, 0));Pen pen0 = new Pen(Color.FromArgb(255, 0, 0), 4);Pen pen1 = new Pen(Color.FromArgb(220, 220, 0), 3);Pen pen2 = new Pen(Color.FromArgb(0, 0, 220), 2);Pen pen3 = new Pen(Color.FromArgb(150, 0, 150), 1);int x0 = ww / 2;int y0 = hh / 2;MSG("图片宽度与高度:" + string.Format("w={0},h={1}", ww, hh) + "\r\n 接着,呈现处理结果");List<IntPoint> idealCicle = new List<IntPoint>();//理想的圆List<IntPoint> distorredCircle = new List<IntPoint>();//扭曲的圆System.Random rand = new System.Random();// 生成一些圆,generate sample circles float radius = 120;for (int i = 0; i < 360; i += 10){float angle = (float)((float)i / 180 * System.Math.PI);// 添加一个理想的圆,add point to ideal circleidealCicle.Add(new IntPoint(x0-200+(int)(radius * System.Math.Cos(angle)),y0+ (int)(radius * System.Math.Sin(angle))));// 添加位失真圆,  add a bit distortion for distorred circle float distorredRadius = radius + rand.Next(12) - 6;distorredCircle.Add(new IntPoint(x0+200+(int)(distorredRadius * System.Math.Cos(angle)), y0+(int)(distorredRadius * System.Math.Sin(angle))));g.FillEllipse(bh, x0-200+(int)(radius * System.Math.Cos(angle))-4, y0+(int)(radius * System.Math.Sin(angle))-4,8,8);g.FillEllipse(bh, x0+200+(int)(distorredRadius * System.Math.Cos(angle))-4, y0+(int)(distorredRadius * System.Math.Sin(angle))-4,8,8);}Point[] pt1 = PointsListToArray(idealCicle);g.DrawPolygon(pen0, pt1);Point[] pt2 = PointsListToArray(distorredCircle);g.DrawPolygon(pen1, pt2);// 检查形状,check shape:SimpleShapeChecker shapeChecker = new SimpleShapeChecker();/* 以下诸神器也常常要用的:* shapeChecker.CheckShapeType : * shapeChecker.IsCircle,  * shapeChecker.IsConvexPolygon, * shapeChecker.IsQuadrilateral,   * shapeChecker.IsTriangle,*/if (shapeChecker.IsCircle(idealCicle))//标准的圆{g.DrawString("idealCicle:IsCircle", new Font("", 12), bh, idealCicle.ElementAt(9).X-100, idealCicle.ElementAt(9).Y);}if (shapeChecker.CheckShapeType(distorredCircle) == ShapeType.Circle)//非标准的圆{g.DrawString("distorredCircle:IsCircle", new Font("", 12), bh, distorredCircle.ElementAt(9).X-100, distorredCircle.ElementAt(9).Y);}//对于凹多边形的非标准的圆,获取其凸壳:IConvexHullAlgorithm hullFinder1 = new GrahamConvexHull(); List<IntPoint> hull1 = hullFinder1.FindHull(distorredCircle);g.DrawPolygon(pen3, PointsListToArray(hull1));//=============  另一些几何图形:  ==============//判断一个三角形:IntPoint[] pt3 = {new IntPoint(176,68), new IntPoint(312,202), new IntPoint(64,257)};List<IntPoint> Triangle =pt3.ToList();g.DrawPolygon(pen2, PointsListToArray(Triangle));if (shapeChecker.IsTriangle(Triangle)){g.DrawString("IsTriangle", new Font("", 12), bh, Triangle.ElementAt(0).X - 100, Triangle.ElementAt(0).Y);}//判断一个四边形:IntPoint[] pt4 = {new IntPoint(462,82), new IntPoint(614,66), new IntPoint(717,250), new IntPoint(447,230)};List<IntPoint> Quad = pt4.ToList();g.DrawPolygon(pen2, PointsListToArray(Quad));if (shapeChecker.IsQuadrilateral(Quad)){g.DrawString("IsQuad", new Font("", 12), bh, Quad.ElementAt(0).X - 100, Quad.ElementAt(0).Y);}//判断一个凹多边形:IntPoint[] pt7 = {new IntPoint(574,681), new IntPoint(647,688), new IntPoint(728,727), new IntPoint(757,700), new IntPoint(658,568), new IntPoint(584,637), new IntPoint(485,689)};List<IntPoint> PolygonA = pt7.ToList();List<IntPoint> cornersA = new List<IntPoint>();//面积最大的四边形:四个角的坐标(x,y)g.DrawPolygon(pen0, PointsListToArray(PolygonA));if (shapeChecker.IsConvexPolygon(PolygonA,out cornersA)){g.DrawString("IsConvexPolygon", new Font("", 12), bh, PolygonA.ElementAt(0).X - 100, PolygonA.ElementAt(0).Y);}if (!shapeChecker.IsConvexPolygon(PolygonA, out cornersA)){g.DrawString("Convex Polygon ?", new Font("", 12), bh, PolygonA.ElementAt(4).X - 100, PolygonA.ElementAt(4).Y);}g.DrawPolygon(pen2, PointsListToArray(cornersA));//对于凹多边形的,获取其凸壳:IConvexHullAlgorithm hullFinder2 = new GrahamConvexHull(); List<IntPoint> hull2 = hullFinder2.FindHull(PolygonA);g.DrawPolygon(pen3, PointsListToArray(hull2));//再判断一个凸边形:IntPoint[] pt7b = {new IntPoint(74,581),new IntPoint(164,566),new IntPoint(428,597),new IntPoint(357,700),new IntPoint(158,748),new IntPoint(54,737),new IntPoint(35,639)};List<IntPoint> PolygonB = pt7b.ToList();List<IntPoint> cornersB = new List<IntPoint>();//面积最大的四边形:四个角的坐标(x,y)g.DrawPolygon(pen0, PointsListToArray(PolygonB));if (shapeChecker.IsConvexPolygon(PolygonB, out cornersB)){g.DrawString("IsConvexPolygon", new Font("", 12), bh, PolygonB.ElementAt(4).X - 100, PolygonB.ElementAt(4).Y);}if (!shapeChecker.IsConvexPolygon(PolygonB, out cornersB)){g.DrawString("Convex Polygon ?", new Font("", 12), bh, PolygonB.ElementAt(4).X - 100, PolygonB.ElementAt(4).Y);}g.DrawPolygon(pen2, PointsListToArray(cornersB));//更新控件显示:pictureBox1.Image = bmp;/*The class performs checking/detection of some simple geometrical shapes for provided set of points (shape's edge points). During the check the class goes through the list of all provided points and checks how accurately they fit into assumed shape.All the shape checks allow some deviation of points from the shape with assumed parameters. In other words it is allowed that specified set of points may form a little bit distorted shape, which may be still recognized. The allowed amount of distortion is controlled by two properties (Accord.Math.Geometry.SimpleShapeChecker.MinAcceptableDistortion and Accord.Math.Geometry.SimpleShapeChecker.RelativeDistortionLimit), which allow higher distortion level for bigger shapes and smaller amount of distortion for smaller shapes. Checking specified set of points, the class calculates mean distance between specified set of points and edge of the assumed shape. If the mean distance is equal to or less than maximum allowed distance, then a shape is recognized. The maximum allowed distance is calculated as:maxDistance = max( minAcceptableDistortion, relativeDistortionLimit * ( width + height ) / 2 ), where width and height is the size of bounding rectangle for the specified points.See also Accord.Math.Geometry.SimpleShapeChecker.AngleError and Accord.Math.Geometry.SimpleShapeChecker.LengthError properties, which set acceptable errors for polygon sub type checking done by Accord.Math.Geometry.SimpleShapeChecker.CheckPolygonSubType(System.Collections.Generic.List{Accord.IntPoint}) method.See the next article for details about the implemented algorithms: Detecting some simple shapes in images.以下的百度机器翻译,可作参考:该类为提供的一组点(形状的边缘点)执行一些简单几何形状的检查/检测。在检查的过程中,这个类将检查所有提供的点的列表,并检查它们是否精确地符合假定的形状。所有形状检查都允许点与具有假定参数的形状有一些偏差。换言之,允许指定的一组点形成一点扭曲的形状,这仍然可以被识别。允许的失真量由两个属性(Accord.Math.Geometry.SimpleShapeChecker.minAcceptable畸变和Accord.Math.Geometry.SimpleShapeChecker.relativeStorionLimit)控制,这两个属性允许较大形状的失真度更高,较小形状的失真度更小。通过检查指定的点集,类计算指定点集和假定形状的边之间的平均距离。如果平均距离等于或小于最大允许距离,则识别形状。最大允许距离计算如下:最大距离=最大值(最小可接受失真,相对失真极限*(宽度+高度)/2),其中宽度和高度是指定点的边框大小。另请参见Accord.Math.Geometry.SimpleShapeChecker.AngleError和Accord.Math.Geometry.SimpleShapeChecker.LengthError属性,它们为Accord.Math.Geometry.SimpleShapeChecker.CheckPolygonSubType(System.Collections.Generic.List{Accord.IntPoint})方法执行的多边形子类型检查设置可接受的错误。有关实现的算法的详细信息,请参阅下一篇文章:检测图像中的一些简单形状。*/

这篇关于工业视觉_58:常见图形(三角形,四边形,圆,多边形)的判别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

Python struct.unpack() 用法及常见错误详解

《Pythonstruct.unpack()用法及常见错误详解》struct.unpack()是Python中用于将二进制数据(字节序列)解析为Python数据类型的函数,通常与struct.pa... 目录一、函数语法二、格式字符串详解三、使用示例示例 1:解析整数和浮点数示例 2:解析字符串示例 3:解

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

MySQL查看表的最后一个ID的常见方法

《MySQL查看表的最后一个ID的常见方法》在使用MySQL数据库时,我们经常会遇到需要查看表中最后一个id值的场景,无论是为了调试、数据分析还是其他用途,了解如何快速获取最后一个id都是非常实用的技... 目录背景介绍方法一:使用MAX()函数示例代码解释适用场景方法二:按id降序排序并取第一条示例代码解

IDEA实现回退提交的git代码(四种常见场景)

《IDEA实现回退提交的git代码(四种常见场景)》:本文主要介绍IDEA实现回退提交的git代码(四种常见场景),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.已提交commit,还未push到远端(Undo Commit)2.已提交commit并push到

python进行while遍历的常见错误解析

《python进行while遍历的常见错误解析》在Python中选择合适的遍历方式需要综合考虑可读性、性能和具体需求,本文就来和大家讲解一下python中while遍历常见错误以及所有遍历方法的优缺点... 目录一、超出数组范围问题分析错误复现解决方法关键区别二、continue使用问题分析正确写法关键点三