可视倒车功能是嵌入式车载终端的一个重要功能。系统通过装在汽车尾部的摄像头采集汽车后方实时图像,并将图像显示在驾驶员旁边的终端上。嵌入式智能车载终端设置了专用按键来开启和关闭该功能,也可以在换档手柄处安装检测装置,当处于倒车档位时将信号传到系统,开启该功能。驾驶员根据图像可以更好地掌握汽车后方的环境,从而提高倒车的安全性和效率。图11-5所示为可视倒车系统工作示意图。
图11-5 可视倒车系统工作示意图
由于系统使用摄像头来采集图像,因此必须在嵌入式系统中加载相应的摄像头驱动。ZC301x系列主控芯片摄像头支持JPEG格式和4:2:0采样的YUV原始视频数据输出,数据量小,可以直接作为MPEG-4等视频压缩编解码标准的原始视频数据源,避免了对图像的重采样和色彩空间的变换等复杂的数字运算处理,非常适用于嵌入式的实时视频采集。
本设计采用基于ZC301P芯片的摄像头,具有高质量的VGA感光器(35万像素),传输接口:USB1.1,最大分辨率为640×480像素,支持30f/s最大帧频,支持动态与静态视频采集。
在Linux系统平台上对USB摄像头驱动,首先把USB控制器驱动模块静态编译进内核,使开发平台支持USB接口,在使用摄像头进行视频采集时,使用insmod命令动态加载其驱动模块,这样摄像头就可以正常工作了。
在Linux下常用的摄像头驱动是spca5xx,这是一个通用驱动,该驱动的下载网站为http://mxhaard.free.fr/download.html。这个网站还给出了这款驱动支持的摄像头的种类。针对嵌入式环境,有专门的patch。使用usb-2.6.12LE06.patch.gz驱动摄像头的过程如下:
1)下载ZC301P驱动usb-2.6.12LE06.patch,下载后将其复制到/kernel/driver/usb目录下下解压、打补丁,就会在此目录下看到spca5xx文件夹。
2)配置内核:make menuconfig,在配置选项中选择(*)Multimedia device->Video for linux,加载Video4Linux模块,为视频采集设备提供编程接口。
3)选择模块USB support->USB Multimediadevices->USB SPCA5XX Sunplus Vimicro Sonix Cameras。
4)编译内核,makedep;makezImage;makemodules,在/kernel/arch/arm/boot下生成内核映像zImage,将内核固化到开发板中,并启动新内核。
5)通过编译后在/kernel/driver/usb/spca5xx下生成目标文件spca5xx.o、spcadecoder.o、spca_core.o,这就是所需要的驱动。
6)新内核启动,insmod3个.o文件(可以不加载spcadecoder.o),摄像头就加载成功了。
在Linux下进行视频采集是通过Video4Linux(V4L)驱动提供的接口函数和相关数据结构完成的。Video4Linux为上层应用程序提供了统一的视频设备操作接口,屏蔽了底层不同设备之间的差异。Video4Linux是Linux中关于视频设备的内核驱动,为Linux系统中的视频和音频数据提供了一套统一的API,配合适当的视频采集设备和相应的驱动程序,可以实现影像/图片采集、AM/FM广播和频道切换等功能。Video4Linux是Linux下进行影像系统开发的核心,在远程会议、可视电话、视频监控系统中都有广泛的应用。使用Video4Linux操作摄像头的流程如图11-6所示。
打开摄像头设备后,首先是获取摄像头的设备信息,包括设备名称、支持的最大/最小分辨率和信号源信息等。获得摄像头的信息后,对摄像头进行参数设置。根据系统使用的LCD显示器的特点,图像色彩模式设置为VIDEO_PALETTE_RGB565格式,图像分辨率设置为640×480像素,图像位深设置为16位。
图11-6 使用Video4Linux 操作摄像头的流程
每采集一帧数据后调用ioct1(fd,DIDIOCSYNC,&frame)函数等待采集结束,然后根据需要继续采集下一帧图像或关闭摄像头。在程序设计中,与摄像头相关的操作和数据结构都被封装在VideoCapture类中。其成员函数通过Video4Linux提供的接口完成对摄像头的具体操作。VideoCapture类的设计如下:
VideoCapture类的voidsetupCamera(QSizesize)成员函数用于初始化摄像头,其主要工作包括打开摄像头设备,获取摄像头基本信息,设置图像色彩模式,获取图像窗口参数,设置图像窗口参数和设置图像数据获取方式等。为了便于调整图像的输出分辨率,函数可使用size参数传递图像分辨率,在初始化摄像头时将按照size参数设置图像输出分辨率。在设备的初始化过程中,须判断每次的设备访问是否成功。如果失败,则必须进行错误处理。
用Video4Linux接口获取图像数据有两种方式:一种是用系统调用read;另一种是用内存映射输入输出。第一种方式使用起来较为简单,但不是所有的设备都支持这种获取图像数据的方式,大多数设备都支持用内存映射方式获取图像数据。视频采集的关键步骤如下。
1.打开视频
USB摄像头在系统中对应的设备文件为/dev/video0,采用系统调用函数open()实现。
2.读取设备信息
成功后可读取video_capability中的信息。其中,VIDIOCGCAP是videodev.h中定义的宏,具体定义为
ioctl(intfd,intcmd,…)函数的作用是在驱动程序中对设备的I/O通道进行管理,即对设备的一些特性进行控制。其中,fd是用户打开设备时使用open()函数返回的文件标识符;cmd是用户程序对设备的控制命令;省略部分是一些补充参数,一般情况下最多有一个参数,与cmd的意义相关。
3.读video_picture中的信息
成功后可读取图像的属性。(www.xing528.com)
4.改变video_picture中分量的值
先为分量赋新值,再调用VIDIOCSPICT。
5.初始化channel
进行视频采集,有内存映射(mmap)和直接从设备读取(read)两种方式。
通过映射得到视频驱动的数据缓冲,用mmap方式截取视频。mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read()、write()等操作。其过程包括
1)设置picture的属性。
2)初始化video_mbuf,以得到所映射的buffer的信息。
3)修改video_mmap和帧状态的当前设置,如重新设置图像帧的垂直及水平分辨率和彩色显示格式等,可利用如下语句:
4)将mmap与video_mbuf绑定。系统调用
进行绑定。其中,
●len:映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始算起,offset是一个缓冲区的大小。
●prot:指定共享内存的访问权限,PROT_READ(可读),PROT_WRITE(可写),PROT_EXEC(可执行)。
●flags:MAP_SHARED和MAP_PRIVATE中必选一个,不推荐使用MAP_FIXED。
●addr:共享内存的起始地址,一般设为0,表示由系统分配。
●mmap()返回值是系统实际分配的起始地址。
5)在mmap方式下捕捉流程就是调用VIDIOCMCAPTURE作视频截取。
若调用成功,开始一帧的截取,是非阻塞的,是否截取完毕留给VIDIOCSYNC来判断。
6)调用VIDIOCSYNC等待一帧截取结束。
若成功,则表明一帧截取已完成。可以开始做下一次VIDIOCMCAPTURE,frame是当前截取的帧的序号。
视频截取的第2种方法:直接读设备,调用read()函数。
6.关闭设备
完成视频采集后,需要清理内存和关闭视频设备。
图像数据的连续采集和显示是通过定时器实现的。QTimer类提供了定时器信号和单触发定时器。设置定时启动触发周期,每当定时器时间到就触发一个定时器事件,在事件中调用getCameraImage()函数完成对图像的采集,并将图像显示到LCD上。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。