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

猜你喜欢

转载自blog.csdn.net/jgj123321/article/details/94594206