基于ARM11的图像采集系统设计
2013-06-29符多铎谭秋林王红亮王道胜
符多铎,谭秋林,王红亮,王道胜
(中北大学仪器科学与动态测试教育部重点实验室电子测试技术国家重点实验室,山西 太原 030051)
随着科学技术的发展,图像采集与处理技术的应用越来越广泛。设计能够实现图像采集与图像处理一体化、结构紧凑并能有效降低成本的专用图像处理系统,将具有很大的市场应用前景。如果采用计算机作为主处理器,用PCI或其他总线接口来实现图像采集,虽然图像数据采集的实时性能得到保证,但系统的体积大,整体结构复杂,不便于应用到便携式环境中[1]。但如果采用单片机或FPGA这类微处理器来代替计算机,这时图像数据采集的实时性又难以实现,从而导致系统的整体性能降低。近年来,随着嵌入式技术的发展,ARM处理器运算的能力不断地增强以及处理图像的技术不断地提高,基于ARM的图像采集广泛地被用于各个领域[2-5]。本系统采用S3C6410作为处理器,实现了基于ARM11实时对摄像头图像进行采集,并增强了图像采集的性能。
1 系统组成
本系统硬件平台主要是ARM11开发板加上一些辅助性的外围设备,用到的外围设备主要有网络端口、CMOS摄像头等。开发板采用的是韩国三星公司的S3C6410处理器,该处理器功能强大,采用ARM1176JZF-S的核,包含16 kbyte的指令数据Cache和16 kbyte的指令数据TCM。使用的摄像头是OV9650摄像头,这款摄像头采用 CMOS 图像传感器,支持 YUV,RGB565,RGB555,GRB,RAW RGB等多种输出格式,全部可以通过寄存器来设置。本方案主要用到RGB输出模式,OV9650主要通过PCLK时钟与HREF来控制8 bit并行数据的传输。
平台的软件系统采用嵌入式Linux系统,它是源码开放的嵌入式操作系统,支持多任务,具有完备的TCP/IP协议栈并支持多种文件系统[6]。另外Linux系统能够方便地进行移植和内核定制,也使得本系统实现起来较为方便和简单,如Video4Linux2内核应用编程接口函数,能实现对OV9650摄像头单帧图像的采集,并保存成文件供进一步处理。
系统组成如图1所示。
图1 系统组成框图
2 Linux系统平台搭建
往开发板中烧写嵌入式Linux操作系统的具体的操作流程如下:
1)打开软件SD-Flasher.exe烧写软件,将FAT32格式的SD卡连入计算机,将要烧写的u-boot烧写到SD卡中。利用串口调试软件dnw来访问开发板,并将u-boot文件拷贝到开发板的nandflash中。点击serial port/transmit,如图2 所示。
图2 dnw软件菜单选项(截图)
2) 选择文件“u-boot_nand_ram256.bin”,打开后将Linux内核烧写到NandFlash里面。
3)接下来将UBIF文件系统拷贝到开发板中,选择文件 rootfs_qtopia_qt4-mlc2.ubi,打开,这样就完成了将文件系统烧写到NandFlash中,如图3所示。
图3 dnw软件选择文件系统相关文件(截图)
4)重新启动开发板,这样就可以进入Linux系统了。
3 应用程序的编写
3.1 下位机服务器端程序的编写
下位机服务器端程序流程如图4所示。
图4 下位机服务器端程序流程图
首先,打开OV9650摄像头设备,在/dev下会有设备/dev/video0,打开设备/dev/video0,通过ioctl函数即可以对摄像头设备进行操作,将采集到的图像传递给socket网络服务器端口,socket套接字将数据发送到网络端口上,本设计网络端口号设为8888。
本设计中图像采集主要是靠Linux中视频设备内核驱动Video4Linux2来实现的。在Linux中,访问视频设备可以像访问普通文件一样进行读写,摄像头在/dev/video0下。
Video4Linux2在本设计中用到的结构体及其说明如下:
本设计用到命令标识符及其功能说明如下:
Video4Linux2下视频编程的流程如下:
1)打开视频设备;
2)通过ioctl函数查询驱动功能;
3)通过ioctl函数获取设备的输入;
4)通过ioctl函数查看当前设备是否有输入输出数据;
5)通过ioctl函数获取并设置帧参数;
6)通过ioctl函数开始采集数据。
关于socket服务器端TCP协议编程如下:
下面几个函数是本程序中用到的socket API,这些函数都在 sys/socket.h 中。
1)int socket(int family,int type,int protocol);//打开网络通讯端口
2)int bind(int sockfd,const struct sockaddr*myaddr,socklen_t addrlen);//将参数sockfd和myaddr绑定在一起,使sockfd这个用于网络通讯的文件描述符监听myaddr所描述的地址和端口号
3)int listen(int sockfd,int backlog);//listen()声明sockfd处于监听状态
4)int accept(int sockfd,struct sockaddr*cliaddr,socklen_t*addrlen);//三次握手完成后,服务器调用accept()接受连接
服务器程序结构为:
整个服务器程序是一个while死循环,每次循环处理一个客户端连接,通过connfd进行通信,然后关闭connfd断开连接,而不关闭listenfd。accept()成功返回一个文件描述符,出错返回-1。
3.2 上位机客户端程序的编写
上位机客户端程序流程如图5所示。
图5 上位机客户端程序流程图
打开系统本身自带的framebuffer,并进行初始化,利用内存映射将framebuffer映射到内存上以便以后对采集到的图像进行操作。framebuffer是Linux内核当中的一种驱动程序接口。framebuffer机制模仿显卡的功能。用户可以将framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,而写操作可以立即反应在屏幕上。这种操作是抽象的,统一的。主要利用open函数来打开文件,ioctl函数来找出framebuffer显示的边界以及framebuffer显示像素的位数等,mmap函数来进行内存映射。
打开CMOS摄像头设备并且进行初始化,确定采集到数据的格式,本设计将采集到的数据自动转换为RGB565格式,这样传输时对于数据进行处理也会比较简单。
通过socket网络编程接收采集到的数据给上位机,是RGB565格式的,通过函数RGB565to32将16 bit格式的数据转换成在计算机上可显示的32 bit格式,之后在计算机上将图像通过内存映射的方法将图像显示出来。
4 实验结果及分析
硬件实物如图6所示。
图6 实物图示
启动开发板,将程序拷贝到开发板里,通过计算机控制开发板,执行服务器端的程序。然后在PC机上转换到命令行模式,按“s”保存图片。保存的图片如图7所示。
图7 采集的图像
在图像采集领域,利用ARM微处理器来控制图像传感器进行图像采集,有其他微处理芯片所不能达到的优势。加之,可以很方便地在ARM开发板上搭建代码全公开的嵌入式Linux操作系统,这样使得基于ARM的图像采集系统在今后的图像采集领域会有更大的发展。
[1]胡志海,王德君,赵巧云,等.基于SOPC的便携式智能图像采集系统设计[J].仪器仪表学报,2010,31(2):371-376.
[2]刘攀,王红亮,孟令军.基于FPGA的数字图像采集存储系统的设计[J].电视技术,2010,34(6):32-34.
[3]刘珂含,何培宇,关胜平,等.基于TMS320VC5509A的图像采集与识别系统[J].四川大学学报:自然科学版,2008,45(1):48-52.
[4]严新忠,陈雨.基于嵌入式ARM的图像采集与传输设计[J].研究与开发,2009,28(11):57-59.
[5]刘红喜,李长江,孙俊喜.基于DSP的图像采集及处理系统的设计与实现[J].电子技术与应用,2009(2):22-26.
[6]王刚,毛剑飞,田青,等.基于ARM11的无线视频监控系统[J].计算机系统应用,2011,20(8):18-22.