图像处理系统在自动化设备中用作位置反馈的一种方法
1. 在自动化设备中应用图像处理系统的优点
自动化设备为了获得准确的位置精度,通常采用两种方法,一种是采用滚珠丝杆加交流伺服电机组成半闭环位置控制系统;另一种是采用位置传感器,如:光栅尺、磁栅尺,以及高级控制器组成闭环控制系统。这两种方法技术成熟,但成本较高。
我们采用国产图像卡、镜头、台湾产摄像头和PC机,再加上滑动丝杆、步进电机和多轴运动控制器等元器件构成位置反馈控制系统。PC机通过处理图像信息,检测工件平面位置,控制电机运动,补偿系统误差。
采用这种结构我们成功的开发出多种自动化设备,如:自动点胶机、自动超声波焊机等。其特点是:设备的精度高、成本低;由于有图像显示,调节点胶针头、超声波焊针和工装的初始位置十分方便,对工装的一致性要求也不高。
2. 系统结构与定位方法
下面以自动点胶机为例介绍该系统结构。图1为该设备的外形,图2为该设备的系统框图。
图1 自动点胶机外形
PC机通过摄像头、图像卡采集工件的平面图像,经过图像处理后,得到工件的当前位置;PC机通过RS-232串行端口,将运动指令发送给多轴运动控制器,控制器控制X-Y平台、Z轴平台运动以及点胶阀的开关。[1]
摄像头固定在机架上不动,其放大倍数也是固定的,所以,图像上的像素点对应工件上的长度是一定的,计算像素点个数,就能推算出距离及位置。
在正常工作之前,要将图像系统和X-Y平台位置、点胶针头建立起对应关系。如图3所示,将X-Y平台从其原点开始移动,使工装上的第一个工件出现在摄像头拍摄的画面中央, 系统软件记录下X-Y平台的初始位置(X0,Y0);调整固定在Z轴平台上的点胶针头的位置,使其落在图像画面的针头定位框内,从而针头和摄像头的相对位置就确定了。
正常工作时,系统软件控制X-Y平台从原点运动到第1个工件位置;抓取工件图像,通过模板匹配技术,获取工件当前位置;和理想位置比较后,调整X-Y平台位置,消除误差,并运动到点胶启始位; Z轴下降到点胶高度,然后打开点胶阀开始点胶; X-Y平台按点胶轨迹运动;关点胶阀,Z轴抬起,完成一个工件的点胶过程。
然后,X平台平移距离d,第2个工件进入图像画面,取图像、调整位置、点胶;如此重复,完成5个工件的点胶过程。
3. 模板匹配算法的改进
模板就是一幅已知的小图像。模板匹配就是在一幅大图像中搜寻目标,已知该图中有要找的目标,且该目标同模板有相同的尺寸、方向和图像,通过一定的算法可以在图中找到目标,确定其坐标位置。
如图4所示,模板T( m ′ n个像素)叠放在被搜索图S( W ′ H个像素)上平移,模板覆盖被搜索图的那块区域叫子图Sij。I,j为子图左上角在被搜索图S上的坐标。搜索范围是:
一种算法是衡量T和Sij的误差,其公式为:
E( i, j )为最小值处即为匹配目标。为提高计算速度,取一个误差阈值E0,当E( i, j )> E0时就停止该点的计算,继续下一点计算。
为了提高模板匹配处理速度,设计了二次匹配误差算法,即:
第一次匹配是粗略匹配。取模板的隔行隔列数据,即四分之一的模板数据,在被搜索图上进行隔行隔列扫描匹配,即在原图的四之分一的数据内匹配。由于数据量大幅度减少,匹配速度显著提高。
为了合理的给出一个误差阈值E0,设计了一个确定误差阈值E0的准则:
E0 = e0 * (m+1)/2 * (n+1)/2
式中:e0为各点平均的最大误差,一般取40~50即可;
m,n为模板的长和宽。
第二次匹配是精确匹配。在第一次误差最小点( imin,jmin )的邻域内,即在对角点为( imin-1, jmin-1), ( imin+1, jmin+1)的矩形内,进行搜索匹配,得到最后结果。
表1是无阈值误差法、有阈值误差法、二次匹配误差法这三种模板匹配算法对两幅图像进行模板匹配的结果比较:
结果表明:被搜索图越大,匹配速度越慢;模板越小,匹配速度越快。误差法阈值的大小对匹配速度影响大,和模板的尺寸有关。改进后的二次匹配误差法的速度大幅提高。
图5是自动点胶机的PC机界面。为了提高匹配速度,被搜索图由蓝色框决定,大小可调;黄色框为模板,及工件的右下角;红色框为工件外沿。从图中可看出,工件偏向右侧,说明位置有误差,但图像系统通过辨识工件的右下角,确定了工件的准确位置。点胶将在红色框内进行。
4.二次匹配误差法的主要代码
#define AvEthreshold 40 // 各点平均误差
int Ethreshold; // 误差阈值
//计算误差阈值
Ethreshold=AvEthreshold*((lTemplateHeight+1)/2)*((lTemplateWidth+1)/2);
// 第一次粗略匹配,找出误差最小位置(nMaxHeight,nMaxWidth)
// 仅使用模板中隔行隔列的数据,在被搜索图中隔行隔列匹配
nMinError = 99999999;
for (i = 0; i < lHeight - lTemplateHeight +1; i=i+2)
{
for(j = 0; j < lWidth - lTemplateWidth + 1; j=j+2)
{
nError = 0;
for (m = 0; m < lTemplateHeight; m=m+2)
{
for(n = 0; n < lTemplateWidth; n=n+2)
{
// 指向被搜索图像倒数第i+m行,第j+n个象素的指针
lpSrc = (char *)lpDIBBits + lLineBytes * (i+m) + (j+n);
// 指向模板图像倒数第m行,第n个象素的指针
lpTemplateSrc = (char *)lpTemplateDIBBits + lTemplateLineBytes * m + n;
pixel = (unsigned char)*lpSrc;
templatepixel = (unsigned char)*lpTemplateSrc;
nDelta=(int)pixel-templatepixel;
if (nDelta<0) // 做绝对值运算
{nError = nError-nDelta;}
else{nError = nError+nDelta;}
}
if (nError>(Ethreshold)) break; // 误差大于阈值,进入下一点计算
}
if (nError < nMinError) //与最小误差比较
{
nMinError = nError; // 记录最小误差及其坐标
nMaxWidth = j;
nMaxHeight = i;
}
}
}