c# 圓形識(shí)別方案和直線識(shí)別方案的參考示例
圓形識(shí)別方案
識(shí)別流程
- 判斷是否為封閉圖形;
- 根據(jù)圓的方程,取輸入點(diǎn)集中的1/6、3/6、5/6處的三個(gè)點(diǎn),求得圓的方程,獲取圓心及半徑;
- 取點(diǎn)集中的部分點(diǎn),計(jì)算點(diǎn)到圓心的距離與半徑的比例,與設(shè)定的閾值比較,得出結(jié)果。~~~~
實(shí)現(xiàn)
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;
// 取鏈表上三個(gè)點(diǎn)作為判斷圓的根據(jù)
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;
// 三個(gè)點(diǎn)確定圓的方程,獲取圓心坐標(biāo)及半徑
GetCircle(p1, p2, p3, out center, out radius);
// 獲取圓上平均分部的多個(gè)點(diǎn),判斷其到圓心的距離與半徑之差是否在精度內(nèi)
for (int i = 0; i < judgePointNum; ++i)
{
// 獲取圓上點(diǎn)
Point p = points[len * i / judgePointNum];
double deviation = Math.Abs(GetDistance(center, p) - radius);
// 點(diǎn)在圓上的偏移量與半徑的比值若大于固定值,則不為圓
if (deviation/radius > MaxRatio)
return false;
}
return true;
}
直線識(shí)別方案
步驟
1.使用最小二乘法回歸直線:

2.得到直線方程y=kx+b后,計(jì)算所有點(diǎn)到直線的距離,若在閾值范圍內(nèi),認(rèn)為是直線。
實(shí)現(xiàn)
/// <summary>
/// 最小二乘法求回歸直線方程
/// </summary>
/// <param name="points">輸入數(shù)據(jù)</param>
/// <param name="k">直線斜率</param>
/// <param name="b">直線截距</param>
/// <param name="type">直線類(lèi)型 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軸為水平線,返回縱坐標(biāo)平均值
{
b = averageY;
type = 1;
}
else if (denominator == 0)//平行于Y軸為垂直線,返回橫坐標(biāo)平均值
{
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; //點(diǎn)到擬合直線距離過(guò)大
}
return true;
}
/// <summary>
/// 計(jì)算點(diǎn)到直線的距離
/// </summary>
/// <param name="p">待計(jì)算點(diǎn)</param>
/// <param name="k">直線斜率</param>
/// <param name="b">直線截距</param>
/// <param name="type">直線類(lèi)型 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# 圓形識(shí)別方案和直線識(shí)別方案的實(shí)現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于c# 圓形識(shí)別方案和直線識(shí)別方案的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- c# 如何對(duì)網(wǎng)絡(luò)信息進(jìn)行相關(guān)設(shè)置(ip,dns,網(wǎng)關(guān)等)
- C# 文件安全管理需要注意的
- c# 如何自己實(shí)現(xiàn)一個(gè)ORM框架
- c# 如何實(shí)現(xiàn)自動(dòng)更新程序
- c# 使用WebRequest實(shí)現(xiàn)多文件上傳
- c# WPF中的TreeView使用詳解
- C# Winform 實(shí)現(xiàn)TCP發(fā)消息
- c# 用ffmpeg從視頻中截圖
- c# wpf如何使用Blend工具繪制Control樣式
- C# 如何實(shí)現(xiàn)Token
- c# 在windows中操作IIS設(shè)置FTP服務(wù)器的示例
- 使用 BenchmarkDotNet 對(duì) C# 代碼進(jìn)行基準(zhǔn)測(cè)試
相關(guān)文章
C#使用WMI實(shí)現(xiàn)監(jiān)聽(tīng)進(jìn)程的啟動(dòng)和關(guān)閉
Windows Management Instrumentation(WMI)是用于管理基于 Windows 操作系統(tǒng)的數(shù)據(jù)和操作的基礎(chǔ)結(jié)構(gòu),本文將使用WMI實(shí)現(xiàn)監(jiān)聽(tīng)進(jìn)程的啟動(dòng)和關(guān)閉,感興趣的可以了解下2024-01-01
C# winfroms使用socket客戶端服務(wù)端的示例代碼
這篇文章主要為大家詳細(xì)介紹了C# winfroms使用socket客戶端服務(wù)端的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-02-02
c#獲取季度時(shí)間實(shí)例代碼(季度的第一天)
這篇文章主要介紹了c#獲取季度時(shí)間:季度的第一天、季度的最后一天等功能,大家參考使用吧2013-12-12
微信公眾號(hào)被動(dòng)消息回復(fù)原理解析
這篇文章主要介紹了公眾號(hào)被動(dòng)消息回復(fù)原理解析,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-06-06
Silverlight文件上傳下載實(shí)現(xiàn)方法(下載保存)
這篇文章主要介紹了Silverlight文件上傳下載實(shí)現(xiàn)方法(下載保存) ,需要的朋友可以參考下2015-11-11
C#實(shí)現(xiàn)json的序列化和反序列化實(shí)例代碼
這篇文章主要介紹了C#實(shí)現(xiàn)json的序列化和反序列化實(shí)例代碼,有需要的朋友可以參考一下2013-12-12

