刘聪娜,陈西曲
(武汉工业学院数学与计算机学院,湖北武汉430023)
基于Linux的图像处理系统的设计
刘聪娜,陈西曲
(武汉工业学院数学与计算机学院,湖北武汉430023)
提出一种基于Linux操作系统的图像采集系统方案。描述了系统硬件原理,介绍了软件设计过程:U-Boot移植、内核移植、根文件系统的构造及移植、应用程序编写。本设计可满足多种视频采集场合的需求。
图像处理;CMOS摄像头;系统移植
图像处理系统应用于许多方面,比如电脑摄像头、手机摄像头、电子视频、足球机器人、数码相机等等。随着人们对视频图像质量的要求越来越高,更期待能有更高采集质量和效率的产品问世。传统的视频处理系统一般采用专门的图像处理芯片,可以自动完成图像处理过程,但是系统通用性不强,开发周期比较长,而且不方便软件编程和升级,采集图像的效率会受到限制。因此本文提出了一种基于Linux的视频采集系统,解决了传统视频采集系统的升级困难、开发周期长,效率低等问题。首先本系统软件编程方便,开发周期比较短,因为只需要在操作系统上编写相应的应用程序即可,不像单片机要从头到尾地编写程序;其次本系统采集效率比较高,因为采用了嵌入式Linux操作系统,具有良好的实时性,能在规定的时间内完成特定的任务;此外本系统开发成本比较低,由于Linux源码都是开放的,因此在价格方面具有优势。
本文提出的视频处理系统主要由图像采集模块、图像处理模块、存储模块、程序运行模块和图像显示模块组成。图像采集模块由OV9650芯片和S3C2440的CMOS摄像头接口组成;图像处理模块由S3C2440处理器实现;程序运行模块由SDRAM实现;存储模块使用Nand Flash,用于存储烧写进的Bootloader可执行文件、内核映像、根文件系统映像、应用程序可执行文件;显示模块由LCD显示屏实现。硬件系统框图如图1所示。
图1 硬件系统框图
整个系统的工作原理是:由CMOS摄像头采集到的图片信息,经过S3C2440的摄像头接口处理后,分为两种格式传输,分别保存到SDRAM不同缓冲区中,其中一路为预览通道,图片格式为RGB656,读取该缓冲区数据,然后写到LCD显示屏的帧缓冲区,就可以直接预览显示图像;另一路为编解码通道,图片格式为YCbCr,主要是用于存储图片数据到Flash;本设计采用第一个预览通道传输数据,实现图片预览功能。
图像采集模块是本设计的关键性模块,OV9650芯片包括图像传感器阵列、时钟发生器、模拟处理模块、数字信号处理器、输出格式器、数字视频端口、SCCB接口几部分。将SCCB接口与开发板的I2C总线接口相连,通过编写软件设置OV9650的内部寄存器,可调节传感器的增益、饱和度、色调等参数。图片的输出格式采用8位YUY/YCbCr格式,所用到的信号包括:HREF(水平参考信号)、PCLK(像素时钟信号)、VSYNC(帧同步信号)、D2-D9(数据总线)RESET(复位信号)等。
S3C2440的canera接口将OV9650输出的8位YUY/YCbCr信号转换为RGB565和YCbCr两种格式,分两个通道逐帧保存数据。canera接口对外设备的信号主要有:CAM_PCLK(输入视频像素同步信号)、CAM_HREF(输入视频行同步信号)、CAM_VSYNC(输入视频帧同步信号)、CAMDATA[7-0](输入视频数据)、CAMCLKOUT(输出时钟)、CAMRESET(输出复位信号),这些信号分别对应的和OV9650的引脚相连接。原理图如图2所示。
视频采集系统开始工作,OV9650芯片的VSYNC、HREF、PCLK三个信号需相互配合,当VSYNC信号准备好(由高电平变为低电平)后要等待HREF信号;当HREF信号准备好后要等待PCLK信号;当PCLK信号准备好后才正式进行数据的采集工作,只有三者相协调传感器才能工作。而开发板camera接口,当从CAMDATA[7-0]接收完一个8位数据后,则产生一个CAM_PCLK信号;每接收完一行数据则产生一个CAM_HREF信号;每接收完一帧数据,产生一个CAM_VSYNC信号。
图2 图像采集模块原理图
显示模块LCD在Linux系统中采用帧缓冲的概念,可以把它看做显示设备的一个接口,我们不必关心物理的显示缓冲区是怎么样的,只要在编写应用程序的时候在显示缓冲区中与显示点对应的区域写入相应的颜色值,会自动的在屏幕上显示画面。
关于存储模块Nand Flash,我们在进行系统移植时,需要把Bootloader可执行文件、内核映像、根文件系统映像烧写到Nand Flash的不同分区中。Nand Flash有4个分区,分别存放Bootloader、Boot parameters、Kernel、Root filesystem 。如图3 所示。
图3 Linux系统分区
运行模块SDRAM就是我们平时所说的物理内存,Bootloader可执行文件、内核映像、应用程序的二进制代码都是被加载到SDRAM中运行的,事实上Linux采用虚拟内存的机制,这样每个进程所能访问的内存达到4G。
处理模块CPU的主要工作就是执行程序,采用流水线机制,分为取指、译码、执行三部分。此外,上面提到虚拟存储空间到物理存储空间的映射工作也是由CPU的MMU完成的。
软件设计分为系统移植和程序分析两部分。
嵌入式Linux系统移植可分为3部分:①引导加载程序Bootloader,比如本设计中用到的u-boot就是一种 Bootloader;②Linux内核,Bootloader会把启动参数传递给内核;③文件系统,包括应用程序以及程序运行所需要的库文件等内容。这部分要完成的任务是建立好软件开发环境,即烧写u-boot可执行文件、内核映像、根文件系统映像,然后就可以把编写的应用程序下载到开发板运行。以上三者启动过程可用图4表示。
图4 系统启动过程
由交叉编译工具编译后的代码才可以在开发板上运行,所以需要在PC机上安装交叉编译工具。可以下载交叉编译链压缩包,解压缩进行安装,如果安装成功,在虚拟机终端输入arm+Tab键命令,会出现交叉编译工具链,之后就可以用这些交叉编译工具编译后面的u-boot、内核、根文件系统、应用程序。如图5所示。
图5 交叉编译工具安装截图
2.1.1 u -boot移植
简单的说u-boot就是一段程序,当系统上电时它用于初始化硬件设备,传递内核参数,准备系统运行的软件环境,最后启动内核。
u-boot的移植需要下载压缩包在虚拟机中解压安装,然后用交叉编译工具编译,如果编译成功的话会在解压过的文件夹中生成u-boot.bin文件,之后就可以把u-boot.bin文件烧写到开发板的Nand Flash中。如图6所示。
图6 u-boot编译截图
2.1.2 内核移植
内核一方面负责与计算机硬件进行交互,另一方面为用户程序提供一个访问硬件的虚拟接口。同样需要在官网上下载内核源码压缩包,解压安装,然后配置、编译内核文件,编译成功后会在 linux-2.6.32.2/arch/arm/boot文件夹下生成可下载到开发板的uImage文件。如图7所示。
图7 内核编译截图
可以先利用tftp下载uImage文件到内存,再用nand write命令烧写到Nand Flash中。
2.1.3 制作移植根文件系统
文件系统是对一个存储设备上的数据进行组织的机制。Linux根文件系统包括的目录有:/bin存放用户使用的基本命令;/sbin存放系统使用的命令;/dev存放设备文件;/home目录等等。
首先在Linux下创建一个rootfs目录,作为根文件系统目录,接着在里面分别创建相应的子目录来完成根文件系统的制作,此外可以使用Bosybox工具来帮助创建bin目录、sbin目录 、usr目录、linuxrc文件,同样把下载的Bosybox工具包解压安装,然后进入解压后的 busybox文件夹,在终端执行make menuconfig命令,设置相应的选项,然后编译,可在rootfs目录下自动生成bin目录 、sbin目录 、usr目录、linuxrc文件。如图8所示。
图8 bin目录、sbin目录、usr目录和linuxrc文件生成截图
最后打包根文件系统,成功的话会生成可下载到开发板的rootfs.img文件。
2.2.1 设备驱动程序
设备驱动充当了硬件和应用软件之间的纽带,它使得应用程序只需要调用系统软件的API就可以让硬件完成要求的工作,本文主要介绍OV9650的设备驱动。应用程序、设备驱动、操作系统、硬件之间的关系如图9所示。
图9 应用程序、驱动程序、操作系统、硬件之间的关系
本文OV9650外设作为字符设备编写驱动程序,当编写应用程序的时候,需要对硬件(主要是摄像头和LCD屏)进行open、read、write、close等操作,这时候就需要进行系统调用,而系统调用的具体实现就由驱动程序的主体部分struct file_operations结构体的成员函数来完成。OV9650设备驱动程序主要涉及两部分。
①加载函数module_init()和卸载函数module_exit()
module_init()函数是驱动程序的入口函数,主要完成的工作包括:注册字符设备;初始化s3c2440 camera接口;调用 request_mem_region()函数为OV9650申请i/o内存;同时调用ioremap_nocache()函数映射i/o内存;初始化camera时钟等等。
相反module_exit()完成的主要工作包括:注销字符设备;调用iounmap()函数取消内存映射;调用release_mem_region()函数释放申请的内存等操作。
②struct file_operations成员函数
这一部分是驱动程序的主体,应用程序访问设备进行系统调用的工作原理是:驱动程序从内核读取应用程序传送给设备文件的数据,把读取的数据传给硬件设备,并从设备读取数据,返回给应用程序,从而实现应用程序对设备的操作。数据结构形式如下所示。
static struct file_operations cam_fops=
{
.owner:THIS_MODULE,
.open= :cam_open,
.release:cam_release,
.read :cam_read,
};
分别实现 cam_open()、cam_release()、cam_read()三个函数即可。
2.2.2 应用程序编写
CMOS摄像头和LCD显示屏在开发板上对应的设备文件是/dev/camera和/dev/fb0。编程思路是:首先打开/dev/camera和/dev/fb0,读取/dev/fb0设备的必要参数,通过这些参数计算出一帧数据所占用的字节数n,然后mmap函数映射n字节大小的空间到内存,最后在循环函数里循环进行读写操作,进行视频显示,最后关闭设备,程序流程图如图10所示。
图10 图像采集流程图
在虚拟终端用交叉编译工具编译应用程序,生成可在开发板上执行的文件,编译已成功,结果如图11所示。
图11 编译结果截图
首先使用export命令设置一下环境变量,配置交叉编译工具链的时候需要指定编译工具的路径,交叉编译工具在/usr/local/src/opt/FriendlyARM/Toolschain/4.4.3/bin目录下,这样就告诉程序,我们执行命令的文件就在这个目录里。
第一次执行ls命令,cam目录下只有一个cam.cpp源文件,当下一次执行ls命令,可看到cam目录下新增加了一个camera文件,就是可在开发板上运行的二进制文件,因为PC机上的Linux系统里没有OV9650芯片的设备文件,所以当执行./camera命令时,显示 cannot execute binary file,但把生成的camera可执行文件下载到开发板即可运行成功。
先把u-boot.bin文件、内核映像、根文件系统映像烧写到开发板,camera可执行文件才可下载到开发板运行,使用串口传输文件,串口的数据传输以串行方式进行,Linux系统通过串口终端设备文件来实现对串口设备的访问。首先需要对串口的参数进行设置,把PC机和开发板的串口互相连接好,我们使用Windows中的超级终端进行串口参数设置,设置结果如图12所示。
图12 串口参数设置截图
上电开发板,进入camera可执行文件所在的目录,在超级终端执行./camera命令后,系统即可进行图像采集工作。采集到的图像如图13所示。
图13 采集图像截图
程序的设计只能实现预览功能,还不能实现图像保存功能,如果要保存图像可以在编写应用程序时,设置数据传输通道为编解码通道,图片格式为YCbCr,把采集到缓冲区的图像数据读出来,进行压缩处理,存储到Flash中,这样可保存采集到的图像,此外还可以用QT做一个界面,可以设两个按钮,一个按钮为“拍照”,另一个按钮为“关闭”,这样便于控制摄像头的采集工作。
本文设计了一种基于嵌入式Linux的图像处理系统,首先分析了硬件的工作原理及主要模块的功能。然后进行了软件环境的搭建工作:u-boot的修改、编译和移植;内核映像的配置、编译和移植;根文件系统的制作、编译及移植。最后是软件部分,包括驱动程序和应用程序,最终实现了图像的采集功能。该系统可在手机等多种需要视频采集功能模块的产品中推广使用。
基于Linux的视频采集系统优点在于,采集效率比较高,此外引入Linux操作系统更加安全,Linux的内核与用户空间的内存管理是分开的,不会出现由于用户程序而引起系统崩溃的现象。
[1] Jonathan Corbet, Alessandro Rubini, Greg Kroah-Haetman.Linux设备驱动程序[M].魏永明,耿岳,钟书毅.北京:中国电力出版社,2009.
[2] Jonathan Corbet.LINUX 内核[M].陈莉君,张琼声,张宏伟.北京:中国电力出版社,2009.
[3] 宋劲杉.Linux C编程一站式学习[M].北京:电子工业出版社,2009.
[4] 杜华.LINUX编程技术详解[M].北京:人民邮电出版社,2007.
[5] 陈立伟,王桐,杨蕾,等.零基础嵌入式Linux C编程[M].北京:机械工业出版社,2010.
[6] 杜春蕾.ARM体系结构与编程[M].北京:清华大学出版社,2008.
[7] 谭浩强.C程序设计(第二版)[M].北京:清华大学出版社,2006.
Design of image processing system based on Linux
LIU Cong-na,CHEN Xi-qu
(School of Mathematics and Computer Science,Wuhan Polytechnic University,Wuhan 430023,China)
In the paper,a plan of image capturing system based on Linux operating system is proposed.The hardware principle of this system is described,and the software design process of this system is introduced including the U -boot and kernel transplant,the construction and transplant of root file system,and the compile of application program.The design has a good real-time character which can satisfy the requirements on many occasions of image capturing.
image processing;CMOS camera;transplant of system
TP 319
A
1009-4881(2011)04-0053-05
10.3969/j.issn.1009-4881.2011.04.014
2011-05-30.
刘聪娜(1985-),女,硕士研究生,E -mail:liucongna520@163.com.
陈西曲(1971-),男,副教授,E -mail:cxqdhl@yahoo.com.cn.
湖北省高等学校省级教学研究项目(2009253).