工控编程吧
标题:
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