halcon中如何生成椭圆_halcon fit_ellipse_contour_xld函数介绍

fit_ellipse_contour_xld(Contours : : Algorithm, MaxNumPoints, MaxClosureDist, ClippingEndPoints, VossTabSize, Iterations, ClippingFactor : Row, Column, Phi, Radius1, Radius2, StartPhi, EndPhi, PointOrder)

fit_ellipse_contour_xld用椭圆圆弧或闭合椭圆逼近XLD轮廓线。

它不执行输入轮廓的分割。

因此,必须确保每个轮廓对应一个且仅对应一个椭圆结构。

操作符返回每个轮廓的中心(Row, Column)、主轴的方向Phi、较大的半轴Radius1的长度,较小的半轴Radius2的长度。

此外,椭圆弧还返回了与起点和终点StartPhi、EndPhi和沿边界的点阶PointOrder。

对于闭合椭圆,这些参数设置为0、2*pai,和“positive”。

椭圆拟合的算法可以通过Algorithm来选择:

fitzgibbon

这种方法使代数距离最小化

2019-05-23_110423.jpg (2.35 KB, 下载次数: 1)

2019-5-23 16:49 上传

在轮廓线点(xi,yi)和生成的椭圆之间。

约束4ac - b^2 = 1保证得到的多项式描述的是椭圆(而不是双曲线或抛物线)。

fhuber

类似于“fitzgibbon”。这里根据Huber方法对轮廓点进行加权,

以减小异常点的影响(见下)。

ftukey

类似于“fitzgibbon”。这里根据Tukey的方法对轮廓点进行加权,

忽略异常值(见下)。

geometric

这种方法使轮廓线点与最终椭圆之间的几何距离最小化。

距离测量在统计上是最优的,但由于计算是一个迭代的过程,

需要更多的计算时间。

如果轮廓线点被噪声严重扭曲,建议使用此选项。

geohuber

类似于“geometric”。这里根据Huber方法对轮廓点进行加权,以减小异常点的影响(见下)。

geotukey

类似于“几何”。这里根据Tukey的方法对轮廓点进行加权,忽略异常值(见下)。

voss

每个输入轮廓在仿射标准位置进行转换。

根据变换后的轮廓(即封闭图像区域)的矩值,

选择标准圆段,其标准位置与轮廓的标准位置最匹配。

在仿射变换的基础上对所选圆段的标准位置对应的椭圆进行再变换,

仿射变换产生轮廓的标准位置,从而使椭圆与原轮廓匹配。

VossTabSize标准圆段用于此计算。

为了加快处理速度,对应的力矩和其他数据存储在一个表中,

这个表是在第一次调用fit_ellipse_contour_xld时创建的(VossTabSize有一个特定的值)。

focpoints

椭圆上的每个点P都满足到焦点(f1,f2)距离之和等于较大半轴a长度的两倍的约束条件。

该方法通过最小二乘优化,使所有轮廓点的偏差pf1+pf2-2a最小。

fphuber

类似于“focpoints”。本文采用加权最小二乘优化方法,

在Huber方法的基础上减小了异常值的影响(见下文)。

fptukey

类似于“focpoints”。本文采用加权最小二乘优化方法,

忽略异常值(见下)。

对于“*huber”和“*tukey”,使用鲁棒误差统计量来估计从轮廓点到距离的标准差,

而没有离群点到近似椭圆的距离。

参数ClippingFactor(标准偏差的比例因子)控制异常值的数量:

为ClippingFactor选择的值越小,分类为异常值的点越多。

在拟合过程中,每个等高线点都被单独加权,

并根据其权重进行贡献。

鲁棒加权和拟合的集合可以迭代。

迭代的总数由Iterations给出。

该参数对除基于几何距离的两种算法外的所有算法均有相关性,

即“geohuber”和“geotukey”,其中忽略该参数。

如果算法在此迭代次数内没有找到拟合椭圆,则拟合直线;

在这种情况下,Radius2是零。在Tukey算法中,异常值被删除,

而在Huber算法中,异常值只被阻尼,或者更精确地说,它们是线性加权的。

在不进行鲁棒加权的情况下,将距离的平方和作为误差值进行优化,即采用最小二乘公式。

在实践中,推荐了Tukey的方法。

为了减少计算量,椭圆的拟合可以限制在轮廓点的一个子集内:

如果MaxNumPoints分配的值不是-1,

那么只使用MaxNumPoints(均匀分布在轮廓上)。

对于椭圆圆弧,选取椭圆上最接近原始轮廓起点和终点的点作为起点和终点。

与椭圆主轴对应的角在StartPhi和EndPhi中返回,也参见gen_ellipse_contour_xld。

对于起点和终点之间的距离小于或等于MaxClosureDist的轮廓线,则认为轮廓线是闭合的。

因此,它们用椭圆代替椭圆弧来近似。

“focpoints”算法比开放轮廓算法更快、更不精确地确定了封闭轮廓优化的初始参数。

因此,在某些情况下,当应用于闭合轮廓时,可能需要更多的迭代。

由于预处理中的伪影,轮廓的起点和终点可能会出现错误。

因此,可以从椭圆的拟合中排除轮廓的起点和终点处的裁剪端点。

然而,它们仍然用于StartPhi和EndPhi的测定。

拟合椭圆所需的最小轮廓点个数为5。因此,要求轮廓点的个数至少为5+2*ClippingEndPoints

例程

read_image (Image, 'caltab')

find_caltab (Image, CalPlate, 'caltab_800mm.descr', 3, 112, 5)

reduce_domain (Image, CalPlate, ImageReduced)

edges_sub_pix (ImageReduced, Edges, 'lanser2', 0.5, 20, 40)

select_contours_xld (Edges, EdgesClosed, 'closed', 0, 2.0, 0, 0)

select_contours_xld (EdgesClosed, EdgesMarks, 'length', 20, 80, 0, 0)

fit_ellipse_contour_xld (EdgesMarks, 'fitzgibbon', -1, 2, 0, 200, 3, 2.0, \

Row, Column, Phi, Radius1, Radius2, StartPhi, \

EndPhi, PointOrder)

gen_ellipse_contour_xld (EllMarks, Row, Column, Phi, Radius1, Radius2, \

StartPhi, EndPhi, PointOrder, 1.5)

length_xld(EllMarks,Length)

halcon从自学到接项目视频教程,另外再赠送全网最全资源

你可能感兴趣的:(halcon中如何生成椭圆)