c# 圓形識(shí)別方案和直線(xiàn)識(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; }
直線(xiàn)識(shí)別方案
步驟
1.使用最小二乘法回歸直線(xiàn):
2.得到直線(xiàn)方程y=kx+b后,計(jì)算所有點(diǎn)到直線(xiàn)的距離,若在閾值范圍內(nèi),認(rèn)為是直線(xiàn)。
實(shí)現(xiàn)
/// <summary> /// 最小二乘法求回歸直線(xiàn)方程 /// </summary> /// <param name="points">輸入數(shù)據(jù)</param> /// <param name="k">直線(xiàn)斜率</param> /// <param name="b">直線(xiàn)截距</param> /// <param name="type">直線(xiàn)類(lèi)型 1:水平線(xiàn) 2:垂直線(xiàn) 3:一般直線(xiàn)</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軸為水平線(xiàn),返回縱坐標(biāo)平均值 { b = averageY; type = 1; } else if (denominator == 0)//平行于Y軸為垂直線(xiàn),返回橫坐標(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)到擬合直線(xiàn)距離過(guò)大 } return true; } /// <summary> /// 計(jì)算點(diǎn)到直線(xiàn)的距離 /// </summary> /// <param name="p">待計(jì)算點(diǎn)</param> /// <param name="k">直線(xiàn)斜率</param> /// <param name="b">直線(xiàn)截距</param> /// <param name="type">直線(xiàn)類(lèi)型 1:水平線(xiàn) 2:垂直線(xiàn) 3:一般直線(xiàn)</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í)別方案和直線(xiàn)識(shí)別方案的實(shí)現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于c# 圓形識(shí)別方案和直線(xiàn)識(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#中IsNullOrEmpty和IsNullOrWhiteSpace的使用方法及區(qū)別解析
今天我們將探討C#中兩個(gè)常用的字符串處理方法:IsNullOrEmpty和IsNullOrWhiteSpace,本文中,我們將詳細(xì)解釋這兩個(gè)方法的功能和使用場(chǎng)景,并幫助您更好地理解它們之間的區(qū)別,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-07-07提權(quán)函數(shù)之RtlAdjustPrivilege()使用說(shuō)明
RtlAdjustPrivilege() 這玩意是在 NTDLL.DLL 里的一個(gè)不為人知的函數(shù),MS沒(méi)有公開(kāi),原因就是這玩意實(shí)在是太NB了,以至于不需要任何其他函數(shù)的幫助,僅憑這一個(gè)函數(shù)就可以獲得進(jìn)程ACL的任意權(quán)限!2011-06-06C# OpenCvSharp利用白平衡技術(shù)實(shí)現(xiàn)圖像修復(fù)功能
這篇文章主要為大家詳細(xì)介紹了C# OpenCvSharp如何利用白平衡技術(shù)實(shí)現(xiàn)圖像修復(fù)功能,文中的示例代碼講解詳細(xì),希望對(duì)大家有一定的幫助2024-02-02C#動(dòng)態(tài)編譯并執(zhí)行字符串樣例
這篇文章主要為大家詳細(xì)介紹了C#動(dòng)態(tài)編譯并執(zhí)行字符串樣例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07詳解C#如何使用讀寫(xiě)鎖控制多線(xiàn)程寫(xiě)入
這篇文章主要為大家詳細(xì)介紹了C#如何使用讀寫(xiě)鎖控制多線(xiàn)程寫(xiě)入,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01C#語(yǔ)法相比其它語(yǔ)言比較獨(dú)特的地方(三)
這篇文章主要介紹了C#語(yǔ)法相比其它語(yǔ)言比較獨(dú)特的地方(三),本文講解了在C++中允許從一個(gè)case貫穿到另一個(gè)case標(biāo)簽、as和is只會(huì)檢測(cè)待轉(zhuǎn)化類(lèi)型的類(lèi)型,而不會(huì)進(jìn)行其它操作等內(nèi)容,需要的朋友可以參考下2015-04-04C#基礎(chǔ)知識(shí) 全面解析可空類(lèi)型
C# 2.0 中還引入了可空類(lèi)型,可空類(lèi)型也是值類(lèi)型,只是可空類(lèi)型是包括null的值類(lèi)型的,下面就介紹下C#2.0中對(duì)可空類(lèi)型的支持具體有哪些內(nèi)容2012-11-11C#控制臺(tái)程序的開(kāi)發(fā)與打包為一個(gè)exe文件實(shí)例詳解
所謂控制臺(tái)程序,就是沒(méi)有界面,運(yùn)行程序后只有一個(gè)黑色的類(lèi)似cmd窗口,通過(guò)這個(gè)窗口進(jìn)行交互,下面這篇文章主要給大家介紹了關(guān)于C#控制臺(tái)程序的開(kāi)發(fā)與打包為一個(gè)exe文件的相關(guān)資料,需要的朋友可以參考下2023-05-05