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~。在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格式压缩,再将数据进行显示处理,为后续的转辙机缺口检测的上传功能实现奠定了基础。系统若配合使用可靠的传输技术与先进的上位机图像处理系统,将使转辙机缺口监测系统得以实现。