机器视觉软件的插件开发——NeuroCheck的边缘检测插件的设计

2017-01-20 22:07:50·
 
图1 NeuroCheck 的界面 在计算机技术和自动化控制技术迅速发展的今天,机器视觉技术日趋成熟,其产品能...

机器视觉软件的插件开发——NeuroCheck的边缘检测插件的设计-汽车制造网

图1 NeuroCheck 的界面
在计算机技术和自动化控制技术迅速发展的今天,机器视觉技术日趋成熟,其产品能够准确、快速地探测零件表面特征,在工业控制、汽车制造等领域有着广阔的应用前景。
机器视觉,根据美国机器人工业协会(Robotic Industries Association)的定义是指:“通过光学的装置和非接触的传感器自动地接收和处理一个真实物体的图像,以获得所需信息或用于控制机器人运动的装置。”
目前工业用机器视觉产品主要根据工业照相机是否具有图像处理功能而分为两大类,一类称为PC –based,由计算机中的软件进行图像处理工作;另一类称为Smart –Camera,即照相机中直接集成了图像处理芯片。
德国NeuroCheck公司 的NeuroCheck软件是一种PC –based产品,它被德国各大汽车制造商以及汽车零部件生产商广泛应用于产品的质量检测环节。该软件有着显著的特点及优点,但也有一些缺憾,而为它设计插件,对其功能进行补充和完善,则可以使它的功能得以更好地发挥。

机器视觉软件的插件开发——NeuroCheck的边缘检测插件的设计-汽车制造网

图2 NeuroCheck 的使用方法

NeuroCheck的主要功能及特点
NeuroCheck具有独立的操作界面,使用时不需要依附任何其它的软件,其风格简单,容易上手。其界面风格可见于图1:
它的主要功能有条形码鉴别、矩形码鉴别、存在性检验、特征量测量、定位、字符与模式识别、打印制量检查以及色彩处理等,涉及机器视觉工业应用的各个主要领域。其特点就是将每个功能模块做成独立的函数,操作者只要在所应用的“检测程序”(Check Routine)里将其一一调用,并设置合适的参数即可(如图2)。
事物总是有两面性的,NeuroCheck的使用简单是由于其设计者为使用者考虑了很多实际问题,并且封装了大量的函数,使使用者根本感觉不到他是在进行专业的图像处理工作,而只是如同在使用很简单的应用软件;但是正由于此,在一些高层次的或者有特殊需要的应用方面,NeuroCheck并不能满足使用者的要求,而且正由于软件的设计者们考虑了很多使用性的问题,这必然分散了他们对于图像处理本身的注意力,因此NeuroCheck有些关于图像处理的函数其处理结果并不能尽如人意。

机器视觉软件的插件开发——NeuroCheck的边缘检测插件的设计-汽车制造网

图3 NeuroCheck返回结果精度的各向异性
为了解决这一问题,NeuroCheck公司特意为其软件开发了一套插件接口,使得使用者可以根据其特殊需要自行根据图像处理领域的理论和算法进行代码编写,并且这些代码可以通过该接口被封装成适合在NeuroCheck中被调用的函数,这些函数即是插件函数,它们在被使用的时候就如同NeuroCheck的内嵌函数一样。

NeuroCheck的插件接口
编写这些插件比较合适的编程语言是C或者C++。以VC++开发环境为例,当编程者编写好代码后,需要将其生成为动态链接库(DLL)文件,然后由NeuroCheck将这些文件加入到其插件库中。完成这些之后,NeuroCheck和插件动态链接库之间将通过获取版本号、获取函数数目、获取函数说明、获取数据类型、获取数据描述这5个固有函数进行通信。
每一个插件可以包含若干个插件函数(Plug-In Function)。每一个插件函数又包含有相当数目的子函数,其中主要的有初始化(Init)、逆初始化(Deinit)、执行(Exec)、对话框(Dialog)、显示(View)等几个。在这些子函数中,则是使用者可以根据相应算法大量编写代码的地方,例如:
1、在VC++环境下,编程者可以在资源编辑器中编辑合适的操作界面,即对话框,然后可以在对话框子函数中加入相应代码,以使参数得以传递。
2、如果需要在程序开始时传递默认参数,可以在初始化子函数中添加相应代码。同时,初始化和逆初始化为一对必不可少的子函数,保证内存的分配与取消,以使NeuroCheck程序不会和系统或其他程序发生冲突。

机器视觉软件的插件开发——NeuroCheck的边缘检测插件的设计-汽车制造网

图4 线形ROI上的像素
3、在执行子函数中,则包含了主要的算法,编程者可以在其中编写任何有关图像预处理和图像理解的代码。
4、在显示子函数中,如果NeuroCheck本身显示的结果不满足编程者的要求(因为其显示结果的模块毕竟有限),读者可以根据自身需求调用其它VC++函数来使自己程序的结果可视化。

关于边缘检测的插件设计

在使用机器视觉软件进行图像处理操作时,一般首先都需要设定待处理区域,即通常所说的Region Of Interest (或者Area Of Interest)。根据应用目的,ROI分为区域和线形两种。在边缘检测中,因为常常需要指定物体延某个方向的边缘,所以常常使用线形ROI。

NeuroCheck在进行边缘检测操作时,计算精度一般只有整像素精度,即使选择其内嵌的亚像素精度检测函数,计算精度仍然不高。而且因为它的算法不具备各向同性,还产生了一个很奇怪的现象:即如果线形ROI与水平线夹角在0°~45°之间,那么NeuroCheck返回的结果在水平方向为亚像素精度而竖直方向为整像素精度;如果线形ROI与竖直线夹角在0°~45°之间,则结果的精度的方向性正好相反;只有在线形ROI的角度与各象限的角平分线十分接近时,返回的结果才同时具有两个方向上的亚像素精度(见图3)。

在以往的关于边缘检测的算法设计中,一般的思想是使用一个二维算子对图像的灰度值矩阵进行相关运算,利用图像灰度值的梯度提取图像边缘(边缘所在位置梯度值较大),这些算子其实就是矩阵,它们一般是具有方向性的,而且由于矩阵的局限性,这些方向通常也就是水平、竖直和45°角几种;有一种算子即LoG(Laplacian of Gaussian)算子是具有各向同性的,它利用的是图像灰度值的二阶差分。但是如果在亚像素精度要求下使用LoG算子,计算量将非常大。猜测NeuroCheck是因为采取了某种折衷的算法,所以导致出现了精度的各向异性。
根据John Canny提出的一条思想,即边缘检测算子是针对一维信号表达的,插件的设计思想为,首先将含有边缘的灰度信息提取到某个一维空间,然后在此空间内根据零穿越点(Zero-Crossing)的思想以较高的精度定位边缘的位置。

机器视觉软件的插件开发——NeuroCheck的边缘检测插件的设计-汽车制造网

图5 待检测的支架(bracket)及其前端检测图
边缘的信息可以被提取到检测边缘时所使用的线形ROI上(如图4),此时ROI上像素灰度值可以利用原图像的像素灰度值使用加权平均的方法求得。
在获得的这组ROI上的像素灰度值中,可以首先利用其梯度(即一阶差分)首先对边缘进行初步的定位,同时还可以获得边缘的顺序、高度、升降性等信息,并利用这些信息对边缘进行进一步的筛选,只留下所感兴趣的一个或几个边缘。然后在所获灰度值的二阶差分中,根据边缘所在位置其二阶微分为零的原理(即Zero-Crossing),对这少数几个边缘使用拉格朗日插值和二分迭代的方法,精确地定位边缘。

由于零穿越点算法容易受噪声影响(原始数据做了两次差分运算),且将边缘信息提取到线形ROI上时噪声的影响也比较大,所以插件中还设计了一个步骤,使用均值滤波的思想滤除噪声。

经过大量的数据测试,该插件的测量精度从标准差的角度来看,优于原NeuroCheck的内嵌函数三倍以上,并且该插件具有各向同性。另外从实时性能上看,该插件的运行时间为十毫秒级,完全符合工业检测的需要(如图5)。与一般边缘检测方法不同的是,该插件不适合用于直接检测物体的边缘轮廓,否则计算量将十分大,造成计算时间十分长,无法应用。

总结
如前所述,各种工业用机器视觉软件都有各自的优缺点。NeuroCheck使用简单,但是功能有时不够强大,而且有时还会存在明显的应用Bug。虽然其公司在不断地推出新版本、新功能以弥补以前的缺陷,但是作为它的使用者,仍然需要利用它提供的插件接口,根据自身实际应用的要求,对它的功能进行完善和补充。毕竟机器视觉软件是用于质量检测目的的,其本身的质量是不可忽视的问题,而且这对于开发具有自主知识产权的同类软件也有很大的帮助。