【Halcon知识】外轮廓线的算子
一、提要
这里介绍,如何将图像的对象返回成图形的几何元素问题。Halcon中对应的算子很多,这里将从最重要的开始介绍,然后逐一揭示其它算子的用途。好了,就开始吧!
二、算子001:将轮廓线分割成线段和园弧
2.1 segment_contours_xld算子
segment_contours_xld:该函数将轮廓线通过分段,变成圆弧、线段的集合,通过该集合拟合成外轮廓。
1)函数形式
segment_contours_xld(Contours : ContoursSplit : Mode, SmoothCont, MaxLineDist1, MaxLineDist2 : )
2)参数解析
- Contours:被处理外轮廓
- ContoursSplit:输出曲线集合
- mode:规定曲线的形式【 'lines' | 'lines_circles' | 'lines_ellipses'】
- SmoothCont:定义光滑处理的滤波点数;
3)详细解析
- Mode:
segment_contours_xld 如果 Mode='lines' 则将输入轮廓 Contours 分割成线,如果 Mode='lines_circles' 则分割成线和圆弧,如果 Mode='lines_ellipses' 则分割成线和椭圆弧。分割的轮廓在 ContoursSplit 中返回。
关于输出轮廓是表示直线还是圆弧或椭圆弧的信息是通过全局轮廓属性“cont_approx”完成的(参见 get_contour_global_attrib_xld)。如果'cont_approx'=-1,则轮廓最好由线段近似,如果'cont_approx'=0,则由椭圆弧近似,如果'cont_approx'=1,则由圆弧近似。
- SmoothCont
segment_contours_xld 首先通过多边形逼近输入轮廓。这样,轮廓在弯曲区域中被过度分割。在此之后,如果轮廓可以通过弧更好地近似,则相邻的线段分别由圆弧或椭圆弧代替。如果 SmoothCont 设置为 > 0 的值,则首先对输入轮廓进行平滑处理(请参阅 smooth_contours_xld)。这对于防止多边形近似中的非常短的段以及实现与圆形或椭圆弧的更稳健拟合是必要的,因为平滑抑制了轮廓上的异常值。
- MaxLineDist1 和 MaxLineDist2
因为逼近是分两布完成的,首先是多变形逼近,然后是圆弧逼近。MaxLineDist1是指在多边形逼近的时候,原轮廓和拟合线的最大距离。
初始多边形近似是通过使用最大距离为 MaxLineDist1 的 Ramer 算法(参见 gen_polygons_xld)完成的。在此之后,圆弧或椭圆弧被拟合到相邻的线段中。如果生成的圆弧到轮廓的最大距离小于两条线段的最大距离,则将两条线段替换为圆弧。重复此过程,直到不再发生更改。
在此之后,仍然由线段近似的轮廓部分再次使用具有最大距离 MaxLineDist2 的多边形近似进行分割,并且在可能的情况下将新创建的线段合并为圆弧或椭圆弧。显然,仅当 MaxLineDist2 < MaxLineDist1 时才会更改输出。这种两步法比使用 MaxLineDist2 的一步法更有效,因为第一步生成的线段较少,因此必须较少执行圆形或椭圆拟合。因此,可以更有效地找到可以用长弧近似的部分输入轮廓。第二步,找到可以用短弧近似的部分输入轮廓,并细化长弧的末端部分。
生成的轮廓至少有 3 个像素长,并且包含输入轮廓的至少 6 个连续点。长度小于 3 像素或轮廓点少于 6 个的所有输入轮廓都将被复制到输出轮廓而不进行修改。
2.2 轮廓线性质算子get_contour_global_attrib_xld
get_contour_global_attrib_xld 返回一个 XLD 轮廓的全局属性值.
1)函数形式:
get_contour_global_attrib_xld(Contour : : Name : Attrib)
2)参数说明
- Contour:输入的曲线集
- Name:
- Attrib
get_contour_global_attrib_xld 返回Attrib中XLD轮廓Contour的全局属性Name的值。全局属性是为每个轮廓定义的附加值,例如,一个轮廓的回归线的法向量('regr_norm_row'和'regr_norm_col')。定义此类属性的运算符包含对已定义值的名称和语义的描述。 query_contour_global_attribs_xld 可用于查询为特定轮廓定义了哪些属性。