基于HALCON的激光打标机读码

时间:2022-05-08 11:04:02

基于HALCON的激光打标机读码

摘要:激光加工在世界范围内得到了广泛的应用, 印刷电路板(PCB)行业亦如此,很多产品每一快PCB板上打上唯一的序列号以进行标记以便于在后续工序中对产品进行辨识,这种序列号往往为二维码或者条码。在激光加工具有高精度高效率的同时采用机器视觉对PCB板进行定位以及其打标内容的读取,使得这种方式具有极高的效率。

关键词:机器视觉 PCB 读码 激光

中图分类号:TP391 文献标识码:A 文章编号:1007-9416(2013)03-0085-02

随着整个社会电子化程度的不断加深,越来越高的需求也带来了PCB行业的飞速发展,对其生产率的要求也是越来越高,最具代表性的就是以表面贴片技术(SMT)为主导的PCB制造业[1]。如今整条SMT工艺生产线已经完全实现了自动化,在实现这种自动化的过程当中,需要对每一块PCB板进行一个唯一的标识,具有快速高效等优势的激光打标机能很好地满足这种需求以适应SMT行业的自动化。

1 典型激光打标机的基本结构

激光打标机结构如图1所示:7

整个设备软件基于Windows XP平台,采用Visual Studio2005作为开发工具,机器视觉使用HALCON9.0所提供的 C++库所提供的算子完成。硬件部分使用运动控制卡以及数字IO对电机以及气动元件进行控制,机器视觉部分的硬件主要是工业相机、图像采集卡、光源以及光源控制器等构成。工作流程简化为PCB板由传送带上料之后被固定住,再由XY工作台根据所输入的坐标将PCB板送到相应的点,由激光器打标,之后再由工业相机读取所打内容。

2 HALCON以及其与Visual C++(VC++)的混合开发环境

2.1 HALCON简介以及其特点

HALCON是德国MVtec公司开发的一套完善的标准的机器视觉算法包它灵活的架构便于机器视觉、医学图像和图像分析应用的快速开发。在欧洲以及日本的工业界已经是公认具有最佳效能的Machine Vision软件。HALCON有一千多个各自独立的函数,以及底层的数据管理核心构成。其中包括了各类滤波、色彩以及几何、数学转换、形态学计算分析、校正、分类辨识、形状搜寻等等基本的几何以及影像计算功能。应用涵盖医学、遥感探测、监控到工业上的各类自动化检测。HALCON支持Windows,Linux和Mac OS X操作系统。整个函数库可以用C,C++,C#,Visual Basic和Delphi等多种普通编程语言访问。具有很好的硬件兼容性。

2.2 HALCON与VC++混合开发软件的基本流程

HALCON和Visual C++的混合编程是将Visual Studio作为整个视觉系统应用程序开发环境,通过函数调用使用HALCON图像处理函数库实现视觉系统核心处理功能,从而完成读码工作。程序设计流程为:

(1)利用HDevelop环境检查分析图像,建立视觉读码计算模型,开发视觉读码核心算法代码,对程序功能进行验证;

(2)由HDevelop导出视觉测量程序代码,生成C++代码;

(3)配置HALCON和VC++混合编程开发环境;

(4)在VC++环境中通过程序语言的功能来开发整个读码程序以及界面的构建,完成程序功能的验证。

(5)编译、链接生成应用程序。

要在VC++中调用HALCON函数空,首先要在VC++中配置相应的交互编程环境:在project->settings的Link属性页中添加halconcpp.lib;在project->settings的C/C++属性页Preprocessor中添加目录$(HALCONROOT)\include,$(HALCONROOT)\include\cpp;在project->settings的Link属性页input下拉菜单中添加路径$(HALCONROOT)\lib\$[halconarch]。

3 软件开发

HALCON/C++接口提供了两种不同方式在C++中调用HALCON函数库:子程序调用法和面向对象调用法。子程序调用法就是在VC++环境下直接调用HALCON算子。面向对象调用法则是通过一系列类来调用HALCON算子。C++作为一种面向对象的语言,在使用是通常倾向于使用面向对象的方式来调用,因此必须对HALCON库中的算子进行封装。

在该读码系统中,图像采集与现实主要在工业摄像机提供的二次开发函数库的基础上,采用VC++进行测量图像采集与显示功能的开发,实现工业相机参数控制、测量图像采集与显示等功能。而读码主要是通过采集到的图像进行读取,主要包括感兴趣区域ROI(Region of Interest)和读码函数两个功能模块[2]。

3.1 HALCON C++库所提供的读码相关算子

利用读取二维码的算子所写程序如下:

create_data_code_2d_model(‘QR Code’,[],[],DataCodeHandle);

set_data_code_2d_param(DataCodeHandle,’default_parameters’,‘enhanced_recognition’);

find_data_code_2d(Image,SymbolXLDs,DataCodeHandle,[],[],ResultHandles,DecodedDataStrings);

所用到的在HALCON中为类型HObject的图像文件即通过相机所提供的API函数所提供。

在该激光打标机中,由激光机打完条码就立刻用工业相机读取所打的二维码值,PCB板由打标机上的夹具固定之后送到所要求的特定点进行打标,而每次打标点在相机视野中的像素坐标是固定的,因而在去读二维码时不用在整个相机视野中对二维码进行查找,只需在打标点在相机视野附近的一个区域内进行读码,这样做可以在很大程度上提升读码速度并且防止误读。因而在读码前应在传入的HObject类型的图像数据截取以打标点在相机视野中像素点为中心,适当大于所打条码所占范围区域读码,即获取所需要的ROI,利用算子gen_rectang2、reduce_domain可实现该功能。即在所传入的HObject类型图像文件中截取所需要的区域[3][4]。

3.2 面向对象的开发方式

首先要将HALCON的C++库中所提供的算子封装成类,创建一个名为CUserHalcon的类,

class CUserHalcon{

public:

CUserHalcon();

~CUserHalcon();

BOOL Read2DCode_(const HObject Image,char* DecodeDataString);

private:

inline BOOL CheckHalconValue(int errcode) {return errcode==H_MSG_TRUE;}

//通过HALCON算子的返回值判断视觉系统运行是否正常

int m_halcon_errcode;

};

BOOL CUserHalcon::Read2DCode(const HObject Image,char* DecodeDataString)

{

HLong DataCodeHandle,ResultHandle;HObject SymbolXLDs,Rectangle,ImageReduced;

HTuple row,column,phi,length1,length2;

m_halcon_errcode=gen_rectangle2(&Rectangle,row,column,phi,length1,length2);

//生成所要读码的举行区域

m_halcon_errcode=reduce_domain(Image,Rectangle,&ImageReduced);

//将相机传入图片对象对应的举行区域截出用以读码

m_halcon_errcode=create_data_code_2d_model(‘QRCode’,[],[],DataCodeHandle);

m_halcon_errcode=set_data_code_2d_param(DataCodeHandle,’default_parameters’,‘enhanced_recognition’);

m_halcon_errcode=find_data_code_2d(ImageReduced,SymbolXLDs,DataCodeHandle,[],[],ResultHandles,DecodedDataStrings);

return CheckHalconValue(m_halcon_errcode);

}

开发基于MFC的应用的时候,只需添加一个CUserHalcon类的全局对象halcon即可调用其成员函数,实现读码功能。如果需要用到HALCON C++库中其他算子的功能,如读一维码,则可把相应的算子封装在在CUserHalcon类中,以public成员函数的形式提供出来。与直接调用HALCON算子相比,减少了大量繁琐的参输入,提高了代码的复用率,通过不断将其他功能的算子封装进该类,也能方便地用在其他程序上,这能极大地提高软件开发的效率,体现出了C++作为面向对象语言的优势[5]。

读取条码只是该设备的功能之一,最终完成的界面读码状态以及显示部分如图2所示,读码的在读码的同事用GDI函数对读码位置以及范围在软件运行时进行了动态的标示,能更加直观地查看设备的读码状态。

4 结语

采用机器是觉得方法,设计开发的读码系统由硬件和软件两部分组成,激光打标机在对PCB板打标之前需利用工业相机捕捉PCB板上的MARK点以进行定位以及校准,实现该功能即可将学习MARK点模板,寻找MARK点模板的相关函数封装进CUserHalcon类中,便于使用。采用这种方案通过机器视觉来定位以及读取条码,尽可能大的发挥了相机的作用。将打标和读码无缝结合起来。

参考文献

[1]周德俭.SMT组装质量检测中的AOI技术与系统[J].电子工业专用设备,2002(6):87-91.

[2]宿鸣明.电路板元器件的检测与识别[D].大连:大连理工大学,2005.

[3]MVTec Software GmbH. HALCON 9.0 Quick Guide[M].MVTec Software GmbH,2010.

[4]MVTec Software GmbH. HALCON/C++ Reference Manual[M]. MVTec Software GmbH,2010.

[5]杨少荣,吴迪靖,段德山 译.Carstem Steger, Markus Ulrich, Christian Wiedemanm.机器视觉算法与应用[M].北京:清华大学出版社,2008.

上一篇:简评《寂静的春天》 下一篇:探班《大清宝典》:别墅里的剧组