QQ登录

只需一步,快速开始

halcon union_collinear_contours_xld函数介绍

[ 复制链接 ]
union_collinear_contours_xld(Contours : UnionContours : MaxDistAbs, MaxDistRel, MaxShift, MaxAngle, Mode : )
union_collinear_contours_xld将输入的XLD轮廓Contours 中近似共线的所有轮廓连接起来,
即,大致在同一直线上。
连接的轮廓由各输入轮廓的轮廓点拼接而成。
它们连同无法与任何其他轮廓结合的轮廓一起返回,
保存于UnionContours 。

典型应用
union_collinear_contours_xld可用于在提取的边缘或线条之间建立桥梁,
这可能是由于局部图像对比度较低造成的。
它也可以用来联合共线边缘或线段,这些线段是分开的,
通常,union_collinear_contours_xld是提取连线操作的部分功能代码。

例如
下面的示例显示了union_collinear_contours_xld的效果。
在左侧,显示了一组断开连接的输入轮廓。
位于矩形同一边框上的轮廓近似共线。
在右边,union_collinear_contours_xld的结果表明,
近似共线的轮廓已经统一。
请注意,彼此近似垂直的轮廓没有统一起来。
2019-05-22_220757.jpg
利用参数MaxDistAbs、MaxDistRel、MaxShift和MaxAngle定义了两条轮廓线共线性的条件。
参数模式控制输入轮廓属性的处理。


原则上,前三个参数的测量取决于每对等值线的计算顺序,
即,轮廓线作为参考轮廓线,与第二轮廓连接。
为了避免这种依赖关系,在两个方向上对各自的度量值进行评估,
并选择导致这些度量值更小的轮廓顺序。
注意,在下面的插图中,左边的轮廓线总是用作参考轮廓线。


MaxDistAbs
参数MaxDistAbs定义了两个轮廓之间可接受的最大绝对距离。
距离是沿着参考轮廓的回归线测量的。
因此,它是两个轮廓之间的间隙投影到参考轮廓的回归线上的长度。
20179-05-22_220757.jpg
MaxDistRel
参数MaxDistRel定义了两个轮廓之间可接受的最大相对距离。
相对距离的计算方法是将距离a(参见参数MaxDistAbs的描述)除以参考轮廓的长度b。
20179-05-22_220757.jpg


MaxShift
参数MaxShift定义了第二个轮廓与参考轮廓的回归线之间的最大距离。
这个距离是垂直于参考轮廓的回归线测量的。
20179-05-22_220757.jpg
MaxAngle
参数MaxAngle定义了两个轮廓的回归线之间的最大角度(以弧度为单位)。
20179-05-22_220757.jpg
Mode
参数Mode控制输入轮廓可能可用的属性的处理,
例如,如果轮廓是由edges_sub_pix创建的。


attr_keep
所有属性都复制到输出轮廓。

全局属性只保留那些与其他轮廓不统一的轮廓。
一般情况下,无法从单个轮廓的全局属性确定统一轮廓的全局属性。

attr_forget
输出轮廓将不包含任何属性。
如果在进一步计算中不需要属性,
则出于性能原因可以选择此模式。
要查询哪些属性可用,可以使用query_contour_attribs_xld。


实现的细节
对输入轮廓进行了分析,并进行了两两联合。
重复这个成对的过程,直到不再有不连接的共线轮廓。
如有必要,翻转输入轮廓点的顺序,
使已连接的轮廓的端点在结果点列表中直接相邻。


两个轮廓只有在满足所有条件时才统一,
即,所有值必须低于指定的阈值。
另一个先决条件是,轮廓线之间不能明显重叠
(有关重叠的说明,请参阅union_collinear_contours_ext_xld)。
最多达0.5像素的重叠是可以容忍的。
为了允许更大的重叠,
可以使用union_collinear_contours_ext_xld。


除了寻找要联合的轮廓对外,
union_collinear_contours_xld的行为还需要确定联合轮廓的顺序。
为此,所有可以合并的轮廓对都要通过计算合并的成本来进行评级。
代价是度量值的和,每个度量值由各自的阈值标准化,
由参数MaxDistAbs、MaxDistRel、MaxShift和MaxAngle定义。
首先将成本最低的轮廓对统一起来。
然后,根据新创建的轮廓对成本进行更新,
并在轮廓列表中搜索要合并的下一对最佳轮廓。


注意,union_collinear_contours_xld中使用的共线性定义依赖于输入轮廓的回归线。
为了避免意外的结果,请确保输入轮廓近似于直线,
例如,使用segment_contours_xld将它们分割为线段。
还要注意,闭合轮廓与任何其他轮廓都不连接。




限制和选择
union_collinear_contours_xld只能在应该连接的轮廓近似于直线时使用。
如果轮廓线近似于一个圆,
则可以使用union_cocircular_contours_xld。
如果轮廓线表示自由形式,
则可以使用union_cotangential_contours_xld。
如果只需要关闭轮廓之间很小的间隙,不管轮廓的方向如何,
都可以使用union_adjacent_contours_xld 。


如果union_collinear_contours_xld提供的参数调整不够,
则可以使用union_collinear_contours_ext_xld更具体地定义统一标准。
其中,union_collinear_contours_ext_xld允许设置轮廓重叠的容错以及总成本的限制,
以避免连接接近所有标准限制的轮廓。




例程
* 例程演示如何使用union_collinear_contours_xld连接花线的线段
*这是新的也是建议使用的算子。
*另外也演示如何使用旧的算子union_straight_contours_xld来
*连接不共线,但含相邻点的轮廓
read_image (Image, 'pads')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_set_colored (12)
dev_set_draw ('margin')
dev_display (Image)
Border := 35
rectangle1_domain (Image, ImageReduced, Border, Border, 576 - Border, 768 - Border)
* 提取图像线段轮廓,连接共线的轮廓线,保留长度在指定范围的线段。
* edges_sub_pix (ImageReduced, Edges, 'lanser2', 0.16, 3, 5)
edges_sub_pix (ImageReduced, Edges, 'canny', 5, 3, 5)
segment_contours_xld (Edges, ContoursSplit, 'lines', 5, 4, 2)
select_contours_xld (ContoursSplit, SelectedContours, 'contour_length', 20, Width / 2, -0.5, 0.5)
union_collinear_contours_xld (SelectedContours, UnionContours, 10, 1, 8, 0.4, 'attr_keep')
select_contours_xld (UnionContours, SelectedContours1, 'contour_length', 50, 10000, -0.5, 0.5)
* 连接相邻轮廓,拟合最小外接旋转矩形
union_adjacent_contours_xld (SelectedContours1, UnionContours1, 20, 1, 'attr_keep')
smallest_rectangle2_xld (UnionContours1, Row, Column, Phi, Length1, Length2)
gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)
stop ()
*将每个轮廓段拟合成线段
dev_display (Image)
fit_line_contour_xld (SelectedContours1, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
for i := 0 to |RowBegin| - 1 by 1
    gen_contour_polygon_xld (Contour, [RowBegin,RowEnd], [ColBegin,ColEnd])
    dev_display (Contour)
endfor
  

halcon从自学到接项目视频教程,另外再赠送全网最全资源  

  

欢迎围观我录制的一套halcon自学视频教程(进入)




回复

使用道具 举报

快速回复 返回列表 客服中心 搜索