《课程设计论文基于arm的视频图像采集系统.doc》由会员分享,可在线阅读,更多相关《课程设计论文基于arm的视频图像采集系统.doc(11页珍藏版)》请在三一办公上搜索。
1、基于arm的视频图像采集系统摘要:本系统采用了Samsung公司生产的S3C2440芯片作为嵌入式处理器,再结合系统所需的外围硬件构成基本硬件电路。主要包括二大部分:处理器和存储器部分;电源时钟复位电路部分;外围接口电路部分。在对各部分硬件进行详细设计后,接下来详细介绍了嵌入式软件平台的构建,包括如何移植Linux操作系统:基于嵌入式Linux下USB接口摄像头视频设备采集;移植H.264视频压缩库和视频传输程序的编写。1 抓拍系统开发环境的构建 本文所设计的采集系统按功能可划分为嵌入式主控模块、视频采集模块、网络传输模块、等三大部分。图1-1为本系统的系统框架图: 1. USB数字摄像头采集
2、图像数据: 2.采集传输应用程序通过摄像头驱动从摄像头获取到采集的图像数据: 3.采集传输应用程序调用H.264编码库对图像数据进行压缩: 4.采集传输应用程序将压缩后的图像数据通过网络传输给windows PC上的显示程序: 5. Windows上的显示程序对图像数据进行解码并显示:图1-1软件架构图本系统的嵌入式主控模块是基于Samsung公司生产的S3C2440这款处理器,主要作用是实现对各模块数据的响应、处理以及控制。在硬件上,主控模块包括电源、时钟、复位电路、存储模块、以太网接口电路等。在软件上,主控模块上运行Linux操作系统,管理各应用程序模块进程并调度各进程。1.1采集系统的硬
3、件平台设计 本系统的核心处理器为二星公司的S3C2440,外扩64M的SDRAM存储器以及64M的FLASH存储器,外围接口电路模块:包括USB接口电路,以太网网卡DM9000接口电路以及网眼3000的数字摄像头等。本系统的硬件结构如图1-2所示。图1-2系统硬件架构图1.1.1电源、时钟模块设计系统各部分硬件要求提供1.8V和3V的电压。其中S3C2440处理器内核需要提供1.8V电源,NandFlash, SDRAM及DM9000等芯片需要提供3V电源,所以本系统采用了LM1117-3.3和LM1117-1.8电压转换芯片设计稳压电源,得到1.8V和3.3V的所需电压。USB控制器需要提供
4、5V的电源。本文采用了5V直流电压供电。LM1117是一个低压差电压调节器系列。其压差在1.2V输出,负载电流为800mA时为1.2V 。LM1117有5个固定电压输出(1.8V, 2.5V, 2.85V, 3.3V和5V)的型号。根据本系统的需要,这里选用了电压输出为1.8V和3.3V两型号。时钟电路为CPU和其它外围电路提供精准的工作时钟,按照电路中设计使用的器件特性分为有源和无源晶振,在本系统的设计电路中采用的是无源晶振。ARM芯片均提供时钟发生电路,结合一定的辅助电路的配合就可以得到所需要的时钟信号。基十ARMS的这款S3C2440芯片的时钟控制逻辑可以产生为CPU核供给时钟信号的FC
5、LK、为AHB总线供给时钟信号的HCLK、为APB总线供给时钟信号的PCLK。1.1.2外部存储器的扩展S3C2440微处理器存储空间仅有32M,应用于本系统,需要外扩存储器。本设计采用两片二星公司的HY57V561620来扩展64M的SDRAM。它们均4M* 16bit*4bank的SDRAM芯片,这样,两片SDRAM实现了位扩展,数据总线达到了32bit,构成64M寻址空间。图1-3为S3C2440与NandFlash的接口图。图1-3 S3C2440的存储器扩展框图1.1.3外围接口电路设计S3C2440内部集成了2个USB host和一个USB device接口。USB的分时处理机制实
6、现了外设的即插即用。在USB接口电路中的D+, D-均为数据输入端。USB接口中其它两根线接电源和地,设计电路中用到的电感、电阻、电容主要起滤波作用。其中还用到了起限流作用的电阻,主要是在短路时防止烧毁供电电路。抓拍系统将抓拍到的图像数据通过以太网传输到PC机客户端。由于微处理器S3C2440内部没有集成网络控制器,应本系统网络的需求,这里使用DM9000网卡芯片进行扩展。DM9000快速以太网控制处理器是DAVICOM公司推出的,合成了NINIU, MAC和PHY。图1-4为DM9000与S3C2440的连接示意图。图1-4以太网接口电路本设计采用了16位的连接模式。因为DM9000没有专用
7、的地址线,是通过地址线与数据线复用来实现。其中的CMD是命令类型控制信号,如果CMD为高,传送的为数据:如果CMD为低,传送就是地址。其中AEN是地址使能信号线,即DM9000的片选信号线,通过把LnGCS4设置为低电平控制选通DM9000。中断信号线INT占用S3C2440的7号中断,使得S3C2440可以响应DM9000的中断。DM9000与网络之间的连接由发送信号线TX+, TX-和I接受信号线RX+, RX一通过隔离变压器E-2023与以太网水晶接口RJ45相连。其中隔离变压器的最主要的作用是将嵌入式系统和外部线路相隔离,防止干扰以及烧坏元器件,并实现带电插拔功能。1.2终端系统软件平
8、台的构建1.2.1交叉编译环境的建立因为在嵌入式系统开发时,不可能有足够的资源提供给开发系统直接运行开发工具以及调试工具等。通常,嵌入式系统软件开发是采用一种交叉编译调试的方式进行开发。开发时,先使用宿主机上的一些交叉编译、汇编和链接工具等形成只能在目标板上执行的可执行代码。1.2.2 Bootloader的移植在交叉工具安装完成以后,需要移植嵌入式操作系统,它为应用程序的开发提供良好的软件平台。嵌入式linux系统从上电到运行用户的应用程序,一般要经历三个过程:一是加载Bootloader;二是启动linux;三是挂载根文件系统,为了使整个系统顺利运行,接下来做下面三方面的工作:Bootlo
9、ader移植;制作根文件系统;裁剪内核。下面详细介绍Bootloade移植。在基于ARM的嵌入式系统中,当进行上电或复位操作时,执行的第一段程序就是Bootloader。它主要是初始化硬件、建立内存地址映射表,建立合适的系统硬件环境,也为最后调用操作系统的内核做好充分的准备。在嵌入式开发中,没有一个标准的Bootloader,因为它是依赖于实际的硬件和应用环境。下面根据本系统的硬件修改通用的U-Boot。1.选择移植参考开发板:首先选择MCU相同的开发板,在uboot-2008.10中不支持MCU为S3C2440芯片的开发板,如果MCU没有找到参考开发板,则选择MPU相同的作为参考,S3C24
10、40的MPU为arm920T, uboot-2008.10中smdk2410开发板其MPU也为arm920T,故选择smdk2410作为参考开发板。 2.在顶层Makefile中添加新的配置选项,使用smdk2410已有的配置项目为起点。 3.修改CPU/arm920t/start.s,修改编译条件使其支持S3C2440、添加寄存器的定义、修改中断禁止和对时钟的设置(S3C2440主频设置为405MHZ)。 4.在cpu/arm920t/s3c24x0目录下的文件interrupts. c , speed. c等添加对S3C2440的支持及对分频的设置做些修改。 5.选择板级配置:#make
11、Mzy2440_ config,即选择的board是Mzy2440o 6.编译uboot,#make CROSS COMPILE=arm-linux-,编译成功后会产生u-boot.bin文件,它将被自动复制到当前主目录。1.2.3系统内核移植 解压内核到/home/meizhaoyun/zhuapai,清理内核中间文件、配置文件,选择参考配置文件,#cp config-zhupai.config。下面对内核的配置进行简单的介绍:这里使用了网眼3000的USB摄像头来采集视频图像,linux对该摄像头使用的芯片为OV511芯片提供了很好的支持。Linux操作系统下实现视频图像采集,必须在内核中
12、加载二个模块:USB设备驱动、OV511模块和video4linux模块。 在内核源码目录下运行命令make menuconfig,具体步骤如下:1.在配置菜单中选择“multimedia devices-Video for linux”选项,这样在内核中加载了Video4 Linux驱动,为视频采集设备提供了编程接口。2.在配置菜单中选择“USB Support-USB Multimedia devices-USB OV511 camera support”选项,这样就在内核中加入了对采用OV511接口芯片的USB数字摄像头的驱动支持。1.2.4根文件系统移植linux文件系统体系对复杂系统
13、进行抽象化,是linux系统的核心组成部分,可以做为linux系统文件和数据的存储,也可以作为系统的配置文件或者应用程序调用所需的库文件。没有根文件系统的linux系统不能正确启动,所以为了存储引导程序、内核以及应用程序,需要创建合适的根文件系统。mzy2440根义件系统的制作:1.创建根文件系统主目录/nfsroot/rootfs:#make -p /nfsroot/rootfs#cd /nfsroot/rootfs#mkdir bin dev etc lib proc sbin sys usr mnt tmp var#mkdir usr/bin usr/lib usr/sbin lib/m
14、odules2.创建设备文件内核在引导时,设备节点console、null必须存在 #cd /nfsroot/rootfs/dev/ #mknod -m 666 console c 5 1 #mknod -m 666 null c 1 3 3.编译内核模块: #make module ARCH=arm CROSS COMPILE=arm-linux一安装内核模块到根文件系统 #make modules install ARCH=arm INSTALL MOD PATH=/nfsroot/rootfsbusybox为一个工具集合,根文件系统的许多命令均可以通过busybox编译来获得,像cd,
15、ls等。实际上,busybox是把许多工具集合到一个非常小可执行文件中,用户只要使用命令就可以运行其中相应的服务。解压busybox,配置busybox。进入busybox setting-build options-选中Build busybox as a static binary静态链接,本系统中目标板没有这些库,故采用静态链接的方式。2 系统应用程序设计 该系统由USB视频采集模块,数据处理模块,图像显示模块3大部分组成,其中USB视频采集模块由USB摄像头,USB摄像头驱动程序两部分构成。数据处理模块由H.264编码库和采集传输应用程序组成。图像显示模块则由运行于windows之上的
16、解码显示程序充当。2.1基于Video4 Linux的USB设备视频图像采集Video4 Linux是Linux内核中支持影像设备的一组APIs,它配合适当的视频采集设备和相应的驱动程序,可以实现影像采集、AM/FM广播、频道切换等功能,因此它在远程会议、可视电话、视频监控系统中有着广泛的应用。图2-1图像采集流程图2-1是linux下视频图像采集流程。下面对本系统的视频图像采集程序进行简单的介绍。首先打开视频设备,该摄像头在本系统中对应的设备文件为/dev/v41/video,采用系统接口函数open,其中cam_fd是设备打开后返回的文件描述符。打开视频设备文件成功,则获取相应的文件描述符
17、;若打开失败,则返回错误信息。接着,获取视频设备属性,调用ioctl函数获取video_capability中的信息,成功后读取vd-capability的各分量;获取video-picture中的信息,成功后读取视频设备中图像各属性。初始化channel ,最后调用系统调用函数close(vd-fd)关闭设备。2.2 H.264压缩算法的移植与优化摄像头抓拍得到的图像数据量很大,有必要对其压缩,才能在网络中顺畅传输。本系统选用H.264编码标准对采集的图像进行压缩。H.264标准是一个新的视频编码标准,具有高压缩比、高图像质量、良好的网络适应性等特点。结合本系统平台S3C2440处理器,采用
18、了交叉编译器是cross-4.3.2, linux操作系统软件开发平台。H.264移植主要包括两个方面的工作,一是函数库的移植,二是Makefile文件的修改。经过代码移植可以获得在ARM上初步运行的代码库,再结合ARM自身的硬件特性,有必要对其进行进一步的优化。对ARM代码可以有二个层次上的优化:项目层次的优化,算法层次的优化以及指令层次的优化。本文结合系统硬件软件环境在项目层次上进行了优化,它是对整个项目的整体优化。第一,在编译链接整个项目生成ARM代码的时候,可以对编译选项进行优化,比如-g为全符号调试。使用了这个选项调试生成的代码有很多符号信息,这样的程序效率比较低。-O选项后面跟的数
19、字越大,编译时对代码优化的程度越高;第二,对程序中冗余的程序代码进行适当删除,比如与本方案无关的多参考帧以及运动估计这些部分;第二,可以合理使用循环和分支结构,固然循环可以减少代码的存储空间,但是程序本身也带来了运行开销,当循环体本身的运行开销大于其内部的运行开销时,展开循环体将更使程序的得到一定程度的优化。2.3视频采集与编码的同步要实现视频采集,又要实现编码、传输以及处理需要花费比较长的时间,采取单线程响应会限制视频采集性能及整个监控的实时性。多线程程序作为一种多任务、并发的工作方式能够提高应用程序响应,改善程序的结构。为了提高效率,实现实时监测,本系统采用多线程机制来解决视频采集模块与编
20、码模块等的同步问题,提高系统的实时性。这里简单介绍一下视频采集和编码同步问题。首先开辟来两个缓存区,创建图像采集和图像编码(图像处理)线程,当采集满缓存区后,改变线程的等待条件,释放被阻塞的编码线程,编码线程开始对缓存区的数据进行编码。与此同时,采集线程程序把采集到的数据转到另外一个缓存区。这样,两个线程交替使用两个缓冲区,达到采集和编码同步,节省了等待时间,大大提高效率。基于本系统的硬件平台,两片SDRAM为64M,设置每个缓存的大小为1OMB。下面简要介绍一下主要用的函数结构以乃同步的实现过程:/*设置一块缓存区*/struct cam_ data int cam_ mbufBUF_ SI
21、ZE ; /*缓存区数绍一*/ pthread-mutex_t lock; /*互斥锁*/ int wpos,int rpos ; /*写与读的位置*/ pthread_cond_t notempty ; /*缓冲区非空时的标志*/ pthread_cond_t notfull ;/*缓冲区没满的标志*/ ;/*初始化缓存区*/void init(struct cam_ data * c) pthread_mutex_t_init(&c-lock,); /*以动态方式创建互斥锁*/ pthread_cond_init(&c-notempty); /*初始化notempty条件变量*/ pthr
22、ead_cond_init(&c-notfull,);/*初始化notfull条件变量*/ c-rpos=0; c-wpos=0 ; 图像采集线程read_video实现如下:void *read_video (struct cam_data * c , int data) pthread_mutex_ lock(&c-lock); /*获取互斥锁*/ while(c-wpos+l)%BUF_SIZE=c-rpos) /*等待缓存区非满信/-*/ pthread_cond_wait(&c-notfull,&c-lock); capture(int data,); /*视频采集,*/ c-cam
23、_mbufc-wpos=data ; c-wpos+; if (c-wpos=BUF_SIZE) c-wpos=0; pthread_ cond_ signal(&c-notempty); /*设置状态信号*/ pthread_mutex_unlock(&c-lock); /*获取互斥锁*/*图像处理线程*/void *process(struct cam_ data * c, int data)pthread_mutex_lock(&c-lock); /*获取互斥锁*/while(b-wpos=b-rpos) pthread_cond_wait(&c-notempty, &c-lock);/
24、*这里是一直询问b-notempty,空则无数据可处理,否则跳出阻塞*/ T264_ encode(int data); /*H.264压缩视频编码*/ data=c-bufb-rpos; c-rpos+; if (b-rpos=BUF_ SIZE) c-rpos=0; pthread_cond_signal (&c-notfull); /*释放互斥锁*/ pthread_mutex_unlock (&c-lock); 2.4传输模块的设计流式传输的实现需要合适的传输协议。由于Internet中的文件传输都是建立在TCP协议基础上的,但是TCP的特点决定了它并不适合于传输实时数据。一般都采用建
25、立在UDP (User Data Protocol,用户数据报协议)协议之上的RTP来传输实时的视频数据。在Linux中,TCP/IP协议族包括运输层、网络层、链路层。Socket是应用层与TCP/IP协议族通信的中间软件抽象层。它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。Linux四层网络模型如图2-2所示。图2-2 Linux四层网络模型UDP是与TCP相对应的协议。TCP和UDP都处于网络层之上,功能都属于保证网络层数据的传输。双方的通信无论使用TCP还是UDP都是要开放端口的。他们的关键区别在于
26、:TCP的传输是可靠的不实时的,UDP的传输是不可靠的但实时的。TCP在发送数据包前都在通信双方有一个二次握手机制,确保双方准备好,在传输数据包期间,TCP会根据链路中数据流量的大小来调节传送的速率,传输时如果发现有丢包,会有严格的重传机制,从而以保证数据包可靠的传输。UDP就没有传输校验机制,发送端有数据包就发送,不会去理会对方的承受能力和链路状况。所以说这里选择实时性强的UDP,而不选择关注可靠性的TCP。图2-3 Socket通信流程服务器端首先初始化,用的函数是socket(),然后与客户端绑定,用的函数是bind()接着用函数listen()对端口进行监听,并调用accept阻塞,一
27、直等待客户端来建立连接。同时,如果有个客户端也初始化一个socket(),并调用函数connect()连接服务器端口。如果服务器和客户端连接成功,当客户端发送数据请求,服务器端接收客户端发送来的请求,并处理以上请求,然后发送数据给客户端以回应,客户端读取服务器发送来的数据,关闭连接,这样整个一次交互完成。Socket通信流程如图2-3所示。2.5远程监测端测试在PC机和开发板之间连接好电源、串口、网线。采用NFS方式启动根文件系统,打开电源,启动u-boot,配置环境变量,ping通虚拟机,把制作好的内核通过tftp服务器下载到开发板内存31000000地址处:tftp 31000000 uI
28、mage,这样内核从此启动:bootm 31000000。连接USB摄像头,当系统起来时,在开发板连接USB摄像头,出现如下信息:New USB device found,”等信息,表明USB摄像头已经成功加载了驱动。运行视频采集应用程序:在开发板上运行应用程序#./server arm fastspeed.txt。在PC机端打开客户端程序LinuxClient.exe,插上摄像头,选择“视频设备”一“设备编号”一“#1”。监控界而如图2-4所示:图2-4监控界面3 小结本文主要设计了基于S3C2440处理器的嵌入式监控的硬件,搭建了基于linux操作系统平台下的软件环境。首先构建了系统的整体设计框架,分别设计了电源、时钟、复位电路、存储扩展以及外围接口电路。然后建立宿主机的交叉编译环境,并对linux操作系统的移植和内核的配置做了比较详细的介绍。软硬件平台搭建好后,就可以进行该视频监控平台下的视频采集、压缩和传输程序的设计。又提出了视频监控系统的整个软件框架,然后设计了基于V4L的视频采集和对视频数据的H.264的压缩,并对此压缩算法进行了优化,本文最后比较了UDP和TCP 协议,为本系统选择了实时性强的UDP作为本系统的视频实时传输协议,在此基础编写了Linux下socket通信程序。