c# 圆形识别方案和直线识别方案的参考示例
圆形识别方案
识别流程
- 判断是否为封闭图形;
- 根据圆的方程,取输入点集中的1/6、3/6、5/6处的三个点,求得圆的方程,获取圆心及半径;
- 取点集中的部分点,计算点到圆心的距离与半径的比例,与设定的阈值比较,得出结果。~~~~
实现
publicstaticboolIsCircle(Listpoints,outPointcenter,outdoubleradius) { intlen=points.Count; center=newPoint(); radius=0; //判断是否为封闭图形 if(!IsClosedFigure(points)) returnfalse; intjudgePointNum=len*50/100; if(len MaxRatio) returnfalse; } returntrue; }
直线识别方案
步骤
1.使用最小二乘法回归直线:
2.得到直线方程y=kx+b后,计算所有点到直线的距离,若在阈值范围内,认为是直线。
实现
//////最小二乘法求回归直线方程 /// ///输入数据 /// 直线斜率 /// 直线截距 /// 直线类型1:水平线2:垂直线3:一般直线 /// publicstaticboolIsLine(List points,outdoublek,outdoubleb,outinttype) { k=0; b=0; type=0; if(points.Count<2)returnfalse; doubleaverageX=0,averageY=0,n=0; n=points.Count; foreach(Pointpinpoints) { averageX+=p.X; averageY+=p.Y; } averageX/=n; averageY/=n; doublenumerator=0,denominator=0; foreach(Pointpinpoints) { numerator+=(p.X-averageX)*(p.Y-averageY); denominator+=(p.X-averageX)*(p.X-averageX); } if(numerator==0)//平行于X轴为水平线,返回纵坐标平均值 { b=averageY; type=1; } elseif(denominator==0)//平行于Y轴为垂直线,返回横坐标平均值 { b=averageX; type=2; } else { type=3; } k=numerator/denominator; b=averageY-k*averageX; foreach(Pointpinpoints) { dis=GetPoint2LineDistance(p,k,b,type); if(dis>MAX_POINT_LINE_DIS)returnfalse;//点到拟合直线距离过大 } returntrue; } /// ///计算点到直线的距离 /// ///待计算点 /// 直线斜率 /// 直线截距 /// 直线类型1:水平线2:垂直线3:一般直线 /// 距离 privatestaticdoubleGetPoint2LineDistance(Pointp,doublek,doubleb,inttype) { if(type==1) { returnMath.Abs(p.Y-b); } elseif(type==2) { returnMath.Abs(p.X-b); } else { doublenumerator=0,denominator=0; numerator=Math.Abs(k*p.X-p.Y+b); denominator=Math.Sqrt(k*k+1); returnnumerator/denominator; } }
以上就是c#圆形识别方案和直线识别方案的实现示例的详细内容,更多关于c#圆形识别方案和直线识别方案的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。