时间:2021-05-20
识别流程
实现
public static bool IsCircle(List<Point> points, out Point center, out double radius){ int len = points.Count; center = new Point(); radius = 0; // 判断是否为封闭图形 if (!IsClosedFigure(points)) return false; int judgePointNum = len * 50 / 100; if (len < judgePointNum) return false; // 取链表上三个点作为判断圆的根据 Point p1 = points[len / 6]; Point p2 = points[len / 2]; Point p3 = points[len * 5 / 6]; if ((Math.Abs(p1.X - p2.X) < 100 && Math.Abs(p1.Y - p2.Y) < 100) || (Math.Abs(p1.X - p3.X) < 100 && Math.Abs(p1.Y - p3.Y) < 100) || (Math.Abs(p2.X - p3.X) < 100 && Math.Abs(p2.Y - p3.Y) < 100)) return false; // 三个点确定圆的方程,获取圆心坐标及半径 GetCircle(p1, p2, p3, out center, out radius); // 获取圆上平均分部的多个点,判断其到圆心的距离与半径之差是否在精度内 for (int i = 0; i < judgePointNum; ++i) { // 获取圆上点 Point p = points[len * i / judgePointNum]; double deviation = Math.Abs(GetDistance(center, p) - radius); // 点在圆上的偏移量与半径的比值若大于固定值,则不为圆 if (deviation/radius > MaxRatio) return false; } return true;}步骤
1.使用最小二乘法回归直线:
2.得到直线方程y=kx+b后,计算所有点到直线的距离,若在阈值范围内,认为是直线。
实现
/// <summary>/// 最小二乘法求回归直线方程/// </summary>/// <param name="points">输入数据</param>/// <param name="k">直线斜率</param>/// <param name="b">直线截距</param>/// <param name="type">直线类型 1:水平线 2:垂直线 3:一般直线</param>/// <returns></returns>public static bool IsLine(List<Point> points, out double k, out double b, out int type){ k = 0; b = 0; type = 0; if (points.Count < 2) return false; double averageX = 0, averageY = 0, n = 0; n = points.Count; foreach (Point p in points) { averageX += p.X; averageY += p.Y; } averageX /= n; averageY /= n; double numerator = 0, denominator = 0; foreach (Point p in points) { numerator += (p.X - averageX) * (p.Y - averageY); denominator += (p.X - averageX) * (p.X - averageX); } if (numerator == 0) //平行于X轴为水平线,返回纵坐标平均值 { b = averageY; type = 1; } else if (denominator == 0)//平行于Y轴为垂直线,返回横坐标平均值 { b = averageX; type = 2; } else { type = 3; } k = numerator / denominator; b = averageY - k * averageX; foreach (Point p in points) { dis = GetPoint2LineDistance(p, k, b, type); if (dis > MAX_POINT_LINE_DIS) return false; //点到拟合直线距离过大 } return true;}/// <summary>/// 计算点到直线的距离/// </summary>/// <param name="p">待计算点</param>/// <param name="k">直线斜率</param>/// <param name="b">直线截距</param>/// <param name="type">直线类型 1:水平线 2:垂直线 3:一般直线</param>/// <returns>距离</returns>private static double GetPoint2LineDistance(Point p, double k, double b, int type){ if (type == 1) { return Math.Abs(p.Y - b); } else if (type == 2) { return Math.Abs(p.X - b); } else { double numerator = 0, denominator = 0; numerator = Math.Abs(k * p.X - p.Y + b); denominator = Math.Sqrt(k * k + 1); return numerator / denominator; }}以上就是c# 圆形识别方案和直线识别方案的实现示例的详细内容,更多关于c# 圆形识别方案和直线识别方案的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
最近研究C#相关的OCR技术,图像识别一般C和C++这种底层语言做的比较多,C#主要是依托一些封装好的组件进行调用,这里介绍一种身份证识别的方法。环境搭建下载地
花草识别APP开发方案的意思是: 1、图片在线识别 用户可以直接通过手机拍照上传花草的图片,后台分析进行自动识别分析,为用户直接提供识别资讯,花草资料要存在
本文实例讲述了C#实现自动识别URL网址的方法。分享给大家供大家参考。具体实现方法如下:usingSystem;usingSystem.Collections.
由于iTunes(12.1.0.71)最新版改动较大,从而出现识别不了iOS设备的情况,建议参考以下方案解决。若已更新iTunes请先卸载电脑上最新版的iT
本文实例为大家分享了C#二维码图片识别的具体代码,供大家参考,具体内容如下怎么用NuGet和怎么配置log4net就不介绍了,直接上代码(VisualStudi