如图:以上为Halcon焊点检测例子所用图片【例程—>方法—>Blob分析—>ball.hdev】
按照上图操作可找到halcon焊点检测例程
①:识别焊点的个数
②:计算焊点的重心坐标,以及焊点面积
③:判断是否炸焊、少焊、漏焊
①:读取图片,若图片为彩色,则需要先灰度化图片
*读取图片(图片变量,'图片路径')
read_image (Image, 'D:\\image\\5.png')
*灰度化图片(原始图片,灰度化后的图片变量),因该图本就是灰度图片,故无需转灰度化操作
*rgb1_to_gray (Image, GrayImage)
②:进行灰度特征选择,一般是先过滤掉部分区域,但本例是在这过滤的部分区域当中,计算外矩形,而后在这矩形当中再次通过灰度特征选出焊点区域(因图片顶部的灰度与焊点灰度相近)
*二值化(图片,滤区域,灰色滤低值,灰色滤高值),得到128-255的灰度区域【白色255,黑色0】
threshold (Image, Region, 80, 255)
如上:红色区域为得到的二值化区域(注:虽然红色区域有断开,但所有的红色区域为一整个区域)
*预处理(导入的区域,导出处理后的区域,‘带方向矩形’),计算二值化得到灰度区域的外接矩形,目的是为了在此区域当中去选择焊点区域
shape_trans (Region, RegionTrans, 'rectangle2')
上图为预处理后的区域,目的是为了在此区域选择焊点区域,避免顶部灰度值相近的区域干扰
*抠图(原图,原图想要保留的区域,保留后的图片),做一个减域计算,减去顶部黑色部分
reduce_domain (Image, RegionTrans, ImageReduced)
*在处理后的图片做灰度特征选择,将灰度处于12-50的区域筛选出来
threshold (ImageReduced, Regions, 12, 50)
上图所有的红色部分为Regions,得到该区域后,通过圆度开运算保留圆度区域(也可以用腐蚀)
*圆形开运算(导入开运算区域,导出开运算后的区域,圆直径)
opening_circle (Regions, RegionOpening, 14)
*切割区域(需要切割的区域,切割后的区域集合),得到的区域是一个整体区域,需要切成若干个区域
connection (RegionOpening, ConnectedRegions)
*计算当前区域集合的个数
count_obj (ConnectedRegions, Number)
上图为是圆形开运算后切割区域得到的区域集合ConnectedRegions ,每种颜色代表着一个区域(如果按照操作后只有一个颜色,可点击菜单栏 可视化—>彩色数量—>12)
*特征选择(导入的区域,得到后的区域,‘根据的特征’,'','',‘')
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 461.29, 1551.61)
*显示焊点检测的原图
dev_display (Image)
*显示所有的焊点
dev_display (SelectedRegions)
*计算所有区域焊点的最小外接圆
smallest_circle (SelectedRegions, Row, Column, Radius)
*算出有多少个数
NumBalls := |Radius|
*直径
Diameter := 2 * Radius
*平均直径
meadDiameter := mean(Diameter)
*最小直径
minDiameter := min(Diameter)
*显示各个圆的直径
disp_message (WindowHandle, 'D:' + Diameter$'.4', 'image', Row - 2 * Radius, Column, 'white', 'false')
*关闭当前图形窗体
在动手之前,可先观察一下图片所要识别的区域有何特征,是否跟其他区域有相似地方。然后通过一系列的操作,将相似的地方加大差异化,过滤相似地方后通过特征等选择从而拿到想要检测的区域
dev_close_window ()
dev_open_window (0, 0, 700, 512, 'black', WindowHandle)
*读取图片(图片变量,'图片路径')
read_image (Image, 'D:\\image\\5.png')
*灰度化图片(原始图片,灰度化后的图片变量),因该图本就是灰度图片,故无需转灰度化操作
*rgb1_to_gray (Image, GrayImage)
*二值化,得到128-255的灰度区域【白色255,黑色0】
threshold (Image, Region, 80, 255)
*预处理,计算二值化得到灰度区域的外接矩形,目的是为了在此区域当中去选择焊点区域
shape_trans (Region, RegionTrans, 'rectangle2')
dev_display (RegionTrans)
*抠图,做一个减域计算,减去顶部黑色部分
reduce_domain (Image, RegionTrans, ImageReduced)
*灰度特征选择,将灰度处于12-50的区域筛选出来
threshold (ImageReduced, Regions, 12, 50)
*开运算,留下直径为14的圆
opening_circle (Regions, RegionOpening, 14)
*切割区域,得到的区域是一个整体区域,需要切成若干个区域
connection (RegionOpening, ConnectedRegions)
*计算当前的区域个数
count_obj (ConnectedRegions, Number)
*特征选择
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 461.29, 1551.61)
*显示焊点检测的原图
dev_display (Image)
*显示所有的焊点
dev_display (SelectedRegions)
*计算所有区域焊点的最小外接圆
smallest_circle (SelectedRegions, Row, Column, Radius)
*算出有多少个数
NumBalls := |Radius|
*直径
Diameter := 2 * Radius
*平均直径
meadDiameter := mean(Diameter)
*最小直径
minDiameter := min(Diameter)
*显示各个圆的直径
disp_message (WindowHandle, 'D:' + Diameter$'.4', 'image', Row - 2 * Radius, Column, 'white', 'false')
*关闭当前图形窗体
dev_close_window ()
by:在下初入江湖,理解不到位的地方欢迎各位大佬留言,私信给予斧正,感谢!