徐 洋,廖钦渔,李 锐,程安宇
(重庆邮电大学汽车电子与嵌入式系统工程研究中心,重庆 400065)
汽车仪表关系着驾驶状态的正确指示,对保障行驶的安全性至关重要。因此,仪表出厂前需要对其各项功能进行严格的检测及校正。目前仪表的检测,国内绝大多数仍采用人工的方法,国外研究发展相对起步较早,普遍采用电子设计自动化、计算机辅助测试等新技术,已有不少先进的检测仪器。机器视觉技术旨在通过计算机模拟人眼的视觉功能,获取客观三维世界的信息,并对其进行测量、跟踪、处理和识别[1]。将视觉技术应用在汽车仪表的检测中,不仅可以减少传统人眼检测因视野距离或疲劳疏忽等因素导致的缺陷和不足,而且可以大大地加快检测速率,节省时间成本,真正实现系统化、规范化和自动化的检测。
图像处理技术开发的工具众多,对仪表图像的研究一般多采用LabView、MATLAB或者单纯的VC++等工具[2-3]。使用这些方法虽然可以进行相关图像处理的研究,但是它们或者提供的是非语言性编程,只能做仿真,或者就是编程工作量巨大,不能实现简单、便捷以及即时性的综合需求。OpenCV(Open Source Computer Vision Library)是基于Visual Studio集成开发环境的开源计算机视觉库,为图像处理技术的研究提供了方便快捷且完全免费的平台[4],采用其进行图像处理识别的研究可以提高执行速率,减少代码数量,符合即时、便捷的需要。
系统的总体设计结构框图如图1所示,系统主要由以下几部分组成:视频图像处理的控制计算机及其处理软件,USB接口的CMOS摄像头获取实时的无压缩的视频数据,摄像头横纵竖三方向的移动支架,LED灯群为图像采集提供外部光源,促使仪表转动的驱动模块,被测仪表以及其固定支撑台。
本设计中控制计算机采用Intel公司生产的Pentium处理器,处理速度为2.20 GHz,内存2.00 Gbyte,可以满足实时采集需求。图像处理软件采用基于Visual Studio 2008集成开发环境下的OpenCV库,实现相关函数可对采取图像进行预处理和识别判定。
图1 系统总体结构框图
图像采集部分采用Microview公司的MVC-II-3M摄像头,这是一款遵循USB 2.0标准的高分辨力、高清晰度、高帧率一体化的摄像头,具有高速、带帧存、外触发采集和闪光灯输出功能,最高分辨力可达到2048×1536,符合仪表检测对高分辨力的特殊要求。
本系统还设计了摄像头横纵竖(X轴,Y轴,Z轴)3个方向的自由移动功能。当需要在表盘上获取某指定部分信息时可以在X轴和Y轴移动支架调整摄像头位置,而当需要拉伸缩进摄像头与表盘相对位置时就可在Z轴调整。这样可以随意调整支架,从而调整摄像头位置以获取想要的图像信息。
由于检测系统的封闭性,内部只靠驱动后的仪表自带发光,不足以给检测环境提供充足且均匀的光源,所以需要在系统内部周边安装光源。选取的LED灯耗电量少、发光效率高、发热量低,能在不影响系统性能的情况下提供均匀稳定的光源。
要获取指定刻度的仪表指针指示情况,被测仪表需要一定的驱动信号使其指针旋转到预期指定的位置,这里采取给仪表接入信号发生器和电位调节器的方法,可以对仪表盘上不同功能的表头进行驱动控制。
最后系统设计了固定的支撑台,通过夹具将被测仪表扣锁在支撑台上,这样才可以保证检测时图像采集的稳定性。
对图像进行处理的前提是图像本身能够最大程度地反映有用信息,如果图像本身由于非客观因素导致的图像质量低下,那么这幅图像可以视为不合格的研究对象,后续的处理与识别也不再有意义。因此采集最佳的仪表图像成为本设计的关键之一。
MVC-II-3M摄像头提供了SDK软件开发工具包,可以利用其API接口进行二次开发。结合MVC摄像头开发包编程可以采集视频图像,该采集过程中不但可以对视频窗口的横纵偏移量和窗口大小进行设置而且可以通过调节曝光时间和红绿蓝三色增益来得到满意的图像色彩。对摄像头采集的视频信息进行抓帧处理即可获取想要的各幅图像,这些图像将存入计算机缓存中以供后面处理需要。摄像头获取并显示图像的代码如下:
其中,pFrame是OpenCV中创建的一个IplImage结构体变量,camera.QueryFrame是类camera中的的帧获取函数,cvNamedWindow和cvShowImage分别为窗口命名和图像显示函数。
系统采集到的仪表图像是RGB格式的彩色图像,虽然里面包含了所需要的信息,但也包含了很多对于表盘和指针检测无用的信息。同时,由于外界因素的影响图像难免存在一定的噪声,如果不进行处理,就会加大工作量和影响对有用信息的获取。本实验只对图像的表盘、指针等轮廓突出信息进行检测,对图像的颜色亮度等不做研究,所以只须将原图像进行去噪、灰度化、边缘检测便可给后续识别环节提供充足的信息。
OpenCV可以提供5种不同的图像平滑去噪方法,所有的操作都由cvSmooth函数实现。高斯滤波是最常用的去噪方法,它利用卷积核与输入图像的每个像素点进行卷积,将最终的计算结果之和作为输出图像的像素值。OpenCV的高斯滤波提供的几个标准核大小3×3,5×5,7×7具有比其他核更优的性能。OpenCV高斯去噪代码如下:
其中,in和out分别为高斯去噪的输入图像和输出结果,CV_GAUSSIAN代表去噪类型,最后的2个参数代表对图像进行核大小为3×3的高斯卷积。OpenCV高斯去噪的仪表图像对比如图2所示,左边为原图Original,右边为高斯去噪后的图Denoising。
图2 高斯去噪效果对比图
当数据类型一致时,OpenCV的cvCvtColor函数可将图像从一个颜色空间转换到另一个空间。OpenCV可实现RGB色彩空间到灰度空间、HSV色彩空间、HLS色彩空间、CIE色彩空间的转换以及反变换。图像的灰度化即是将图像从RGB色彩空间转换到灰度空间,OpenCV图像灰度化代码如下:
其中,out和out1分别为灰度变换的输入图像(即去噪后的图像)和输出结果,CV_BGR2GRAY代表转换代码。OpenCV灰度化的仪表图像对比如图3所示,左边为去噪后的图Denoising,右边为灰度化后的图Gray。
图3 灰度化效果对比图
边缘检测最常用的是Canny算法,它与拉普拉斯算法不同之一是首先在x和y方向求一阶导数,然后组合为4个方向xx,xy,yx,yy的导数,这些方向导数达到局部最大值的点就是组成边缘的候选点。Canny算法最重要的一个特点是其试图将独立边的候选像素拼装成轮廓,轮廓的形成是对这些像素运用滞后性阈值,所以需要2个阈值,即上限和下限。如果一个像素的梯度高于上限阈值则被认为是边缘像素,如果低于下限阈值则被抛弃,如果介于二者之间,只有当其与高于上限阈值的像素相连时才会被接受[4]。OpenCV的Canny边缘检测代码如下:
其中,out1和out2分别为边缘检测的输入图像和输出结果,cvCanny函数要求输入一幅灰度图,所以前面灰度化的图像便作为该处的输入,而函数输出的图也一定是灰度的(实际是二值图像)。后面的3个参数分别为下限阈值lowThresh、上限阈值highThresh和中孔值aperture-Size。经实验验证,上下限比值在2∶1~3∶1之间边缘检测效果清晰明显,而中孔是用于函数内部的使用。OpenCV边缘检测的仪表图像对比如图4所示,左边为灰度化后的图Gray,右边为边缘检测的图Canny。
指针式仪表检测是一个复杂精细的过程,系统最关键的部分就是指针示数的判读。由于检测系统对指针的测量是多次重复的操作,所以针对同一类型仪表可以确定该表盘的中心位置,后面的检测可以通过表盘各点向该中心点投影的方法确定指针的位置,从而判定仪表指针指示准确性是否合格。
图4 边缘检测效果对比图
初步观察仪表盘构造特征,可以知道表盘的中心点应在指针旋转的固定轴线位置。为了精确地确定表盘的中心,这里采用多组两线交点求均值的方法来找出中心点O。一般的研究求中心点只选取零刻度和满刻度所在直线这两线求交点[5],如下方程组所示
式中:x和y是二值图像中直线上点的坐标;k1,b1,k2,b2代表两条相交直线各自的斜率和y轴截距。这样由单一的两条特殊直线所确定的交点(x,y)作为表盘中心点难免不精准。系统采用的多组两线交点求均值的方法可以改善上述方法的误差性。多组两线交点均值法是以表盘上包括满刻线在内的几个大刻度线所在直线均与零刻线所在直线做交集,分别求得交点(x1,y1),(x2,y2),…,(xn,yn),然后求这些交点的算术平均值,即横纵坐标的算术平均值,公式为
这样通过多组直线交点求出的均值(¯x,¯y)作为表盘的中心点更具有真实性和准确性。
中心投影法是将图像上的各特征点向该中心点做投影,相当于在极坐标系中对平面图像上的点进行分析处理。极坐标系中,直线用以下方程式表示
式中:x和y代表直线上点的坐标,ρ和θ分别代表点(x,y)到原点的距离和点(x,y)所在过原点直线与x轴的夹角,如图5所示。极坐标系中每一个点对应一个角度θ,每个角度θ的直线上会有不同数目的特征点组成一个集合A(θ),当有一个点投向这个角度时,集合A(θ)元素增加1。这样通过对集合A(θ)中元素个数的比较,找出局部最大值,含有最多元素个数的集合Amax(θ)所对应的角度θ即为指针所在直线的角度,从而便可找出指针所在位置[6]。如图6中心投影示意图所示,每一个θ角度上都有一定的点投影,这里示例当θ=45°时,投影的特征点数目最多,那么其对应的集合A(θ)元素个数最多。
由于表盘的均匀分布性,只有指针所在位置的θ角度所在直线才会出现投影点明显多于其他角度,A(θ)元素个数远远多于其他集合。前面求出了仪表的中心点所以只要找到了这个角度θ,便可以通过该θ值与表盘刻度的对应关系求出指针示数值。仪表盘刻度的所在角度需要以所确定的中心点O为原点建立极坐标系获取。各款仪表表盘刻度与θ角度的对应关系不同,本实验所测仪表盘的转速表刻度与θ角度的对应关系如表1所示,这里只列举了整十的大刻度。
表1 转速表盘刻度与θ角度的对应关系
为了检测仪表指针指示的准确性,如果每一个刻度都检查会浪费很多的时间,一般方法是选取表盘上几个特殊刻度(如零刻度、满刻度以及其他适当的大刻度)做检测,这些刻度指示准确与否决定着仪表检测的结果。
将各经过处理识别后读取的表盘指针指示值与输入驱动标准信号一一做对比,根据两者之间相差的数值便可判定该仪表指针指示的准确性。
经实验测试,系统采集仪表图像并进行去噪、灰度化以及边缘检测等预处理,运行速率快,执行时间可达40 ms,即时性能好。
对边缘检测后的二值图像使用中心投影法找寻指针位置,图7是仪表指针指示一定刻度时,系统分析的表盘图像基于中心点投影分布的角度θ和集合A(θ)的关系。图7a中可以看出,θ=200°时,A(θ)集合元素数目最多,查询本款仪表刻度与θ角度的对应关系可知,该示数读取值为0 km/h。图7b中可以看出,θ=120°时,A(θ)集合元素数目最多,查询对应关系可知,该示数读取值为80 km/h。
图7 图像中角度θ和集合A(θ)的关系
相同方法对该款仪表的0 km/h,40 km/h,80 km/h,120 km/h,160 km/h,200 km/h 以及220 km/h 这些大刻度进行检测,并与相对应的驱动信号进行对比,即可判断该仪表盘指针指示是否准确。根据标准QC/T727—2007《中华人民共和国汽车行业标准:汽车摩托车用仪表》所示,汽车转速表的基本误差范围应在±2%以内,误差在此范围内的仪表视为合格[7]。检测对比结果如表2所示,各检测刻度检测值与标准值偏差都不大于0.02,所以该转速表指示准确性判断结果为符合标准。另外用户或厂商也可根据需要设定自己的标准,那么按照这些特定的标准也可对指示准确性进行相应的判断。
表2 检测对比结果
本文设计的基于机器视觉的汽车指针仪表检测系统能够实时采集并处理识别待检测仪表图像。而使用OpenCV开源计算机视觉库可以根据实验需要随时调用图像处理的函数库,方便自定义算法的实现与验证。
该系统能够从机器视觉的角度实现汽车仪表指针示数值的自动读取,并与标准信号作比较,从而判断指针示数是否准确。系统实时性强、识别效率良好,便于后续识别算法的改进以及检测功能的扩充。
[1]GUO Lei,XU Youchun.Study on real-time distance detection based on monocular vision technique[J].Journal of Image and Graphics,2006,11(1):75-81.
[2]岳国义,李宝树,赵书涛.智能型指针式仪表识别系统的研究[J].仪器仪表学报,2003(S2):430-431.
[3]宁志刚,汪仁煌,唐冬.基于图像处理的高精度仪表判读方法[J].传感器与微系统,2006,25(3):32-35.
[4]BRADSKI G,KAEHLER A.学习OpenCV[M].于仕琪,刘瑞祯,译.北京:清华大学出版社,2009.
[5]何智杰,张彬,金连文.高精度指针仪表自动读数识别方法[J].计算机辅助工程,2006,15(3):9-12.
[6]陈彬,金连文.一种仪表指针位置检测的中心投影法[J].计算机应用研究,2005.
[7]国家发展和改革委员会.QC/T727—2007,中华人民共和国汽车行业标准:汽车摩托车用仪表[S].2008.