欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c# 圓形識別方案和直線識別方案的參考示例

 更新時間:2021年03月15日 09:52:31   作者:louzi  
這篇文章主要介紹了c# 圓形識別方案和直線識別方案的實(shí)現(xiàn)示例,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下

圓形識別方案

識別流程

  • 判斷是否為封閉圖形;
  • 根據(jù)圓的方程,取輸入點(diǎn)集中的1/6、3/6、5/6處的三個點(diǎn),求得圓的方程,獲取圓心及半徑;
  • 取點(diǎn)集中的部分點(diǎn),計算點(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;

 // 取鏈表上三個點(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;

 // 三個點(diǎn)確定圓的方程,獲取圓心坐標(biāo)及半徑
 GetCircle(p1, p2, p3, out center, out radius);

 // 獲取圓上平均分部的多個點(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;
}

直線識別方案

步驟

1.使用最小二乘法回歸直線:

2.得到直線方程y=kx+b后,計算所有點(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">直線類型 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)到擬合直線距離過大
 }

 return true;
}

/// <summary>
/// 計算點(diǎn)到直線的距離
/// </summary>
/// <param name="p">待計算點(diǎn)</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# 圓形識別方案和直線識別方案的實(shí)現(xiàn)示例的詳細(xì)內(nèi)容,更多關(guān)于c# 圓形識別方案和直線識別方案的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#中IsNullOrEmpty和IsNullOrWhiteSpace的使用方法及區(qū)別解析

    C#中IsNullOrEmpty和IsNullOrWhiteSpace的使用方法及區(qū)別解析

    今天我們將探討C#中兩個常用的字符串處理方法:IsNullOrEmpty和IsNullOrWhiteSpace,本文中,我們將詳細(xì)解釋這兩個方法的功能和使用場景,并幫助您更好地理解它們之間的區(qū)別,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-07-07
  • 提權(quán)函數(shù)之RtlAdjustPrivilege()使用說明

    提權(quán)函數(shù)之RtlAdjustPrivilege()使用說明

    RtlAdjustPrivilege() 這玩意是在 NTDLL.DLL 里的一個不為人知的函數(shù),MS沒有公開,原因就是這玩意實(shí)在是太NB了,以至于不需要任何其他函數(shù)的幫助,僅憑這一個函數(shù)就可以獲得進(jìn)程ACL的任意權(quán)限!
    2011-06-06
  • C# OpenCvSharp利用白平衡技術(shù)實(shí)現(xiàn)圖像修復(fù)功能

    C# OpenCvSharp利用白平衡技術(shù)實(shí)現(xiàn)圖像修復(fù)功能

    這篇文章主要為大家詳細(xì)介紹了C# OpenCvSharp如何利用白平衡技術(shù)實(shí)現(xiàn)圖像修復(fù)功能,文中的示例代碼講解詳細(xì),希望對大家有一定的幫助
    2024-02-02
  • C#動態(tài)編譯并執(zhí)行字符串樣例

    C#動態(tài)編譯并執(zhí)行字符串樣例

    這篇文章主要為大家詳細(xì)介紹了C#動態(tài)編譯并執(zhí)行字符串樣例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • C#純技術(shù)之Class寫入Json

    C#純技術(shù)之Class寫入Json

    這篇文章主要介紹了C#純技術(shù)之Class寫入Json問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 詳解C#如何使用讀寫鎖控制多線程寫入

    詳解C#如何使用讀寫鎖控制多線程寫入

    這篇文章主要為大家詳細(xì)介紹了C#如何使用讀寫鎖控制多線程寫入,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • C#語法相比其它語言比較獨(dú)特的地方(三)

    C#語法相比其它語言比較獨(dú)特的地方(三)

    這篇文章主要介紹了C#語法相比其它語言比較獨(dú)特的地方(三),本文講解了在C++中允許從一個case貫穿到另一個case標(biāo)簽、as和is只會檢測待轉(zhuǎn)化類型的類型,而不會進(jìn)行其它操作等內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • C#基礎(chǔ)知識 全面解析可空類型

    C#基礎(chǔ)知識 全面解析可空類型

    C# 2.0 中還引入了可空類型,可空類型也是值類型,只是可空類型是包括null的值類型的,下面就介紹下C#2.0中對可空類型的支持具體有哪些內(nèi)容
    2012-11-11
  • UnityShader3實(shí)現(xiàn)彩光效果

    UnityShader3實(shí)現(xiàn)彩光效果

    這篇文章主要為大家詳細(xì)介紹了UnityShader3實(shí)現(xiàn)彩光效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • C#控制臺程序的開發(fā)與打包為一個exe文件實(shí)例詳解

    C#控制臺程序的開發(fā)與打包為一個exe文件實(shí)例詳解

    所謂控制臺程序,就是沒有界面,運(yùn)行程序后只有一個黑色的類似cmd窗口,通過這個窗口進(jìn)行交互,下面這篇文章主要給大家介紹了關(guān)于C#控制臺程序的開發(fā)與打包為一個exe文件的相關(guān)資料,需要的朋友可以參考下
    2023-05-05

最新評論