选择的轮廓通常由或多或少的复杂形状组成。将轮廓分割成相对简单的轮廓段(如直
线、圆等)可以使轮廓分析更容易,因为由轮廓段组成的形状基元便于测量。形状基元包括
线、圆弧、椭圆弧和矩形。
本文对Halcon常用XLD轮廓 分割算子clip_end_points_contours_xld ,segment_contour_attrib_xld,segment _ contours _ xld,split_contours_xld进行参数配置和效果展示
1)clip_end_points_contours_xld 剪切 XLD 轮廓的端点。
原型:clip_end_points_contours_xld(Contours : ClippedContours : Mode, Length : )
输入参数
Contours 输入轮廓
Mode 剪辑模式
Length 以单位像素为单位的剪切长度 (模式= 'length') 或数字 (模式= 'num_points')
输出参数
Contours 输出轮廓
gen_ellipse_contour_xld (EllipseContour, 250, 250, 0, 200, 100, 0, rad(180), 'positive', 3)
*剪切轮廓点,两端总长度为 20 像素。
clip_end_points_contours_xld (EllipseContour, ClippedContoursLength, 'length', 20)
* 在两端剪掉 20 个轮廓点。
clip_end_points_contours_xld (EllipseContour, ClippedContoursNumPoints, 'num_points', 20)
2)segment_contour_attrib_xld- 分割本地属性满足给定属性的 XLD 轮廓零件 条件。
原型:segment_contour_attrib_xld(Contour : ContourPart : Attribute, Operation, Min, Max : )
segment_contour_attrib_xld将等值线分割在轮廓Into Contour 零件轮廓部件.等值线的细分值取决于其属性的值属性(请参阅 的可能值属性)。 运算符检查哪些属性值位于给定限制内 (最小值,最大值) 并返回相应的等值线Segments 及其属性位于轮廓部件.如果操作设置为 'and',则每个给定的属性都必须在限制范围内。如果操作设置为 'or',则至少是1属性必须在限制范围内。处理属性 按照它们在属性. 如果只使用一个属性,则操作是忽视。 参数最小值和最大值可以设置为'分钟'或'最大'为了留下下限和上限, 分别打开。默认情况下,并非所有属性都在所有等值线中定义。 哪些属性 的 intent 定义取决于等值线的 instantiated,以及之前是否执行过某些操作它。例如,属性 'width_right' 和 'width_left' 只是 defined,如果等值线是使用运算符lines_gauss. 同样,属性 'distance' 仅在 distances 到其他某个等值线之前是使用distance_contours_xld或apply_distance_transform_xld.
输入参数
Contour 输入轮廓
Attribute 要检查的等值线属性。
Operation 各个属性的链接类型。
Min 属性值的下限
Max 属性值的上限
输出参数
ContourPart 分段轮廓零件
read_image (Image123, 'E:/Halcon/资源图片/121.bmp')
rgb1_to_gray (Image123, GrayImage)
edges_sub_pix (GrayImage, Edges, 'canny', 1, 20, 40)
smooth_contours_xld (Edges, SmoothedContours, 45)
distance_contours_xld (Edges, SmoothedContours, ContourD, 'point_to_segment')
segment_contour_attrib_xld (ContourD, ContourPart, 'distance', 'and', 2, 9999)
dev_display (GrayImage)
Colors := ['blue','red','green']
dev_set_color (Colors[0])
dev_display (SmoothedContours)
dev_set_color (Colors[1])
dev_display (ContourD)
dev_set_color (Colors[2])
dev_display (ContourPart)
3) segment _ contours _ xld
用于分割轮廓。根据选择的参数,可将轮廓分割成直线段、直线和圆形段或直线和椭圆段,在选择轮廓和分割轮廓之后,将形状基元拟合到轮廓或轮廓段以获得它们特定的形状参数。可以选择的形状基元包括线段、圆弧、椭圆弧和矩形,特定的形状参数包括线段的端点、圆的半径和中心。各个单独的轮廓段通过属性 cont _ approx 的值来确定,可以使用算子get _ contour _ global _ attrib _ xld 来查询属性 cont _ approx 的值。如果 cont _ approx =-1,则对应的轮廓最适合被拟合为线段;如果 cont _ approx =0,则对应的轮廓最适合被拟合为椭圆弧;如果 cont _ approx =1,则对应的轮廓最适合被拟合为圆弧。
主要的拟合算子如下:
fit _ line _ contour _ xld :拟合线段。
fit _ circle _ contour _ xld :拟合圆弧。
fit _ ellipse _ contour _ xld :拟合椭圆弧。
fit _rectangle2_ contour _ xld :拟合矩形。
利用拟合得到的参数可以生成相应的轮廓,从而进行可视化或进一步处理。生成轮廓的算子如下:
gen _ contur _ polygon _ xld :生成线段。
gen _ circle _ contour _ xld :生成圆弧。
gen _ ellipse _ contour _ xld :生成椭圆弧。
gen _rectangle2 contour _ xld :生成矩形。
segment_contours_xld(Contours : ContoursSplit : Mode, SmoothCont, MaxLineDist1, MaxLineDist2 : )
参数说明:
输入参数
Contours 需要进行分割的轮廓。
Mode 分割轮廓的方式,可以选择'lines'(使用直线段分割), 'lines_circles'(使用直线段和圆(弧)分割), 'lines_ellipses'(使用直线段和椭圆弧分割)。
SmoothCont 轮廓平滑的参数,可以抑制在折线逼近过程中过短的线段,能更加鲁棒的逼近圆和椭圆。
MaxLineDist1 第一次用Ramer算法(即用直线段递进逼近轮廓)时的MaxLineDist,在逼近完成之后,再用圆弧或椭圆弧对相邻分割线段进行拟合,如果拟合圆弧到轮廓的距离小于逼近线段到轮廓的距离,就用圆弧替代逼近线段,这个过程一致迭代直到所有的线段拟合完毕。
MaxLineDist2 第二次逼近轮廓时的MaxLineDist,只有当MaxLineDist2
输出参数
ContoursSplit 分割后的轮廓tuple。
segment_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
select_obj (ContoursSplit, Contour, I)
get_contour_global_attrib_xld (Contour, 'cont_approx', Type)
if (Type == -1)
concat_obj (Lines, Contour, Lines)
else
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)
tuple_length (Row, Length)
Colors11 := ['blue','red','green','orange','yellow']
for Index := 0 to Length-1 by 1
dev_set_color (Colors11[Index])
gen_circle_contour_xld (ContCircle, Row[Index ], Column[Index ], Radius[Index ], 0, 6.28, 'positive', 1)
endfor
dev_display (GrayImage)
Colors := ['blue','red','green']
dev_set_color (Colors[0])
dev_display (Lines)
dev_set_color (Colors[1])
dev_display (Circles)
4)获取多变性的各个边,可以使用算子split_contours_xld
原型:split_contours_xld(Polygons : Contours : Mode, Weight, Smooth : )
输如参数
Polygons 输入轮廓
Mode, 轮廓分割模式。
Weight, 平滑宽度
Smooth 平滑系数
输出参数
Contours 输出轮廓
dev_display (GrayImage)
gen_polygons_xld (Edges, Polygons, 'ramer', 1)
split_contours_xld ( Polygons, Contours, 'dominant', 1, 95)
count_obj (Contours, Number1)
dev_display (GrayImage)
for Index1 := 1 to Number1 by 1
dev_set_color (Colors11[Index1-1])
select_obj (Contours, ObjectSelected, Index1)
dev_display (ObjectSelected)
endfor