Halcon拟合系列(5)已知N个离散点,如何拟合成一个圆,得到圆心和半径?

788 阅读2分钟

来看源码:

Row := [0, 100, 200, 100, 0]
Col := [100, 0, 100, 200, 100]

Row := [61.098, 62.402, 61.525]//y
Col := [154.747, 138.099, 130.394]//x

*具体多少个点,圆弧旋转16-20个点完全够了。
Row := [24.052,26.729,28.815,30.285,31.124,31.281,30.792,29.659,27.943,25.622]//y
Col := [219.819,214.325,208.543,202.413,196.111,189.965,183.736,177.558,171.717,165.898]//x

gen_contour_polygon_xld (Contour, Row, Col)
fit_circle_contour_xld (Contour, 'atukey', -1, 2, 0, 10, 1, Row1, Column1, Radius1, StartPhi1, EndPhi1, PointOrder1)
fit_circle_contour_xld (Contour, 'ahuber', -1, 2, 0, 3, 2, Row2, Column2, Radius2, StartPhi2, EndPhi2, PointOrder2)
*默认参数
fit_circle_contour_xld (Contour, 'algebraic', -1, 0, 0, 3, 2, Row3, Column3, Radius3, StartPhi3, EndPhi3, PointOrder3)
**轮廓拟合圆,旋转标定算法要选择'geotukey',请看官方说明文档
fit_circle_contour_xld (Contour, 'geotukey', -1, 0, 0, 3, 2, Row_C, Column_C, Radius_C, StartPhi_C, EndPhi_C, PointOrder_C)

dev_set_color ('magenta')
gen_circle_contour_xld (ContCircle, Row2, Column2, Radius2, 0, 4 * acos(0), 'positive', 1)
dev_set_color ('blue')
gen_circle_contour_xld (ContCircle, Row3, Column3, Radius3, 0, 4 * acos(0), 'positive', 1)
dev_set_color ('violet')
gen_circle_contour_xld (ContCircle, Row_C, Column_C, Radius_C, 0, 4 * acos(0), 'positive', 1)
stop()

选用'geotukey'的说明:
类似于“几何”。在此,基于Tukey的方法对轮廓点进行加权,并忽略异常值(请参见下文)。

对于“ * huber”和“ * tukey”,使用可靠的误差统计信息来估计到轮廓点的距离的标准偏差,而不会偏离近似圆。参数ClippingFactor(标准偏差的比例因子)控制离群值的数量:为ClippingFactor选择的值越小,检测到的离群值就越多。在Tukey算法中,离群值被删除,而在Huber算法中,离群值仅被衰减,或更精确地说,它们是线性加权的。在没有任何鲁棒加权的情况下,距离的平方被作为优化中的误差值,即最小二乘公式。在实践中,建议使用Tukey的方法。

参数“迭代次数”指定算法“代数”,“ ahuber”和“ atukey”的迭代次数。对于算法“几何”,“ geohuber”和“ geotukey”,将忽略此参数。如果将“迭代次数”设置为零,则该算法不会在拟合圆上执行迭代改进,而仅根据所选的异常值检查初始猜测是否已经足够接近。

为了减少计算量,可以将圆的拟合限制为轮廓点的子集:如果将-1以外的值分配给MaxNumPoints,则最多只能使用MaxNumPoints点(均匀分布在轮廓上)。

对于圆弧,选择圆上最接近原始轮廓的起点和终点的点作为起点和终点。在StartPhi和EndPhi中返回了指向X轴的相应角度,另请参见gen_ellipse_contour_xld。轮廓的起点和终点之间的距离小于或等于MaxClosureDist的轮廓被认为是闭合的。因此,它们由圆形而不是圆弧近似。由于预处理中的伪影,轮廓的起点和终点可能有问题。因此,可以从圆拟合中排除轮廓起点和终点的ClippingEndPoints点。但是,它们仍用于确定StartPhi和EndPhi。

拟合圆的轮廓点的最小数量为3。