Halcon学习——gment_contours_xld函数(轮廓
分割)
在⽤Halcon进⾏图像处理的过程中,经常需要对提取出的轮廓进⾏分割,将轮廓分为直线段、圆(或圆弧)、椭圆弧不同的段,轮廓分割最常⽤的算⼦
是gment_contours_xld。
gment_contours_xld——Segment XLD contours into line gments and circular or elliptic arcs(将⼀个XLD轮廓分割为直线段、圆(圆弧)、椭圆弧。)signature(语法):
gment_contours_xld( : : , , , : )
参数说明:
Contours 需要进⾏分割的轮廓。
ContoursSplit 分割后的轮廓tuple。
Mode 分割轮廓的⽅式,可以选择'lines'(使⽤直线段分割), 'lines_circles'(使⽤直线段和圆(弧)分割)
, 'lines_ellips'(使⽤直线段和椭圆弧分割)。SmoothCont 轮廓平滑的参数,可以抑制在折线逼近过程中过短的线段,能更加鲁棒的逼近圆和椭圆。
MaxLineDist1 第⼀次⽤Ramer算法(即⽤直线段递进逼近轮廓)时的MaxLineDist,在逼近完成之后,再⽤圆弧或椭圆弧对相邻分割线段进⾏拟合,如果拟合圆弧到轮廓的距离⼩于逼近线段到轮廓的距离,就⽤圆弧替代逼近线段,这个过程⼀致迭代直到所有的线段拟合完毕。
MaxLineDist2 第⼆次逼近轮廓时的MaxLineDist,只有当MaxLineDist2
这种两步逼近算法效率较⾼,因为在第⼀次逼近过程中,递进逼近的直线段较少,因此较⼤直径的圆弧能够被⾼效的分割出来。在第⼆次逼近过程中,能够被⼩直径圆弧逼近的轮廓被找到,同时⼤直径圆弧的末端被重新定义。
Remark:
分割得到的轮廓是直线段、圆(圆弧)或者椭圆弧可以通过分割后轮廓的全局属性'cont_approx’参数的值来确定(参考get_contour_global_attrib_xld)。
如果'cont_approx'=-1,这⼀部分轮廓最适合被拟合为直线段。
如果'cont_approx'=0,这⼀部分轮廓最适合被拟合为椭圆弧。
如果'cont_approx'=1,这⼀部分轮廓最适合被拟合为圆弧。
轮廓分割的例⼦:
read_image (Image, 'pumpe')
edges_sub_pix (Image, Edges, 'canny', 1.5, 15, 40)
gment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 2)
count_obj (ContoursSplit, Number)
gen_empty_obj (Lines)
gen_empty_obj (Circles)
for I := 1 to Number by 1
lect_obj (ContoursSplit, Contour, I)
get_contour_global_attrib_xld (Contour, 'cont_approx', Type)
if (Type = -1)
concat_obj (Lines, Contour, Lines)
el
concat_obj (Circles, Contour, Circles)
endif
endfor
fit_line_contour_xld (Lines, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, \
RowEnd, ColEnd, Nr, Nc, Dist)
fit_circle_contour_xld (Circles, 'atukey', -1, 2, 0, 3, 2, Row, Column, \
Radius, StartPhi, EndPhi, PointOrder)