Halcon XLD轮廓分割

       选择的轮廓通常由或多或少的复杂形状组成。将轮廓分割成相对简单的轮廓段(如直
线、圆等)可以使轮廓分析更容易,因为由轮廓段组成的形状基元便于测量。形状基元包括
线、圆弧、椭圆弧和矩形。

      本文对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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值