基于ARM的嵌入式USB图像采集与显示系统

2011-10-23 08:50:47来源: 现代显示

  摘要:基于ARM9 处理器和嵌入式Linux 操作系统,文章研究了视频图像采集与显示的一般方法。以USB 摄像头采集图像为例,介绍了Linux 系统下基于Video4Linux 进行视频图像采集的一般过程,并且最终通过Qt/Embedded 编写的图形界面将采集到的视频图像在LCD 上实时地显示出来。

引言

  目前市场上大部分的图像采集与处理系统是基于DSP 芯片的,这种图像采集与处理系统成本高、功耗高、体积约束等特点并不适用于一些简单的应用。随着USB 摄像头的普及和基于ARM 的嵌入式芯片的快速发展,将二者结合的便携性越来越受人们欢迎。本文介绍了一种基于三星S3C2440A 芯片的嵌入式USB 摄像头图像采集与显示方案,该方案具有良好的可移植性和扩展性,并且成本、大小和实时处理都能够满足市场需求。

1 系统架构

  系统通过当前市场上应用最广泛的中芯微公司生产的zc301p 芯片的USB 摄像头进行图像采集,然后将图像信息传送到ARM 芯片中进行处理,最终通过基于Qt/Embedded 编写的图形显示程序在LCD 上实时显示。系统的整体架构如图1 所示。

 

2 视频图像采集

  系统采用中芯微公司生产的zc301p 芯片的USB 摄像头作为图像采集设备,并介绍了基于Video4Linux 编程协议进行视频图像采集的一般过程。

  2.1 USB 摄像头驱动

  Linux 内核能够很好地支持OHCI(开放式主机控制接口协议),并且能够很好地支持包括OV511系列摄像头在内的各种各样的USB 设备,但是并不包括zc301pUSB 摄像头。直到后来2.6.27 版本左右的内核中才增加了针对zc301 系列芯片的驱动,统称为Linux UVC.本文采用的是Linux2.6.32.2 版本内核,只需要对内核进行简单的配置,就可以实现功能了。

  在配置菜单选项中,设备驱动是最重要的配置项。选择的配置项如下:

  Device Drivers - - - >

  Multimedia devices - - - >

  Video For Linux

  Enable Video For Linux API 1(DEPRECAteD)

  Video capture adapters - - - >

  V4L USB devices - - - >

  USB Video Class (UVC)

  UVC input events device support

  GSPCA based webcams - - - >

  ZC3XXX USB CAMEra Driver

  USB ZC0301 [P]Image Processor and Control

  Chip support

  现在,内核被配置成可以支持Video4Linux 的视频接口,并且加入了支持zc301pUSB 摄像头的驱动程序。

  2.2 基于Video4Linux 的视频图像采集程序设计

  Video4Linux(简称V4L)为目前市场常见的电视捕获卡和并口及USB 口的摄像头提供统一的编程接口。在Linux 内核中它为用户空间提供统一的编程接口,V4L 分为两层:底层是音频和视频设备驱动程序的内核;上层为系统提供一些API 接口信息。视频图像采集流程如图2 所示。

  (1)打开视频设备。

  在Linux 中视频设备是被作为设备文件来执行的,本文USB 摄像头的设备文件名为/dev/video0.

  int my_v4l_open (char*dev,my_v4l_STruct*vd) 函数用于打开视频设备并初始化摄像头设备,该函数调用open 函数可以读设备文件,成功返回设备描述符,失败返回- 1.主要程序代码如下:

  int my_v4l_open(char*dev,my_v4l_struct*vd){

  if((vd- >fd=open(vd- >videodevice,O_RDWR))= =- 1){

  printf(“ERROR opening V4L interface”);

  exit(1);}

  ……}

  (2)读设备信息。

  int my_v4l_get_capability (my_v4l_struct*) 函数的功能是读取设备基本信息, 它利用ioctl(vd_fd,VIDIOCGCAP,&(vd- >capability) 来读取有关摄像头的信息。该函数成功返回后将这些信息从内核空间拷贝到用户程序空间capability 各成员分量中,使用printf 函数就可得到各成员分量信息。具体如下:

  int my_v4l_get_capability(my_v4l_struct*){

  if(ioctl(vd- >fd,VIDIOCGPICT,&(vd- >capability))<0){

  printf(“error:v4l_get_capabilityn”);

  exit(1);}

  return 0;}

  (3)视频图像采集。

  本文通过mmap 方式来采集视频图像信息。为了获得映射的帧缓冲信息,my_v4l_mmap_init(my_v4l_struct*)函数需先初始化缓冲区,并进行内存与缓冲区的绑定,其中函数mmap 用于将文件fd与video_mbuf 绑定实现映射,函数mmap()返回值是系统实际分配的起始地址。函数my_v4l_mmap_init()的部分代码实现如下:

  void my_v4l_mmap_init(my_v4l_struct*vd){

  ……

  ioctl(vd- >fd,VIDIOCGMBUF,&(vd- >mbuf));// 初始化video_mbuf 以得到所映射的buffer的信息

  vd- >pframebuffer= (unsigned char*)mmap (0,

  vd- >videombuf.size,

  PROT_READ|PROT_WRITE,MAP_SHARED,vd- >fd,0);

  /* 把文件fd 与video_mbuf 绑定,实现映射*/

  vd- >mmapsize=vd- >videombuf.size;

  vd- >vmmap.height=vd- >hdrheight;

  vd- >vmmap.width=vd- >hdrwidth;

  vd- >vmmap.format=vd- >formaTIn;

  vd- >vmmap.frame=0;

  ……}

  然后利用驱动程序的ioctl () 函数的VIDIOCMCCAPTURE 和VIDIOCSYNC 命令来获取图像。其中ioctl (vd- >fd,VIDIOCMCAPTURE,&(vd- >mmap)) 开始一帧图像的采集,是非阻塞的;ioctl(vd- >fd,VIDIOCSYNC,&frame)用于判断一帧图像采集过程结束与否,frame 是当前采集的帧的序号。

  采集工作结束后调用munmap 取消文件fd 与video_mbuf 的绑定。

  munmap(vd- >map,vd- >mbuf.size);

  (4)关闭设备在视频采集完成后,必需关闭视频设备。

  close(vd- >fd);

3 基于Qt/Embedded 图像显示程序的编写

  基于嵌入式Linux 常见的GUI 系统有MiniGUI、MicroWindows、OpenGUI和基于Framebuffer[5]的Qt/Embedded[4].Qt 是诺基亚开发的一个跨平台的C++ 图形用户界面应用程序框架,它提供给应用程序开发者建立艺术级的图形用户界面所需的功能,并且是完全面向对象的,很容易扩展,允许真正的组件编程。正是基于以上优点,本文采用Qt/Embedded 开发平台,并将基于Qt 的图形界面Qtopia 移入我们的文件系统中。

  为了避免由于图像数据量大而在目标板上显示闪烁的问题,本文采用双缓冲技术实现采集图像显示,采用的是QPixmap 对象。QPixmap 是Qt 为图像处理提供的类,主要用于图像的绘制。实现双缓冲时,先把要显示的内容绘制在这个QPixmap pixmap 对象上,然后再用一步操作把pixmap 绘制在屏幕上。基于Qt 图像显示及辅助框线绘制的部分代码段如下:

  QPixmap pix (width (),height ());// 定义一个QPixmap 用于在上面绘制图像及框线

  QPainter p(&pix);// 定义绘制工具

  QPainterQPen pen (yellow,3,DotLine);// 定义一个画笔的属性,如颜色、粗细、线条样式

  p.drawImage (0,0,img);// 把摄像头采集到的图像绘制到QPixmap 上

  p.setPen(pen);// 设置画笔属性

  p.moveTo(50,330);// 设置画笔笔尖起始位置

  p.lineTo(150,50);// 开始绘制框线

  p.lineTo(490,50);

  …略

  p.end();// 在QPixmap 上的所有绘制任务结束

  p.begin(this );// 准备把QPixmap 绘制到屏幕上

  p.drawPixmap (0,0,pix);// 绘制QPixmap 到屏幕操作,图像显示到LCD 上

  图像数据的连续采集和显示是通过定时器实现的,QTimer 类提供了定时器信号和单触发定时器。设置定时启动触发周期,每当定时器时间到就触发一个定时器事件,在事件中调用VIDIOCMCAPTURE 函数完成对图像的采集,并通过QPixmap 类将图像显示到LCD上。至此就可以通过基于Qt 编写的图形界面程序,将USB 摄像头采集的视频图像在LCD 上实时显示。

4 结论

  本文基于ARM9 处理器和嵌入式Linux 操作系统,详细介绍了一种USB 摄像头图像采集与显示的通用方法。Linux 代码完全开源,系统具有良好的移植性,可方便地进行各种扩展,采用Qt 进行人机界面的设计能够极大地节省开发成本和周期。本方案经推广可用于工业控制、智能交通、小区监控等领域。

 

关键字:嵌入式

编辑:鲁迪 引用地址:http://www.eeworld.com.cn/afdz/2011/1023/article_4112.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部
嵌入式

小广播

独家专题更多

富士通铁电随机存储器FRAM主题展馆
富士通铁电随机存储器FRAM主题展馆
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 
走,跟Molex一起去看《中国电子消费品趋势》!
走,跟Molex一起去看《中国电子消费品趋势》!
 
带你走进LED王国——Microchip LED应用专题
带你走进LED王国——Microchip LED应用专题
 

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 视频监控 智能卡 防盗报警 智能管理 处理器 传感器 其他技术 综合资讯 安防论坛

北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved