引言
机器视觉,是指:“通过光学的装置和非接触的传感器自动地接收和处理一个真实物体的图像,以获得所需信息或用于控制机器人运动的装置。”[1] 在计算机技术和自动化控制技术迅速发展的今天,机器视觉技术日趋成熟,机器视觉产业作为新兴产业,在医疗、工业控制、卫星通信等领域有着广阔的应用前景。
目前工业用机器视觉产品主要根据工业照相机是否具有图像处理功能而分为两大类,一类称为PC -Based(即由计算机中的软件进行图像处理工作),另一类称为Smart –Camera(即照相机中集成了图像处理芯片,可进行图象处理工作)。
关于PC –Based产品,典型产品有诸如德国NeuroCheck公司 的NeuroCheck软件,比利时Eurosys公司的eVision软件,以及美国Cognex公司的 InSight 软件等等。
以上各种图像处理软件都有各自的特点及优缺点,而利用软件本身提供的插件编程接口,对其功能进行补充和完善,则可以使该软件的功能得以更好地发挥。
一、NeuroCheck的主要功能及特点
NeuroCheck具有独立的操作界面,使用时不需要依附任何其它的软件,其风格简单,容易上手。其界面风格可见于下图:

图1.1 NeuroCheck 的界面
它的主要功能有:
条形码鉴别
矩形码鉴别
存在性检验
特征量测量
定位
字符与模式识别
打印制量检查
色彩处理
等等,涉及机器视觉工业应用的各个主要领域:
其特点就是已经将每个功能模块做成独立的函数,操作者只要在所应用的“检测程序”(Check Routine)里将其一一调用,并设置合适的参数即可。

图1.2 NeuroCheck 的使用方法
在工业应用中,一般需将目标元件固定在某位置,然后调节好工业相机的参数以使所得图像良好;其次需要将所得图像传给NeuroCheck以进行分析,分析过程即是如上所说的在“检测程序”里的函数模块调用以及参数设置的过程;再次就是在NeuroCheck的自动模式中进行输出量显示配置,以使其满足检测需要;最后就是在自动模式中运行已设置好的该“检测程序”,进行实时检测并同时得到检测结果。
二、eVision的主要功能及特点
eVision本身不提供独立的操作界面,其操作者需要使用VB或者C++两种编程语言作为载体,根据工程需要编制合适的操作界面,并同时调用eVision提供的库函数以进行检测。为给操作者提供方便,eVision提供了一套辅助工具 EasyAccess,用于对编程进行指导,告知编程者如何调用其库函数。
当操作者使用EasyAccess并选择相应功能时,EasyAccess会自动添加一些代码,这些代码即是编程者在VB或者C++中调用eVision库函数时所需的代码。
除此之外,为了更好的指导编程者使用,eVision还提供了一些已经用VB和VC++编好的实例,每个实例都对应一个主要的应用。
其主要应用功能有:
条形码鉴别
矩形码鉴别
存在性检验
特征量测量
字符与模式识别
色彩处理
图像比较
斑点检测
等等,也是涉及了机器视觉工业应用的各个主要领域。
三、NeuroCheck的插件接口
NeuroCheck各应用模块的良好封装性,为使用者,尤其是初学者带来了很大的便利;但是同时,由于开发时的局限性,这样的封装性也给一些特殊应用带来了不便。为解决这一问题,NeuroCheck的开发者们特意提供了一套接口,以便使用者针对其特殊需求编写一些可以在NeuroCheck中使用的插件。编写这些插件的比较合适的编程语言是C或者C++。[2]
以VC++开发环境为例,当编程者编写好代码后,需要将其生成为动态链接库(DLL)文件,然后由NeuroCheck将这些文件加入到其插件库中。完成这些之后,NeuroCheck和插件动态链接库之间将通过获取版本号、获取函数数目、获取函数说明、获取数据类型、获取数据描述这5个固有函数进行通信。
每一个插件可以包含若干个插件函数(Plug-In Function),这些插件函数在使用时就和NeuroCheck自带的函数一样。
每一个插件函数又包含有相当数目的子函数,其中主要的有初始化(Init)、逆初始化(Deinit)、执行(Exec)、对话框(Dialog)等几个。在这些子函数中,则是使用者可以根据相应算法大量编写代码的地方,例如:
1. 在VC++环境下,编程者可以在资源编辑器中编辑合适的操作界面,即对话框,然后可以在对话框子函数中加入相应代码,以使参数得以传递。
2. 如果需要在程序开始时传递默认参数,可以在初始化子函数中添加相应代码。同时,初始化和逆初始化为一对必不可少的子函数,保证内存的分配与取消,以使NeuroCheck程序不会和系统或其他程序发生冲突。
3. 在执行子函数中,则包含了主要的算法。以本文的条形码阅读为例,则是包含了对各种以及特定某种条形码解码的算法,具体可参见下一章。
四、eVision的函数调用
不论是eVision还是NeuroCheck,当使用它们进行图像处理操作时,一般首先都需要设定待处理区域,即通常所说的Region Of Interest (或者Area Of Interest)。但是eVision有一个特点,它的条形码解码算法功能比较强大,大多数情况下可以自动锁定它的解码区域,所以使用它的解码函数时,只需要将整个图像作为输入参数传递。而使用NeuroCheck进行条形码解码,必须同时传递输入图像,以及手动设定的解码区域。所以在NeuroCheck中使用eVision的函数进行条形码解码时,必须把传递给NeuroCheck的解码区域参数转化为新的图像传递给eVision的函数。这样就需要读取该区域的位置参数,以及该区域内的图像灰度值, 然后依靠这些灰度值重新组成一幅新图像。
当输入参数完成后,即可调用eVision的函数库进行条形码阅读,eVision为此提供了一个叫做EBarcode的类。这个类主要有5种方法:第一种方法设定解码区域的几何参数;第二种方法设定解码方式;第三种方法设定解码参数,例如读码方向等;第四种方法设定待解码类型,常用条形码共有9种,非常用条形码还有22种[3],这里待解码类型可以设定为其中任何一种,也可以设定为其总和;最后一种方法即为解码,但是根据待解码类型为单一某种或总和,解码方法也分为两种。
解码时,在大多数情况下,不需要使用EBarcode类的前三种方法,意即其相关参数选择为默认值。然后选择待解码类型,并选择相应的解码方法即可。实际编码时,需要在对话框子函数中将待解码类型作为参数传递,然后在执行子函数中加入选择性语句,使其能根据传入的待解码参数为单一码种或总和而自动选择相应的解码方法。
解码完成后,需要将结果存储在NeuroCheck指定的一个字符数组中,然后可以由NeuroCheck内部的函数将其调用并显示,同时也可以将其作为输出参数传递,用于PLC的控制信号。
五、总结
如前所述,各种工业用机器视觉软件都有各自的优缺点。NeuroCheck的使用简单,但是其在条形码阅读时,不仅不能解码128码,而且还必须指定待解码类型,甚至还需指定解码之后的字符数目,所以当某些特殊情况需要解码不明条形码时,使用NeuroCheck就极其不不方便。而使用eVision虽然同时必须使用其它编程软件,但是其函数库功能相对比较强大,尤其是在条形码阅读方面。不过,在此方面eVision也有它的一些缺点。比如有些条形码可以同时被不同的条形码类型解码,得到不同的答案。此时使用eVision的总和解码方法,固然有其方便的优点,但是也有只能输出一种结果的缺点。如果需要输入所有可能性结果,然后做相似性比较的话,必须设定一个循环语句,然后在此循环内对所有可能的码种作单一解码,并输出所有解码成功的结果。
在熟练应用各种相关软件的基础上,了解其优缺点,各取其长而避其短,综合成最合适于工程需要的处理方法,其意思是相当重大的。不仅可以解决一些凭单一软件难以解决的问题,同时也因为可以避免重复购买软件而节约成本,此外对开发具有自主知识产权的同类软件业有很大的帮助。
文献 [1] Robotic Industries Association. [2] NeuroCheck. Programmer’s Reference.2006 [3] eVision .C++ Reference Manual.2004
|