转辙机缺口监测问题一直是铁路信号系统特别是信号维修部门关注的热点。随着铁路高速、高密度行车区段的不断增加,为了确保行车安全,对行车道岔运行质量与状态稳定性监测无为重要。
1 系统技术指标
主要技术指标:(1)缺口图像分辨率0.01 mm。(2)缺口偏移检测精度0.1 mm。(3)信号传输距离≤2.5 km(1.0 mm线径)。(4)动态图像传输码流100~250 kbit·s-1。
2 图像采集模块设计原理
图像采集使用微型摄像头,图像分辨率是指图像中每单位长度所包含的像素或点的数目,常以像素/英寸(ppi)为单位来表示。对电动转辙机(S700K、ZD6)正面缺口在4~6 mm,用普通的30万像素摄像头,精度可达6/640=0.01 mm。图像数据量大小=图像中的像素总数×图像深度÷1 024(单位为kB)。30万像素摄像头捕捉到640×480的画面,二值图像深度为1,灰度图像深度为8或者彩色图像深度为24,普通灰度图像大小为2400kB。
JPEG是由ISO和CCITT 1986年成立了“联合图片专家组”(Joint Photographic Experts Group)所制定的静止灰度或彩色图像的压缩标准。JPEG标准定义了3种编码系统:(1)基于DCT的有损编码基本系统,可以适合大多数压缩场合。(2)基于分层递增模式的扩展、增强编码系统,用于高压缩比、高精度或渐进重建应用场合。(3)基于预测编码中DPCM方法的无损系统,用于无失真应用的场合。
图像应用系统要与JPEG兼容,必须支持JPEG基本系统,可以通过修改其文件格式、图像分辨率或彩色空间模型应用于不同场合。在不降低图像视觉质量的基础上JPEG标准可以将图像压缩到1/10~1/50,这样一帧图像的大小就可以压缩到48 kB,根据需要还可以压缩为6 kB的二值图像,满足缺口检测的要求。
在基本系统中,输入和输出数据的精度为8 bit,量化DTC值的精度为11 bit。压缩过程由3个步骤组成:(1)DCT计算。(2)量化。(3)用熵编码器进行变长码赋值。具体过程如下:先把图像分割成一系列8×8的子块,然后按从左向右从上到下的次序处理。基本系统的编码器如图2所示。
Video4Linux(V4L)是Linux的影像串流系统与嵌入式影像系统的基础。Video4Linux是Linux Kemel里支持影像设备的一组APIs,配合适当的视频采集卡与驱动程序,Video4Linux可以实现影像图像采集,它支持图像的JPEG压缩。Video4Linux分为2层式架构,上层为Video4Linux驱动程序本身,下层架构则是影像设备的驱动程序。实验中使用了V4L的上层驱动程序,即V4L所提供给程序开发人员的APIs。通过使用Video 4Linux的API函数从视频设备中读取图像数据,然后将这些数据写入Frame Buffer,使摄像头采集到的图像在液晶屏中显示出来。
3 图像采集硬件设计
在ARM9系统中通过USB接口连接USB摄像头对图像进行采集,实现转辙机缺口监测的图像采集。ARM9核心板:处理器采用ARM920T处理器的S3C2410A,工作频率203 MHz;SDRAM是64 MB;NANDFlash:64 MB;NORFlash:2 MB;USB接口:AU9254A21支持USB1.1协议。
USB采集电路的原理框图如图3所示。
USB主机芯片采用AU9254A21,它是单片的四端口USB控制芯片,这里扩展了4个USB接口。它的上端接USB控制系统,下端可接USB设备。
4 图像采集软件实现
在Linux系统中,通过使用Video4Linux的API函数,从视频设备中读取图像数据,然后将这些数据写入系统临时文件为后续的功能实现奠定基础。
采集程序实现过程:一个嵌入式Linux系统从软件的角度看通常分为4个层次:Bootloader、Linux内核、文件系统和用户应用程序,如图4所示。
4.1 移植Bootloader
USB摄像头的采集应用程序是建立在Linux系统上,首先配置适合系统的Bootloader,Linux内核在RAM中运行,这就需要Linux的Bootloa der将整个内核复制到RAM中。系统中Bootloader是运行在NORFlash中,它的主要作用是:将Linux内核文件、根文件系统文件、Linux启动参数文件复制到SDRAM中,并跳至RAM中Linux内核的首地址,运行Linux。各文件在RAM中存放的空间示意图,如图5所示。
4.2 编译下载内核
将Linux源代码包放置在工作目录下解压,用命令:#tar xjvf linux-2.4.18.tar.bz2。编译内核,在终端输入命令:#make menu config命令,选择“load analternate configuration file”,装载arch/am目录下的2410配置文件。建立依赖关系,在终端运行命令:#make dep。编译内核,在终端输入命令:#make zImage。编译完成后在arch/arm/boot目录下会生产ARM Linux内核映像文件zIm age,用FlashFXP软件的FTP下载。
4.3 图像采集应用程序
在图像采集设备驱动安装后,只需再编写一个视频流采集应用程序,即可采集视频图像。
前面提到Linux系统中把设备看成设备文件,在用户空间可以通过标准的I/O系统调用函数操作设备文件,从而达到与设备通信交互的目的。视频设备在Linux系统下为一个字符型设备,分配给视频设备使用的主设备号固定为81,次设备号为0~31。在Linux系统中通常使用设备名为video0~video31,使用以下命令在设备文件夹/dev/下创建1名称为video0的节点:# mknod/dev/video0 c 81 0配置Video4Linux内核:在终端使用make menuconfig命令打开S3C2410Linux内核编译的Main Menu窗口,并进入“Multimedia devices→”菜单选项,然后将Video For Linux配置为模块;返回主菜单(Main Menu),再进入“USB support→”菜单选项,然后将USB Camera support设置为模块,退出并保存配置,使用make dep命令建立文件依联关系,然后使用make modules命令编译链接模块。编译链接完成后,在/linyx/kernel/driv ers /media/video文件夹中生成videodev.o模块,在/linux/kemel/drivers/usb/文件夹中生成ov511.o模块,ov511芯片直接就支持Linux,使用这款芯片的摄像头有网眼V2000。
利用V4L API获取视频图像的应用程序流程,如图6所示。
下面简要介绍其实现:
(1)打开视频设备,这里用int v41_open(char*,v41_device*)实现。
(2)获得设备信息的任务,这里用extern int v41_get_capability(v41_device*)实现。函数有vd->capability和vd->picture两个结构体。capability主要包括设备名称、支持的最大最小分辨率、信号源信息等。picture结构包括了亮度,对比度,色深。及两个函数中最主要的语句ioctl。对于ioctl的行为,它是由驱动程序提供和定义的,在这里是由v41所定义,其中宏VIDIOCGCAP和VIDIOCGPICT的分别表示获得视频设备的capability和picture。
运用int v41_get_mbuf(v41_device*vd)函数。通过这个结函数可以获得摄像头可映射的设备存储图像的内存大小、摄像头可同时存储的帧数、每一帧图像的偏移量。
(3)按需要更改设备的相应设置,通过int v41_set_picture函数实现。其核心是v41为提供的ioctl相关调用,通过这个函数可以修改如亮度,对比度等相关的值。
(4)获得采集到的图像数据,通过extern int v41_grab_picture实现。先使用ioctl(fd,VIDIOCGMBUF,&grab_vm)函数获得摄像头存储缓冲区的帧信息,之后修改voideo_mmap中的设置,例如重新设置图像帧的垂直及水平分辨率、彩色显示格式。其中vd->map所指向的数据就是图像数据。
采集其中的第一帧,使用ioctl(fd,VIDIOCMCAPTURE,&grab_buf)函数,若调用成功,则激活设备真正开始一帧图像的截取,是非阻塞的。接着使用ioctl(fd,VIDIOCSYNC,&frame)函数判断该帧图像是否截取完毕,成功返回表示截取完毕,之后就可把图像数据写入到Frame Buffer。
然后利用grab_fd.frames值确定采集完毕摄像头帧缓冲区帧数据进行循环的次数。在循环语句中,也是使用VIDIOCMCCAPTURE? ioctl和VIDIOCSYNC?ioctl函数完成每帧截取,但要给采集到的每帧图像赋地址,利用语句buf=grab_data+grab_vm.offsets[frame],然后保存文件的形式。若要继续采集可再加一个外循环,在外循环语句只要给原来的内循环再赋frame=0即可。通过显示屏把采集到的视频图像显示出来。
(5)关闭设备,int v41_close(v41_device*),主要是关闭设备,取消映射。
5 图像采集效果
将摄像头插入到USB主机下行口,这时在终端上将打印以下信息:
ov511.c:USB OV511+camera found
ov511.c:Camera type(108)not recognized
ov511.c:Please notify mmcclell@bigfoot.com of the name,
ov511.c:manufacturer,model.and this number of your camera.
ov511.C:Also include the output of the detection process.
ov511.c:Sensor iS an OV7620
ov511.c:Device registered on minor 0
进入到本实验程序所在文件夹,运行本实验程序,观察液晶屏的图像效果:
#/videodemo
6 结束语
在ARM-Linux平台上,通过使用Video4Linux的API函数从视频设备中读取图像数据,并对图进行了JPEG格式压缩,再将数据进行显示处理,为后续的转辙机缺口检测的上传功能实现奠定了基础。系统若配合使用可靠的传输技术与先进的上位机图像处理系统,将使转辙机缺口监测系统得以实现。