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

圆形识别方案

识别流程

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

实现

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.使用最小二乘法回归直线:

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

实现

/// <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# 圆形识别方案和直线识别方案的资料请关注我们其它相关文章!

(0)

相关推荐

  • c# 使用OpenCV识别硬币

    在本系列文章中,我们将使用深度神经网络(DNN)来执行硬币识别.具体来说,我们将训练一个DNN识别图像中的硬币. 在本文中,我们将描述一个OpenCV应用程序,它将检测图像中的硬币.硬币检测是硬币完整识别之前的一个常见阶段.它包括从给定图像中检测和提取硬币. 本系列附带的代码将使用Keras在C#中实现.在本系列的最后一篇文章中,我们将简要地使用ML.NET.在众多选择中,为什么要使用Keras.NET呢?Keras.NET 非常容易学习,因为它基本上是从Python编写的经典TensorFlo

  • C#如何自动识别文件的编码

    前言 C#中识别文件的编码是一个头疼的问题,最近在做导入微信商户后台退款数据时,无论怎么设置编码导出来都是乱码,后来在网上找了这个识别文件编码的代码,感觉不错.最后识别出来是gb2312,看来我还是太渣了,只能吃土了,竟然忘记了这个编码. 下面话不多说,上代码. /// <summary> /// 用于取得一个文本文件的编码方式(Encoding). /// </summary> public class TxtFileEncoder { public TxtFileEncoder

  • C# winform程序实现开机自启动并且识别是开机启动还是双击启动

    开机启动程序,在很多场合都会用到,尤其是那种在后台运行的程序. 效果图: 以上两幅图都用到了命令行启动程序,为了模拟开机启动或者其他程序调用此程序. 第一幅图:程序启动可以根据不同参数,执行不同的操作.如果是双击启动,就自动运行逻辑代码,如果是带特定参数启动,就自动运行逻辑代码. 第二幅图:winform 程序设置开机启动,模拟双击启动和开机启动的不同效果. 开机启动并自动运行方法:其实思路很简单,就是将程序添加到注册表中,这设置值的时候,加一个参数就可以了.然后程序在入口函数处判断启动参数,如

  • C#图像识别 微信跳一跳机器人

    更新 GitHub中所有类库的源码已经转换为C#版本. 准备 IDE:VisualStudio Language:C#/VB.NET GitHub:AutoJump.NET 本文将向你介绍一种通过图像识别实现"跳一跳"机器人的方法. 第一节 图像识别 文中提到的所有方法和步骤只涉及简单的向量计算. 需要用到哪些计算? 比较像素点的颜色 求向量集合的中心 计算颜色的相似度 一个RGB颜色可以看作一个三维向量 比较两个颜色的相似度可以计算它们的欧几里得距离 也可以直接比较它们的夹角:夹角越

  • C# SDK实现百度云OCR的文字识别功能

    最近项目要用到文字识别功能,所以花了几天时间整理了一下.今天就记录一下用C#实现文字识别的过程. 一.登录百度云进入控制台界面,创建应用获取秘钥 1.在百度云的产品里找到文字识别 2.找到通用文字识别点击立即使用.然后进入控制台.(这里可能会进入购买页面,可以直接购买免费版) 3.在控制台点击创建应用.然后填写相关内容就可以获得应用秘钥. 二.获得C#SDK 1.百度云C#SDK下载:下载地址 2.可以到官网直接下载:下载链接 三.将C#SDK导入VS 找到解决方案里的引用目录,右键,选择第一个

  • c# 开发语音识别程序

    AI 平台:http://ai.baidu.com/ 开发工具:vs 2017 准备工作 1.注册百度账号 2.登录百度 AI 开发平台,http://ai.baidu.com/ 3.在控制台点击"百度语音"服务,点击"创建应用",填写必填项,勾选额外接口,点击立即创建获取秘钥.在应用列表中查看自己的id 创建自己的项目 1.新建项目 打开 vs2017,点击文件,新建项目,选择 visual C# --> windows 桌面 --> windows

  • .NET/C#实现识别用户访问设备的方法

    本文实例讲述了.NET/C#实现识别用户访问设备的方法.分享给大家供大家参考,具体如下: 一.需求 需要获取到用户访问网站时使用的设备,根据不同设备返回不同类型的渲染页面. 二.实现前准备 通过NuGet把UAParser程序包添加到项目中 三.实现 新建UAParseUserAgent类文件,在这个文件中进行实现. 实现代码如下: public class UAParserUserAgent { private readonly static uap.Parser s_uap; private

  • C#二维码图片识别代码

    本文实例为大家分享了C#二维码图片识别的具体代码,供大家参考,具体内容如下 怎么用NuGet和怎么配置log4net就不介绍了,直接上代码(Visual Studio 2015 下的项目,用的.NET Framework 4.5.2). 其中QRDecodeConsoleApp.exe.config文件里配置图片路劲(默认为D:\我的文档\Pictures\二维码).图片类型(默认为*.png). 也支持在命令行里执行,exe后接图片路劲参数. 需要直接用的朋友,确认完QRDecodeDemo\

  • .NET C#利用ZXing生成、识别二维码/条形码

    一.首先下载 ZXing.Net 地址是:http://zxingnet.codeplex.com/releases/view/117068 然后将对应版本 .dll 拖入项目中,再引用之. 主要是用 BarcodeWriter.BarcodeReader. 二.生成二维码 .NET 平台的代码始终要简单些. QrCodeEncodingOptions options = new QrCodeEncodingOptions(); options.CharacterSet = "UTF-8&quo

  • C# Winform调用百度接口实现人脸识别教程(附源码)

    百度是个好东西,这篇调用了百度的接口(当然大牛也可以自己写),人脸检测技术,所以使用的前提是有网的情况下.当然大家也可以去参考百度的文档. 话不多说,我们开始: 第一步,在百度创建你的人脸识别应用 打开百度AI开放平台链接: 点击跳转百度人脸检测链接,创建新应用 创建成功成功之后.进行第二步 第二步,使用API Key和Secret Key,获取 AssetToken 平台会分配给你相关凭证,拿到API Key和Secret Key,获取 AssetToken 接下来我们创建一个AccessTo

  • c# 开发文字识别软件

    本文主要讨论C#开发使用百度文字识别OCR来识别文字,本文最后会提供本安全源代码以及运行软件包,如有需要可自行下载 开发流程如下: 1. 创建百度应用: 创建应用之后就能看到创建完的应用和 API KEY 以及 Secret KEY了,在调用API时需传入这些配置值 详见:https://console.bce.baidu.com/ai/#/ai/ocr/overview/index 2. 引用 Baidu.Aip (SDK) Baidu.Aip 封闭了文字识别Ocr API 的Http请求,简

  • C# 10分钟完成百度人脸识别(入门篇)

    嗨咯,小编在此祝大家新年快乐财多多! 今天我们来盘一盘人脸注册.人脸识别等相关操作,这是一个简单入门教程. 话不多说,我们进入主题: 完成人脸识别所需的步骤: 注册百度账号api,创建自己的应用: 创建vs控制台应用程序,引入动态链接库: 编写代码调试,效果图查看: 总结. 1.注册百度账号api,创建自己的应用 注册地址: https://login.bce.baidu.com/ 注册登录之后,在"产品服务" 菜单下找到人脸识别 ,如下图: 点击去创建自己的应用名称,其实最主要的就是

随机推荐