《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 基于Linux+ARM的多格式视频图像采集系统的设计
基于Linux+ARM的多格式视频图像采集系统的设计
2014年微型机与应用第21期
赵楠楠1,2 ,杨秀虎1
(1.辽宁科技大学 电子与信息工程学院,辽宁 鞍山 114051; 2.国家金融安全及系统装备工程技术研究中心,辽宁 鞍山 114051)
摘要: 设计了基于S3C2440微处理器的视频图像采集系统,详细分析了该系统的启动过程。在一块裸板上搭建起整个视频图像采集系统。结合V4L2技术完成了支持YUV、MJPEG图像格式的USB摄像头和支持RGB图像格式的CMOS摄像头的多格式视频图像采集系统。测试结果表明,该系统可以在LCD显示屏上动态显示多格式摄像头所采集到的视频图像,且视频图像具有清晰度高、流畅性好、稳定性强等特点,具有进一步推广使用的广阔前景。
Abstract:
Key words :

  摘 要: 设计了基于S3C2440微处理器的视频图像采集系统,详细分析了该系统的启动过程。在一块裸板上搭建起整个视频图像采集系统。结合V4L2技术完成了支持YUV、MJPEG图像格式的USB摄像头和支持RGB图像格式的CMOS摄像头的多格式视频图像采集系统。测试结果表明,该系统可以在LCD显示屏上动态显示多格式摄像头所采集到的视频图像,且视频图像具有清晰度高、流畅性好、稳定性强等特点,具有进一步推广使用的广阔前景。

  关键词u-boot与系统启动;V4L2;多格式视频图像采集;video2lcd

0 引 言

  当下随着多媒体技术、集成电子技术、计算机技术的高速发展,视频图像采集技术也不断发展,它的应用场合也更加广泛。尤其近年来,随着嵌入式技术的发展,ARM处理器运算的能力不断地增强以及处理图像的技术不断地提高,使基于ARM的图像采集广泛地应用于各个领域[1-4]。视频图像采集更是成为了研究热点。嵌入式这一技术的发展使得视频采集系统具有了体积小、成本低、性能高等特点,能够扩展到很多领域[5]。基于这样的背景,本文进行了一套有益研究。

  本系统采用三星公司S3C2440微处理器搭建一个全新的视频图像采集系统,包括分析改进u-boot源代码,使之支持所用JZ2440开发板,支持开发板的串口、网卡功能,支持Nand启动等,且大大简化冗余代码,编译出简洁高效的u-boot.bin文件,能够实现快速烧写和擦除,从而实现系统快速启动。在搭建好开发环境之后,结合V4L2技术分析数据采集系统流程,编写应用程序veido2lcd完成支持YUV、MJPEG图像格式的USB摄像头和支持RGB图像格式的CMOS摄像头的多格式视频图像采集系统,最后对系统进行测试和分析。

1 开发环境搭建

  1.1 系统软硬件平台

  视频图像采集系统最终是要移植到嵌入式系统的,所以要搭建嵌入式平台来完成交叉编译等工作,文中采用支持V4L2的Linux系统。硬件平台采用三星公司的ARM9开发板JZ2440,其硬件特性如下:

  CPU处理器: 16/32 bit S3C2440A;

  Flash存储器: 512 MB NandFlash,64 MB NorFlash;

  内存支持: 64 MB SDRAM,4 KB片内SRAM

  USB总线与接口: 1个USB Host,1个USB Slave;

  网卡支持: DM9000;

  LCD显示屏: 4.3英寸TFT LCD屏;

  摄像头支持: YUV格式的USB摄像头,MJPEG格式的USB摄像头,RGB格式的CMOS摄像头。

  1.2 系统交叉编译工具的安装

  Linux开发所用的交叉编译工具是arm-linux-gcc-4.3.2,设置环境变量:PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/4.3.2/bin"完成安装交叉编译工具链。

  它不能够适应现有硬件环境,需要对其进行如下修改:

  (1) 修改U-boot源代码以支持S3C2440开发板

  在单板相关的配置文件boards.cfg中添加:

  ssmdk2440 arm arm920t - samsung s3c24x0

  (2) 配置时钟参数以适应于S3C2440

  需要对CPU的MPLL进行设置,否则内存不能正常使用。在start.S里增加对MPLL的设置:

  ①设置CPU为异步总线模式;

  ②设置分频系数和MPLLCON寄存器将系统时钟频率设定为400 MHz。

  (3) 支持S3C2440的硬件配置

  在include/configs/smdk2440.h中去掉宏CONFIG_S3C2410,增加配置宏CONFIG_S3C2440以支持S3C2440的相关硬件配置,比如串口波特率正常。

  (4) 支持Nand启动

  由于Nand启动时只能复制最前面的4 KB代码到SDRAM,这要求重定位之前的启动代码应该少于4 KB。原来的代码在链接时加了"-pie"选项, 使得生成的u-boot.bin里多了"*(.rel*)"、 "*(.dynsym)"、导致编译出来的u-boot非常大,不能支持Nand启动,需修改代码来减小u-boot。

  ①去掉 "-pie"选项

  在arch/arm/config.mk:75:LDFLAGS_u-boot += -pie中去掉该行以减少代码。

  ②修改include/configs/smdk2440.h中的连接地址:

  #define CONFIG_SYS_TEXT_BASE 0x33f80000

  将链接地址改为0x33f00000,这是因为SDRAM大小为64 MB,它的基地址是0x30000000,尾址是0x34000000,在0x33f00000~0x34000000之间1 MB空间足够用来存放u-boot代码。

  ③修改start.S,实现代码的重定位,即上电后把NandFlash内前4 KB的代码复制到片内SRAM,然后由这4 KB代码实现将NandFlash上的u-boot代码复制到SDRAM上链接地址以0x33f00000开始的地方。

  (5) 支持DM9000网卡

  在smdk2440.h中增加宏定义define CONFIG_DRIVER_DM9000完成S3C2440对网卡DM9000的支持。

  将修改好的u-boot重新make,编译通过,生成新的u-boot.bin文件。

  以Nor方式启动开发板,通过tftp工具将编译好的u-boot.bin文件烧写到开发板,然后关闭开发板,拨为Nand启动方式重启开发板,启动后效果如图1所示,这样就完成了一个支持Nand启动,支持DM9000网卡的u-boot的移植。

001.jpg

2 视频图像采集系统设计

  2.1 Linux内核下的V4L2驱动框架

  在Linux系统下,通过VideoforLinux实现对Linux视频采集设备的支持通常将其称为V4L[6]。它是Linux内核中有关视频设备的驱动程序。Linux内核提供Video4Linux2 应用程序接口,在程序开发时首先是基于Video4Linux2 API函数来设计程序[7]。

  视频图像的采集流程如图2所示。

002.jpg

  首先使用open函数打开摄像头设备,以获取该摄像设备的文件描述符,接着调用摄像头设备的接口函数vidioc_querycap()来获取设备的参数信息,从而确定接入的是图像捕捉设备。由于V4L2所支持的视频格式有多种,而所接入摄像头设备支持YUV、MJPEG、RGB三种格式中的哪一种也是事先未知的,所以V4L2中包含对格式的一系列的操作,包括枚举、获得、测试、设置等接口函数,完成对摄像头设备所支持图像格式的获取、测试和设置工作。比如确定了摄像头为MJPEG格式之后,V4L2就要为视频流数据申请缓冲区并查询缓冲区信息。为了加快对I/O的访问速度,使用mmap()函数将摄像头相应的设备文件映射到内存区并且把获得的缓冲区通过函数vidioc_qbuf()放入队列中。准备工作完成之后通过执行vidioc_streamon()启动视频流数据的采集。这里使用poll机制等待数据的到来,有了数据之后就可以执行vidioc_dqbuf()函数从缓冲区队列中获取一帧视频流数据,当不再采集的时候就可以调用vidioc_streamoff()停止视频流的采集。

  2.2 应用程序video2lcd骨架

  要使视频数据显示到LCD显示屏上,需要将摄像头采集到的视频数据经过格式转换、缩放、合并、显示等操作才能最终显示到LCD显示屏上。整个过程的流程图如图3所示。

003.jpg

  ⑴数据格式的转换:由于LCD显示屏只能支持RGB一种格式,而摄像头采集到的数据有YUV、MJPEG、 RGB三种格式,故需要进行数据格式的转换(RGB格式不需要进行转换的)。函数static int Yuv2RgbConvert(PT_VideoBuf ptVideoBufIn, PT_VideoBuf ptVideoBufOut)用来把内存里的YUV图像转换为RGB图像。函数static int Mjpeg2RgbConvert(PT_VideoBuf ptVideoBufIn, PT_VideoBuf ptVideoBufOut)用来将内存里的MJPEG图像转换为RGB图像。

  ⑵图像的缩放:由于摄像头采集到的图像分辨率与LCD的分辨率并不吻合,为了得到清晰流畅的视频图像,需要进行图像大小的缩放。函数int picZoom(PT_PixelDatas ptOriginPic, PT_PixelDatas ptZoomPic) 用来实现这一功能。

  ⑶图像转入缓存:即将缩放后的图像转入FrameBuffer,使用函数intPicMerge(iTopLeftX, iTopLeftY, &ptVideoBufCur->tPixelDatas, PT_PixelDatas ->ptFrameBuffer)来完成。缓存Framebuffer中的数据就可以直接在LCD屏幕上显示。

  当完成以上工作后,video2lcd应用程序就编写完成,它能够将摄像头采集到的视频图像数据清晰流畅地显示在LCD屏幕上,同时支持YUV、MJPEG、RGB三种格式的视频图像的采集,支持多款USB摄像头的同时也支持CMOS摄像头。将交叉编译通过后的video2lcd传输到开发板的文件系统。

3 应用测试与分析

  以Nand方式启动开发板,首先将支持YUV格式的USB摄像头插到开发板的USB接口,这在串口界面执行命令:./video2lcd /dev/video0,回车之后就可以看到LCD显示屏上有视频图像了,晃动摄像头可见视频图像清晰流畅,以同样的操作分别将支持MJPEG格式的USB摄像头和支持RGB格式的CMOS摄像头接到开发板上,观察视频图像。图4即为USB摄像头采集到的MJPEG格式的视频图像以及CMOS摄像头采集到的RGB格式视频图像在4.3英寸LCD屏幕上的显示效果图,通过与笔记本上图像的对比可见,视频图像非常清晰且视频流畅。

004.jpg

4 结束语

  基于S3C2440微处理器和ov7740视频处理芯片搭建了嵌入式视频图像采集平台,为开发实现多格式视频图像的实时采集与传输提供了可行方案。采用嵌入式技术,使系统具有体积小、成本低、普适性高等特点。该方案具有广泛的应用价值。

参考文献

  [1] 刘攀,王红亮,孟令军. 基于 FPGA 的数字图像采集存储系统的设计[J]. 电视技术, 2010,34(6) :32-34.

  [2] 刘珂含,何培宇,关胜平,等. 基于TMS320VC5509A的图像采集与识别系统[J]. 四川大学学报:自然科学版, 2008,45(1):48-52.

  [3] 严新忠,陈雨. 基于嵌入式ARM的图像采集与传输设计[J].研究与开发, 2009,28(11) :57-59.

  [4] 刘红喜,李长江,孙俊喜. 基于DSP的图像采集及处理系统的设计与实现[J]. 电子技术应用,2009,35(2) :22-26.

  [5] 刘志华. 基于ARM和Linux的视频图像采集系统[J]. 微型机与应用, 2014,33(3):12-14,17.

  [6] 邹意然,王永威,赵龙. 嵌入式系统中USB摄像头的图像采集[J]. 微计算机信息, 2010,26(12-2):24-26.

  [7] COX A. Video 4 Linux programming [EB/OL]. [2014-08-04]http://www.redhat.com.


此内容为AET网站原创,未经授权禁止转载。