Halcon视觉-刀具检测-形态学[email protected]龙熙视觉
原图
结果
halcon代码
- 8打开文件,读取图片
dev_open_file_dialog (‘read_image’, ‘default’, ‘default’, Selection)
read_image (Image, Selection)
* 阈值分割,求出刀具区域
threshold (Image, Regions, 0, 59)
difference (Image, Regions, RegionDifference)
connection (RegionDifference, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 397623, 1e+006)
shape_trans (SelectedRegions, RegionTrans, ‘convex’)
reduce_domain (Image, RegionTrans, ImageReduced)
* 求突出的孔过程*************************
* 孔洞出现在边缘,求其边缘
get_domain (ImageReduced, Domain)
erosion_circle (Domain, RegionErosion, 80)
difference (Domain, RegionErosion, RegionDifference1)
reduce_domain (ImageReduced, RegionDifference1, ImageReduced1)
* 动态阈值求边缘区域(空洞出现在边缘环形区域内)
mean_image (ImageReduced1, ImageMean, 10, 10)
dyn_threshold (ImageReduced1, ImageMean, RegionDynThresh, 3, ‘light’)
* 填充小的洞
fill_up_shape (RegionDynThresh, RegionDynThresh, ‘area’, 1, 300)
connection (RegionDynThresh, ConnectedRegions1)
* 根据面积第一次选择
select_shape (ConnectedRegions1, SelectedRegions1, ‘area’, ‘and’, 500, 1000)
shape_trans (SelectedRegions1, RegionTrans1, ‘convex’)
count_obj (RegionTrans1, Number)
* 根据圆度Circularity第二次选择,孔洞部分圆度大
gen_empty_obj (DefectHole)
for Index := 1 to Number by 1
select_obj (RegionTrans1, ObjectSelected, Index)
circularity (ObjectSelected, Circularity)
if (Circularity>0.52)
select_obj (SelectedRegions1, ObjectSelected2, Index)
opening_circle (ObjectSelected, RegionOpening, 3.5)
concat_obj (DefectHole, RegionOpening, DefectHole)
endif
endfor
connection (DefectHole, ConnectedRegions2)
count_obj (ConnectedRegions2, Number1)
* 上面求出的空洞面积不是很准,进行修改阈值第二次提取
gen_empty_obj (DefectHoleLast)
* 精确检测孔面积
for Index1 := 1 to Number1 by 1
select_obj (ConnectedRegions2, ObjectSelected1, Index1)
area_center (ObjectSelected1, Area, Row, Column)
gen_circle (Circle, Row, Column, 25)
reduce_domain (Image, Circle, ImageReduced2)
mean_image (ImageReduced2, ImageMean1, 20, 20)
dyn_threshold (ImageReduced2, ImageMean1, RegionDynThresh1, 10, ‘dark’)
connection (RegionDynThresh1, ConnectedRegions3)
select_shape (ConnectedRegions3, SelectedRegions2, ‘area’, ‘and’, 150, 500)
shape_trans (SelectedRegions2, RegionTrans2, ‘outer_circle’)
concat_obj (DefectHoleLast, RegionTrans2, DefectHoleLast)
endfor
connection (DefectHoleLast, ConnectedRegions4)
count_obj (ConnectedRegions4, Number2)
* 求凹进去的孔洞过程************
* 孔与洞特征不同,检测为孔再检测洞
* 去掉已经检测出的突起孔洞
difference (RegionDifference1, ConnectedRegions4, RegionDifference1)
reduce_domain (ImageReduced, RegionDifference1, ImageReduced1)
mean_image (ImageReduced1, ImageMean, 10, 10)
dyn_threshold (ImageReduced1, ImageMean, RegionDynThresh1, 5, ‘light’)
connection (RegionDynThresh1, ConnectedRegions6)
select_shape (ConnectedRegions6, SelectedRegions3, ‘area’, ‘and’, 100, 400)
fill_up (SelectedRegions3, RegionFillUp)
select_shape (RegionFillUp, SelectedRegions5, ‘area’, ‘and’, 200, 300)
shape_trans (SelectedRegions5, RegionTrans3, ‘convex’)
* 根据面积、圆度进行选择(第一次筛选)
select_shape (RegionTrans3, SelectedRegions4, [‘area’,‘circularity’], ‘and’, [210,0.5], [350,1])
connection (SelectedRegions4, ConnectedRegions5)
count_obj (ConnectedRegions5, Number3)
gen_empty_obj (DefectDong)
* 上述区域收缩80,该处收缩79,变大1,如果区域与变大1后的区域有交集,则将其过滤
* 主要是为了减去边缘区域的凸起进行干扰
erosion_circle (Domain, RegionErosion, 79)
for Index2 := 1 to Number3 by 1
select_obj (SelectedRegions4, ObjectSelected3, Index2)
intersection (RegionErosion, ObjectSelected3, RegionIntersection)
area_center (RegionIntersection, Area1, Row1, Column1)
* 如果没有交集,也就是交集面积为非0,则将其过滤掉,如果是0则保留
if (Area1==0)
concat_obj (DefectDong, ObjectSelected3, DefectDong)
endif
endfor
connection (DefectDong, ConnectedRegions7)
count_obj (ConnectedRegions7, Number4)
* 精确检测凹进去的区域
gen_empty_obj (DefectDongLast)
for Index2 := 1 to Number4 by 1
select_obj (ConnectedRegions7, ObjectSelected1, Index1)
area_center (ObjectSelected1, Area, Row, Column)
gen_circle (Circle, Row, Column, 25)
reduce_domain (Image, Circle, ImageReduced5)
* 动态阈值求出区域
mean_image (ImageReduced5, ImageMean1, 20, 20)
dyn_threshold (ImageReduced5, ImageMean1, RegionDynThresh1, 10, ‘dark’)
connection (RegionDynThresh1, ConnectedRegions3)
* 根据形状面积筛选
select_shape (ConnectedRegions3, SelectedRegions2, ‘area’, ‘and’, 150, 500)
* 将其进行凸性转化
shape_trans (SelectedRegions2, RegionTrans2, ‘outer_circle’)
concat_obj (DefectDongLast, RegionTrans2, DefectDongLast)
endfor
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width/2, Height/2, ‘black’, WindowHandle)
dev_clear_window ()
dev_display (Image)
dev_display (DefectHoleLast)
dev_display (DefectDongLast)
disp_message (WindowHandle, ‘共检测出孔’+Number2+‘个’, ‘window’, 12, 12, ‘black’, ‘true’)
disp_message (WindowHandle, ‘共检测出洞’+Number4+‘个’, ‘window’, 50, 12, ‘black’, ‘true’)