halcon教程- 边缘检测 亚像素边缘提取 轮廓提取

知识点是鱼,套路是渔。授人以鱼不如授人以渔!”

       一般在做项目时,无论是边缘检测、瑕疵检测、Blob检测等应用,都有一定的通用套路,也可以说是通用处理框架,在此框架下根据具体应用具体分析,基本上所有项目都可完成。

总结起来:通用套路 + 灵活运用

       对于初学者来说,只需掌握通用套路即可,灵活运用需要经过大量的练习才可达到,运用大学里学马克思哲学时的一句话概括,“量变引起质变”,当你达到这个程度之时,俨然成为集大成者了。

边缘检测通用思路:

  • 设置ROI感兴趣区域,此区域需包含待检测边缘;

  • 二值化处理,并打散连接区域,进一步选取目标区域;

  • 将目标区域进行膨胀处理;

  • 将目标区域进行腐蚀处理;

  • 将膨胀后的区域和腐蚀后的区域进行减操作,并进行抠图处理,目的为了得到有边缘的真实图像;

  • 使用边缘检测算子提取亚像素轮廓;

  • 根据得到的真实边缘,进步处理和计算所需的线、弧、圆等;

现学现用:检测圆

处理思路:1. 根据以上所讲套路,求得外边缘轮廓;

                  2. 根据所得轮廓,拟合圆;
1:检测外边缘轮廓

外边缘处理后,如下图所示,会提取一些干扰轮廓,第2部分–拟合圆,会对此进行处理。

附第一部分 halcon源代码

*读入图片 
read_image (Image, ‘cicle.bmp’)

*计算图片大小,并以原图尺寸显示 
get_image_size (Image, Width, Height) 
dev_close_window () 
dev_open_window_fit_size (0, 0, Width, Width, -1, -1, WindowHandle) 
dev_display (Image)

*01. 设置ROI感兴趣区域 
gen_rectangle1 (ROI, 50, 50, 550, 550) 
reduce_domain (Image, ROI, ImageReduced)

*02. 二值化处理,并打散连接区域,选取目标区域 
threshold (ImageReduced, Regions, 23, 255) 
connection (Regions, ConnectedRegions) 
select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 57706.4, 86146.8)

*03. 将目标区域进行膨胀处理 
dilation_circle (SelectedRegions, RegionDilation, 10)

*04. 将目标区域进行腐蚀处理 
erosion_circle (SelectedRegions, RegionErosion, 4) 
*填充孔洞 
fill_up (RegionErosion, RegionFillUp)

*05. 将膨胀后的区域和腐蚀后的区域进行减操作,并进行抠图处理,目的为了得到有边缘的真实图像 
difference (RegionDilation, RegionFillUp, RegionDifference) 
union1 (RegionDifference, RegionUnion) 
reduce_domain (ImageReduced, RegionUnion, ImageReduced1)

*06. 使用canny算子提取亚像素轮廓 
edges_sub_pix (ImageReduced1, Edges, ‘canny’, 1, 20, 40)

 

2:拟合圆

此时进行套路中的最后一步,根据得到的真实边缘,进步处理和计算所需的线、弧、圆等,在这一步我们常用分割函数 segment_contours_xld,联合相邻直线函数 union_collinear_contors_xld,选择轮廓函数select_contours_xld,联合相同圆函数 union_cocircular_contours_xld等函数,进一步对边缘轮廓处理,也可根据找到的轮廓边缘,得到点云数据,拟合成圆、直线、椭圆等;

处理后如下图所示。

附第二部分 halcon源代码

*07. 根据得到的真实边缘,进步处理和计算所需的线、弧、圆等 
segment_contours_xld (Edges, ContoursSplit, ‘lines_circles’, 5, 4, 2) 
select_contours_xld (ContoursSplit, SelectedContours, ‘contour_length’, 8, 1000, -0.5, 0.5) 
union_adjacent_contours_xld (SelectedContours, UnionContours3, 10, 1, ‘attr_keep’) 
fit_circle_contour_xld (UnionContours3, ‘algebraic’, -1, 0, 0, 3, 2, Row1, Column1, Radius1, StartPhi, EndPhi, PointOrder) 
gen_circle (Circle, Row1, Column1, Radius1)

*显示结果 
dev_set_line_width (2) 
dev_set_draw (‘margin’) 
dev_display (Image) 
dev_display (Circle)

原图及完整源代码见百度网盘:

链接:https://pan.baidu.com/s/1FLZGJ7abz7CoqoweuGv3uQ 密码:au2h
 

你可能感兴趣的:(halcon教程,边缘检测,轮廓提取,halcon教程,机器视觉)