Halcon,大名鼎鼎,如雷贯耳,机器视觉领域无人不知,无人不晓,但很多初学的同学被一大堆SDK(算子)看的蒙头转向,丧失信心,在这里,我谈谈halcon的学习方法和心得。
此所谓halcon开始学习、学习的过程、学习的结果。 学halcon的三个过程,开始学习的时候,你要有目标,哪怕你现在是学生还是转行来学习halcon的人,心中要有一个目标,不能做一条“闲鱼”就满足了。学习halcon过程中,不抛弃不放弃,衣带渐宽终不悔为伊消得人憔悴。当你坚持学习下来,经过不断努力学习,成长起来,却无意间看到那人正在灯火阑珊处,胜利俨然已经归来。 我们去了解机器视觉发展历史就知道,机器视觉是产业驱动发展的, 我们学习halcon也是通过机器视觉应用场景驱动的,机器视觉应用主要分为四大类:定位、识别、测量、检测,学习halcon我们主要围绕着着四类问题进行展开,每个应用通过几个项目总结和归纳,我觉得就已经入门了,真正要成为资深视觉工程师,还需要项目经验、工程实践经验来进行深入。
机器视觉应用场景分类,视觉定位,视觉定位应用主要是找到物体的位置,那么怎么找?在这里一个重要的步骤就是标定,标定是把相机的像素坐标系转换为机械上的物理坐标系,使得图像中的识别的像素值转换为机械坐标值后发送给机械运动,找到目标位置。
坐标变换过程 在标定过程中,使用halcon,不需要你自己解矩阵,一个算子搞定 vector_to_hom_mat2d( : : Px, Py, Qx, Qy : HomMat2D) 输入像素坐标点Px,Py,输入机械坐标点Qx,Qy生成一个仿射变换矩阵,比如我用模板匹配查找到了一个像素点(X,Y),那么通过affine_trans_point_2d( : : HomMat2D, Px, Py : Qx, Qy)就可以计算出机械坐标,入门,你知道这些就够了,至于深入的应用,比如不共轴情况那就是后面入门之后的事情。
计算坐标 那么,上面说的定位标定是一个纯数学问题,那么现在我们怎么找到特征点?怎么做定位?在这里就要用halcon的图像处理算子了,常用的定位方法有模板匹配、blob定位、圆查找、线查找, 模板匹配是亚像素精度(sub-pixel),定位中大多数场合会使用,模板匹配2个核心算子,也是最常用的,至于其他的可变性、基于点、基于灰度、基于描述符、局部可变性、可变性的基本在实际应用中应用的很少,基于此,你只需要知道在哪里找到halcon的这些模块例程,用到了去学习即可。查找方法 在Hdevelop中 快捷键 Ctrl+E->方法 中查找,
常用图像定位方法,
查找例程
模板匹配,当然,在进行模板匹配之前,可能会用到很多图像预处理,比如进行图像滤波mean_image、gauss_filter、smooth_image、binominal_filter等滤波算子,还会进行ROI(region of interest)设置图像感兴趣区域,所用到的halcon算子是draw_开头的一些列算子,在HDevelop中,按F1帮助按钮,搜索draw_可以看到画圆、画椭圆、或线、画点、画多边形等都有,其中*_mod代表在原有的图像基础上修饰图形,这样这一些系列算子你又记住了,是不是很简单,
交互画ROI,
直接创建和通过轮廓创建模板 直接通过create_shape_model创建模板会有很多不需要的轮廓,我们通过xld来进行创建,通过edges_sub_pixel获取亚像素轮廓,然后通过select_shape_xld的长度特征删选掉一些不必要的轮廓,大家可以看到,基本上每一个算子的含义都可以通过算子的组合理解到,何况halcon中有智能提示、VS中也有智能提示,只需要打出一个单词你就可以选择了。
blob定位,使用blob定位就是精度不高的情况或者用来做粗定位了,在halcon中,搜索threshold可以出现一系列二值化操作的接口(如果大家用的多了,在OpenCV或则其他算法库都一样),可以得到一系列二值化操作,常用的有threshold、auto_threshold、binary_threshold、dyn_threshold、var_threshold,其他的阈值很少用。
Threshold判断出产品是否OK,找线、找圆,在这里有一个重要的算子gen_measure_rectangle2,这个算子是准备一个测量对象,然后通过mesure_pos/measure_pair进行测量边界点,最后通过fit_circle_contour_xld和fit_line_contour_xld进行拟合出圆和直线。
拟合直线和拟合圆 总结一下,定位类项目,一个关键是标定,另一个关键就是定位算法,大多数情况下定位都是通过找模板来定位。
视觉测量,视觉测量项目类应用主要是应用在有2个步骤,第一步粗定位,第二部测量。定位阶段使用模板匹配create_shape_model、find_shape_mode来解决,然后使用vector_angle_to_rigid生成一个仿射变换矩阵,使用这个矩阵矫正图像affine_trans_image,使用之后使用gen_measure_rectangle2生成测量对象,通过mesure_pos/measure_pair进行测量边界点,最后通过fit_circle_contour_xld和fit_line_contour_xld进行拟合出圆和直线,最后利用halcon中的 distance_算子来计算点点测量、点线测量等。 这类应用比较简单,应用也比较广泛。
找点拟合圆,识别项目,识别项目,识别什么?通常在机器视觉领域,识别主要是进行OCR、一维码、二维码的识别。
OCR,在halcon传统识别中,要识别OCR,就要先分割出字符,分割字符最常用的就是阈值分割,也就是带threshold的系列算子组合,再通过滤波算子组合、形态学算子处理区域,把字符完全分割出来识别,
分割字符步骤 分割出来后就可以使用halcon 的create_ocr_class_mlp/svm/knn/box创建分类器,再就调用trainf_ocr_class_mlp训练字符,通过write_ocr_class_mlp写入字符句柄到文件中,clear_ocr_class_mlp清理create_ocr_class_*创建的句柄对象,以免句柄内存泄漏。 在识别字符的时候通过read_ocr_class_mlp读取字符模型再通过do_ocr_single_class_mlp读取字符即可。大家看到这个过程是 create->trainf->write; read->do_ocr,在大多数halcon应用中都是这个模式,创建->训练->写入文件, 读取文件->识别, 这些都是经验套路。 当然halcon中OCR字符识别模块已经有预训练好的字符,这些事常用的,但在很多实际项目情况中是需要自己训练的。
halcon默认训练的字符库,一维码,一维码识别中,create_bar_code_model创建一维码模型,通过set_bar_code_param设置一维码参数,通过find_bar_code查找一维码内容,最后clear_bar_code清空数据模型。在一维码应用中,我们没有做图像预处理的工作,halcon通过set_bar_code_param设置一些参数,就可以解码出一维码了,halcon强大的图像处理能力。
二维码,二维码识别中,create_data_code_2d_model创建二维码模型,通过set_data_code_2d_param设置二维码参数,再通过find_data_code_2d查找二维码的内容,最后clear_data_code_2d_model清空数据模型,同样,在这里没有做图像预处理工偶,halcon通过set_data_code_2d_param参数,强大的算法就可以解码了。 总结一点,识别类应用主要是在软件层的设计,软件层需要设计出交互好用的软件,以及读取数据后对一维码、二维码数据的处理,以及跟第三方平台对接,所以这才是实际项目中不确定的。
视觉检测,在这里视觉检测是一个综合应用算子的场景,你可能会使用blob来进行检测,也可能使用模板匹配来进行检测,也可能用FFT,以及颜色识别,视觉检测的情况非常多,这也是实际项目中最多的非标项目,在这里使用的最多的就是blob算法,产品有无、产品脏污、产品破损、产品裂纹等都可以通过blob特征来区分,用到的算子还是上面提到的, 不过视觉检测很依耐图像成像,比如现实项目中的布匹、瓷砖等检测图像成像是主要问题,还有就是线扫相机的扫描速度!
视觉检测常用的算法处理 至于FFT傅里叶变换,是把空间信息转化为频域信息,使用的算法很少 ,rft_generic->convol_fft->rft_generic,最后通过blob来进行处理,再加上形态学。
FFT 上面是一个大的分类,至于大家经常听到的标定,在这里有很多种类型标定,视觉定位中的标定上面已经说了,vector_to_hom_mat2d/affine_trans_point_2d。还有尺度标定,尺度标定就是一个像素转物理单位的过程,在测量项目中会用用到,经常性的使用一个标定块计算出单像素大小即可。畸变标定,这是图像校正,当我们使用焦距比较短比如8mm的镜头时,畸变比较大,在HDevelop->助手->打开Calibration进行标定即可,使用halcon标定助手外加一块标定板解决。
标定 当然这四大类不是独立运行的, 很多项目同时存在定位、缺陷、测量、识别的情况,这就要考验工程师的应用能力了,要熟练的使用起来,这些基本的几大类知识点要明白的。