文章目录
一、所需软件环境
1、资源分享
(1)Halcon软件
Halcon的安装包可以看百度网盘链接:链接:https://pan.baidu.com/s/1bqi7XebbIB_SeqoyKNXqbA
提取码:3opf
每个月初都需要更新licence,licence可以参考这位博主的博文【这位博主是位大好人,要向他学习】:
https://blog.csdn.net/qq_18620653/article/details/120033443?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170079289416800192261338%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=170079289416800192261338&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-5-120033443-null-null.142v96pc_search_result_base1&utm_term=halcon%20licence&spm=1018.2226.3001.4187
这个是安装好之后的效果。
(2)原图和代码分享
资源链接:https://pan.baidu.com/s/1u63SRK-hQlUWejbgLyvzIw
提取码:403v
有问题可以随时沟通
二、缺陷细分
1、原图
这个就是我们这篇文章中想要处理的图片,我们的目的是取提取中间黑色圆形边缘的缺口和毛刺部分。
2、毛刺
中间圆形是空的,外围是金属区域,而如下图所示就是突出毛刺的展示图片。
3、缺口
毛刺就是凸出来的,那么反之,凹进去的自然就是缺口,如下图所示是缺口的展示图片:
三、Halcon检测
1、思路引导
检测的流程其实非常简单,先得到一个阈值分割中心黑色圆的结果,然后拟合一个标准圆。用标准圆与黑色圆作差,就可以得到毛刺或者缺口了。
逻辑是这样的:
毛刺=拟合圆-黑色圆
缺口=黑色圆-拟合圆
这样的计算结果虽然不算严谨,但作为一个初方案还是可以的。
理清楚逻辑,我们就要思考,拟合圆该怎么得到了。直接用黑色圆进行gen_circle
吗,那如果黑色圆阈值分割不太好呢?那么标准圆就变得不太标准了。
所以我采用精定位的方法,精定位一般用在尺寸测量上,需要建立模板,再添加模板。
当然在编写算法之前,要先理清楚顺序。
2 、第一步:导入参数
每个公司应该都会有自己封装好的联系算子和参数,这些算子的作用主要是用来与后续的函数联系。
这家公司所用到的算子都是自己封装的,全部以fs
开头的,有些还是与自己公司所用到的软件进行联系的,我就不多说了。
简单列出我所导入的参数:
这里我就简单地说一下就行,因为这些函数都需要导入三级算子,就算给你们也用不了。
3、main函数中的内容
*需要仿真的图片路径
Path:='E:/工作------------------------------------working/11-09日工作内容/注液孔'
Path:='Z:/工作working————————工作/11-12日工作内容/的撒的撒多撒多撒/注液孔'
Path:='Z:/工作working————————工作/11-12日工作内容/的撒的撒多撒多撒/nn'
Path:='Z:/工作working————————工作/注液孔模型全部最新/注液孔缺陷测试1'
* Path:='E:/工作------------------------------------working/11-09日工作内容/demo'
* Path:='C:/Users/haopengli/Desktop/demo'
list_files (Path, ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
***针对模板图像或者数据的预处理,预处理exec_preprocess在加载模板时执行,得到中间变量可以传递到exec_inspect检测函数中执行
*Halcon与FSWing进行对接的标准函数,每个算法都需要提供这样定义的函数,FSWing自动构建该函数的调用
*preProcessHandleList是Halcon自有句柄的集合,用于在exec_inspect中使用,不允许删除
preProcessHandleList:=[]
CDataHandle:=[]
*预处理函数接口
exec_preprocess (CDataHandle, FSDataHandle, preProcessHandleList)
fs_datahandle_setsimulatestatus (FSDataHandle, 1)
gen_empty_obj (DefectRegions)
for Index := 0 to |ImageFiles| - 1 by 1
read_image (SrcImage, ImageFiles[Index])
* 缺陷图显示设置
dev_close_window ()
get_image_size (SrcImage, WidthI, HeightI)
Width:=500
Height:=Width*HeightI/WidthI
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_set_draw ('margin')
dev_display (SrcImage)
**************
***针对每一张图像的检测
*Halcon与FSWing进行对接的标准函数,
*每个手机算法都需要提供这样定义的函数,
*FSWing自动构建该函数的调用
exec_inspect (SrcImage, DefectRegions, CDataHandle, FSDataHandle)
*********************************************
* 以下函数可能有问题,可以自行删除
* *********************************************
dev_display (DefectRegions)
disp_message (WindowHandle, ImageFiles[Index], 'window', 12, 12, 'black', 'true')
count_obj (DefectRegions, Number)
if(Number > 0)
area_center(DefectRegions, Area, Row, Column)
dev_display (DefectRegions)
for Index1 := 1 to Number by 1
gen_circle(Circle, Row[Index1-1], Column[Index1-1]