工控编程吧

标题: halcon fit_circle_contour_xld函数介绍 [打印本页]

作者: qq263946146    时间: 2019-5-23 16:42
标题: halcon fit_circle_contour_xld函数介绍
fit_circle_contour_xld(Contours : : Algorithm, MaxNumPoints, MaxClosureDist, ClippingEndPoints, Iterations, ClippingFactor : Row, Column, Radius, StartPhi, EndPhi, PointOrder)

fit_circle_contour_xld用圆拟合XLD轮廓。
它不执行输入轮廓的分割。
因此,必须确保每个轮廓对应一个且仅对应一个圆。
操作符为每个轮廓返回中心(Row, Column)和半径Radius
圆的拟合算法可以通过Algorithm来选择:


algebraic
这种方法使轮廓线点与结果圆之间的代数距离最小化。


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


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


geometric
这种方法使轮廓线点与结果圆之间的几何距离最小化。
距离测量在统计上是最优的,但需要更多的计算时间。
如果轮廓线点被噪声严重扭曲,建议使用此选项。


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


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


对于“*huber”和“*tukey”,使用鲁棒误差统计量来估计从轮廓点到距离的标准差,
而没有离群点到近似圆的距离。


参数ClippingFactor(标准偏差的比例因子)控制异常值的数量:
为剪裁因子选择的值越小,
检测到的异常值就越多。
在Tukey算法中,异常值被删除,
而在Huber算法中,异常值只被阻尼,
或者更精确地说,它们是线性加权的。
在不进行鲁棒加权的情况下,将距离的平方和作为误差值进行优化,
即采用最小二乘公式。
在实践中,推荐了Tukey的方法。




参数 Iterations指定算法“algebraic”、“ahuber”和“atukey”的迭代次数。
该参数算法“algebraic”,“geohuber”和“geotukey”被忽略
如果迭代被设置为零,该算法不会对拟合圆进行迭代改进,
而是根据异常值的选择处理,只检查初始猜测是否已经足够接近。


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


对于圆弧,选取距离原始轮廓起点和终点最近的圆上的点作为起点和终点。
与x轴相关的同位角在StartPhi和EndPhi中返回,
参见gen_ellipse_contour_xld。
对于起点和终点之间的距离小于或等于MaxClosureDist的轮廓线,
则认为轮廓线是闭合的。
因此,它们近似于圆而不是圆弧。
由于预处理中的伪影,轮廓的起点和终点可能会出现错误。
因此,可以从拟合圆中排除轮廓的起点和终点处的裁剪端点。
然而,它们仍然用于StartPhi和EndPhi的测定。


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

参数
Contours,Algorithm为输入的要被拟合的轮廓与拟合算法,
拟合算法有'ahuber', 'algebraic', 'atukey', 'geohuber', 'geometric', 'geotukey'。
MaxNumPoints用于计算的最大轮廓点数量(-1表示所有点)。
MaxClosureDist轮廓线的端点之间被认为是“闭合”的最大距离。
ClippingEndPoints拟合时忽略轮廓开始点和结束点的个数。
Iterations鲁棒加权拟合的最大迭代次数。
ClippingFactor消除异常值的裁剪因子(典型的:Huber 1.0和Tukey 2.0)。
Row,Column,Radius,StartPhi,EndPhi为拟合结果圆的参数,
分别 为圆心坐标,半径,起,终点角度。
PointOrder沿边界的点顺序。


例程
read_image (Image, 'double_circle')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
* 提取图像边缘区域
fast_threshold (Image, Region, 0, 120, 7)
boundary (Region, RegionBorder, 'inner')
clip_region_rel (RegionBorder, RegionClipped, 5, 5, 5, 5)
dilation_circle (RegionClipped, RegionDilation, 2.5)
reduce_domain (Image, RegionDilation, ImageReduced)
*提取图像XLD边缘
edges_sub_pix (ImageReduced, Edges, 'canny', 2, 20, 60)
segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 3)
dev_display (Image)
dev_set_draw ('margin')
dev_set_color ('white')
dev_update_window ('off')
count_obj (ContoursSplit, Number)
for I := 1 to Number by 1
  select_obj (ContoursSplit, ObjectSelected, I)
  get_contour_global_attrib_xld (ObjectSelected, 'cont_approx', Attrib)
*根据轮廓属性进行拟合为圆弧
  if (Attrib > 0)
    fit_circle_contour_xld (ObjectSelected, 'ahuber', -1, 2, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
    gen_circle_contour_xld (ContCircle, Row, Column, Radius, 0, rad(360), 'positive', 1.0)
    dev_display (ContCircle)
  endif
endfor
dev_set_colored (12)
dev_set_line_width (3)
dev_display (ContoursSplit)



[halcon]1[/halcon]





欢迎光临 工控编程吧 (https://www.gkbc8.com/) Powered by Discuz! X3.4