c# 圆形识别方案和直线识别方案的参考示例

这篇文章主要介绍了c# 圆形识别方案和直线识别方案的实现示例,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下

圆形识别方案

识别流程

  • 判断是否为封闭图形;
  • 根据圆的方程,取输入点集中的1/6、3/6、5/6处的三个点,求得圆的方程,获取圆心及半径;
  • 取点集中的部分点,计算点到圆心的距离与半径的比例,与设定的阈值比较,得出结果。~~~~

实现

 public static bool IsCircle(List 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  MaxRatio) return false; } return true; }

直线识别方案

步骤

1.使用最小二乘法回归直线:

2.得到直线方程y=kx+b后,计算所有点到直线的距离,若在阈值范围内,认为是直线。

实现

 ///  /// 最小二乘法求回归直线方程 ///  /// 输入数据 /// 直线斜率 /// 直线截距 /// 直线类型 1:水平线 2:垂直线 3:一般直线 ///  public static bool IsLine(List 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; } ///  /// 计算点到直线的距离 ///  /// 待计算点 /// 直线斜率 /// 直线截距 /// 直线类型 1:水平线 2:垂直线 3:一般直线 /// 距离 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# 圆形识别方案和直线识别方案的参考示例的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 其他教程