服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - c# 圆形识别方案和直线识别方案的参考示例

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

2022-11-08 12:01louzi C#

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

圆形识别方案

识别流程

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

实现

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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.使用最小二乘法回归直线:

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

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

实现

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/// <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# 圆形识别方案和直线识别方案的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/louzixl/p/14381179.html

延伸 · 阅读

精彩推荐
  • C#C#制作简单的多人在线即时交流聊天室

    C#制作简单的多人在线即时交流聊天室

    这篇文章主要介绍了C#制作简单的多人在线即时交流聊天室的相关资料,需要的朋友可以参考下...

    C#教程网8862021-11-03
  • C#C#实现文件上传与下载功能实例

    C#实现文件上传与下载功能实例

    本篇文章主要介绍了C#实现文件上传与下载,这里整理了详细的代码,有需要的小伙伴可以参考下。...

    pan_junbiao8242021-12-13
  • C#Unity3D实现列表分页效果

    Unity3D实现列表分页效果

    这篇文章主要为大家详细介绍了Unity3D实现列表分页效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    无涯Andy7432022-09-02
  • C#automation服务器不能创建对象 解决方法

    automation服务器不能创建对象 解决方法

    本文主要介绍如何解决“automation服务器不能创建对象”错误,从而解决Visual Studio.Net不能正常使用的问题,需要的朋友可以参考下。...

    张逸4862021-11-23
  • C#C#实现获取mp3 Tag信息的方法

    C#实现获取mp3 Tag信息的方法

    这篇文章主要介绍了C#实现获取mp3 Tag信息的方法,涉及C#针对MP3文件属性的相关操作技巧,需要的朋友可以参考下...

    a77194852412092022-01-12
  • C#C#实现鼠标裁剪图像功能

    C#实现鼠标裁剪图像功能

    这篇文章主要为大家详细介绍了C#实现鼠标裁剪图像功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    s88488002022-03-07
  • C#C# 利用ICSharpCode.SharpZipLib实现在线压缩和解压缩

    C# 利用ICSharpCode.SharpZipLib实现在线压缩和解压缩

    本文主要主要介绍了利用ICSharpCode.SharpZipLib第三方的DLL库实现在线压缩和解压缩的功能,并做了相关的代码演示。...

    jerrylsxu12082021-11-17
  • C#C#中DataGridView动态添加行及添加列的方法

    C#中DataGridView动态添加行及添加列的方法

    这篇文章主要介绍了C#中DataGridView动态添加行及添加列的方法,涉及C#中DataGridView针对行与列动态操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考...

    我心依旧8332021-10-26