-
背景介绍
在做项目的过程中,经常会遇到这样一种情况:检测一个圆环上的划痕等缺陷时,利用边缘检测等方法得到了很多细小的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