DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 690|回复: 0
打印 上一主题 下一主题

[接口电路] 基于ARM的嵌入式USB图像采集与显示

[复制链接]
跳转到指定楼层
楼主
发表于 2012-1-16 18:49:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

                      摘要:基于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))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 进行人机界面的设计能够极大地节省开发成本和周期。本方案经推广可用于工业控制、智能交通、小区监控等领域。
            
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-5-11 04:28 , 耗时 0.094258 秒, 18 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表