Halcon筛选包含在闭合轮廓内部的xld

  • 背景介绍

在做项目的过程中,经常会遇到这样一种情况:检测一个圆环上的划痕等缺陷时,利用边缘检测等方法得到了很多细小的xld,其中大部分都是干扰,根据判断条件,在圆环内部的就是划痕,在圆环外部的就是干扰(如下图所示)。如何写程序实现呢?

图例:

代码:


**************************************************
*********该程序用来筛选在Contours1内的小xld********
**************************************************

*生成大的闭合轮廓Contours1
gen_circle (Circle, 229, 289, 158)
gen_contour_region_xld (Circle, Contours1, 'border')

*生成顶端的小轮廓Contours2
gen_region_line (RegionLines, 42, 261, 44, 313)
gen_contour_region_xld (RegionLines, Contours2, 'border')
*生成底端的小轮廓Contours3
gen_region_line (RegionLines1, 346, 256, 347, 318)
gen_contour_region_xld (RegionLines1, Contours3, 'border')
*生成左端的小轮廓Contours4
gen_region_line (RegionLines2, 207, 89, 205, 142)
gen_contour_region_xld (RegionLines2, Contours4, 'border')
*生成右端的小轮廓Contours5
gen_region_line (RegionLines3, 218, 394, 211, 457)
gen_contour_region_xld (RegionLines3, Contours5, 'border')
*将四个小轮廓合并到一起
concat_obj (Contours2, Contours3, Contours3)
concat_obj (Contours3, Contours4, Contours4)
concat_obj (Contours4, Contours5, Contours5)
dev_clear_window ()
dev_display (Contours1)
dev_display (Contours5)
stop()

*开始判断
count_obj (Contours5, Number)
for Index := 1 to Number by 1
    select_obj (Contours5, ObjectSelected, Index)
    get_contour_xld (ObjectSelected, Row, Col)
    test_xld_point (Contours1, Row, Col, IsInsideContours)  //判断该xld上所有点是否在轮廓内,1表示在,0表示不在
    NumOfOne:=sum(IsInsideContours)                         //1的个数
    NumOfZero:= |IsInsideContours|-NumOfOne                 //0的个数
    if(NumOfOne > NumOfZero)                                //1的个数大于0的个数,即判定该xld在轮廓内
        dev_clear_window ()
        dev_display (Contours1)
        dev_display (ObjectSelected)
        Message := '该xld在轮廓内'
        disp_message (200000, Message, 'window', 12, 12, 'white', 'false')
        stop()
    else
        dev_clear_window ()
        dev_display (Contours1)
        dev_display (ObjectSelected)
        Message := '该xld不在轮廓内'
        disp_message (200000, Message, 'window', 12,12, 'white', 'false')
        stop()
    endif
endfor

 

<think>嗯,用户问的是Halcon中使用select_shape_xld之后如何整合结果。首先,我得回忆HalconXLD处理的基本流程。select_shape_xld通常用于根据形状特征筛选轮廓,比如面积、长度、圆度等。用户可能已经用这个算子筛选出了符合条件的XLD轮廓,现在需要将这些筛选后的轮廓整合起来,可能是为了进步处理或分析。 首先,我需要确认用户的具体需求。整合可能有多种形式,比如合并多个轮廓一个、收集所有符合条件的轮廓一个对象中,或者提取它们的特征进行统计。不同的需求对应不同的方法。 可能的步骤是:使用select_shape_xld筛选出符合条件的轮廓后,得到的每个轮廓都是独立的XLD对象。如果需要合并这些轮廓,可能需要使用concat_obj算子将多个对象连接成一个对象数组。或者,如果用户需要将这些轮廓合并成一个XLD对象,可能需要使用union或union2_closed_xld等算子,具体取决于轮廓是否闭合以及合并的方式。 ,用户可能对如何遍历筛选后的轮廓有疑问,可能需要使用算子如count_obj来获取数量,然后循环处理每个轮廓。或者,如果用户需要进步提取特征,可能需要使用area_center_xld、length_xld等算子来获取各个轮廓的属性,然后进行统计分析。 还要考虑错误处理,比如筛选后可能没有符合条件的轮廓,这时候需要处理空对象的情况,避免后续操作出错。同时,性能优化方面,如果处理大量轮廓,可能需要高效的方法来整合,避免不必要的循环。 可能用户遇到的困难是如何将多个XLD对象合并或管理,比如想要显示所有符合条件的轮廓,或者将它们作为整体进行测量。这时候,concat_obj可能不够,因为只是将对象放入数组,而实际处理可能需要合并几何形状。因此,union相关的算子会更合适。 总结下来,回答需要分步骤说明不同的整合方法,包括连接对象数组、合并几何形状、特征提取和统计,以及注意事项如空对象处理。同时,提供示例代码帮助用户理解具体实现。</think>在Halcon中,使用`select_shape_xld`筛选XLD轮廓后,可通过以下步骤整合结果: 1. **筛选后获取对象数组** ```python select_shape_xld(XLDObjects, SelectedXLD, 'area', 'and', 100, 1000) # 筛选面积在100到1000像素的XLD轮廓 ``` 2. **结果整合方法** - **方法1:对象数组连接** ```python count_obj(SelectedXLD, Number) # 获取选中轮廓数量 concat_obj(SelectedXLD, FinalXLD, FinalXLD) # 循环连接成单个对象数组 ``` - **方法2:几何合并** ```python union_closed_xld(SelectedXLD, UnionXLD) # 合并闭合轮廓 union2_closed_xld(Contour1, Contour2, UnionXLD) # 两两合并 ``` - **方法3:特征统计** ```python area_center_xld(SelectedXLD, Area, Row, Column) # 获取所有选中轮廓的面积 sum(Area, TotalArea) # 计算总面积 ``` 3. **注意事项** - 使用`count_obj`检查选中轮廓数量,避免空对象操作 - 闭合/非闭合轮廓需选用对应的union方法 - 大数量级轮廓处理建议使用并行计算优化 **典型应用场景**: ```python * 缺陷检测中合并多个缺陷区域 * 测量总周长/面积时特征值累加 * 多目标识别后生成统ROI区域 ``` 建议根据具体需求选择整合方式。如需保持独立轮廓特征,使用对象数组;如需几何合并,优先考虑闭合轮廓处理。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的路飞桑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值