历史上的今天
返回首页

历史上的今天

今天是:2025年02月19日(星期三)

正在发生

2018年02月19日 | 基于ARM的嵌入式USB图像采集与显示方案

2018-02-19 来源:eefocus

  引言

  目前市场上大部分的图像采集与处理系统是基于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 进行人机界面的设计能够极大地节省开发成本和周期。本方案经推广可用于工业控制、智能交通、小区监控等领域。


推荐阅读

史海拾趣

Centellax Inc公司的发展小趣事

Centellax深知人才是公司发展的核心动力。因此,公司一直致力于打造一支高素质、专业化的团队。通过招聘优秀的研发、销售、管理等人才,为公司的长期发展提供有力的人才保障。

在团队建设方面,Centellax注重培养员工的团队协作精神和创新能力。通过定期举办团队建设活动、培训课程等,提升员工的凝聚力和归属感。同时,公司还鼓励员工积极参与创新项目,为公司的技术进步和业务发展贡献智慧和力量。

FOX [Fox Electronics]公司的发展小趣事

面对物联网、5G通信和汽车电子等新兴技术的快速发展,Fox Electronics敏锐地洞察到未来市场的变革趋势。公司加大了对高频、低抖动和高精度时钟解决方案的研发力度,以满足新兴应用对时钟源的高要求。同时,Fox Electronics还积极布局汽车电子市场,开发适应汽车自动驾驶和车联网需求的专用时钟产品。通过不断创新和布局未来市场,Fox Electronics为自身的持续发展奠定了坚实基础。

请注意,以上故事均为虚构内容,旨在展示电子行业发展的某些方面和可能的趋势。实际上,Fox Electronics的具体发展历程和成就可能有所不同。

Altus Technology Inc公司的发展小趣事

在激烈的市场竞争中,Altus始终坚持品质至上的原则。公司建立了严格的质量管理体系,从原材料采购到生产过程的每一个环节都进行严格的控制和把关。此外,Altus还注重客户反馈和需求,不断优化产品和服务,以满足客户的个性化需求。这些举措使得Altus的产品在市场上赢得了良好的口碑和客户信赖,为公司的长期发展奠定了坚实基础。

Amperite Co公司的发展小趣事

Altus Technology Inc自成立以来,始终将技术创新作为公司发展的核心驱动力。在早期,公司研发团队通过不懈努力,成功开发出了一款具有革命性的芯片,这款芯片在性能和功耗上均优于当时的同类产品。凭借这一技术突破,Altus在市场上迅速获得了一席之地,并吸引了大量合作伙伴和投资人的关注。随着技术的不断迭代和升级,Altus逐渐在电子行业中树立了技术领先的形象,并持续推出了一系列创新产品,巩固了市场地位。

Hoffman_Enclosures__Inc.公司的发展小趣事

Hoffman在追求企业发展的同时,也积极履行社会责任,致力于实现可持续发展。公司注重环保和节能,不断推出绿色、低碳的产品和技术。同时,Hoffman还积极参与公益事业,通过捐款、志愿服务等多种方式回馈社会。这些举措不仅提升了公司的社会形象,也促进了企业与社会的和谐共生。

以上五个故事展示了Hoffman Enclosures, Inc.在电子行业中的发展历程和关键节点,每个故事都体现了公司在技术创新、市场拓展、产品定制、标准制定以及社会责任等方面的努力和成就。

Holtek(合泰)公司的发展小趣事

CMOS Sensor Inc公司起源于硅谷,由一群热衷于光电图像采集技术的工程师创立。他们看到了光电图像采集技术在多个领域的巨大潜力,于是决定投身于这一行业。在创立初期,公司面临着资金短缺、市场竞争激烈等诸多挑战。然而,凭借着对技术的执着和不懈努力,CMOS Sensor Inc公司逐渐在市场中站稳了脚跟。

问答坊 | AI 解惑

2010年汽车导航销量过千万台

因城市建设的加快、汽车拥有率的提高、道路的拓展、交通系统日益复杂等因素,导航产业在全球兴起。在各种导航应用中,汽车占据最大的份额。全球汽车导航仪的市场销量以差不多每年都比上一年增加100万台的数量持续增长,至2005年总的年销量达到740万 ...…

查看全部问答>

关于EVC中软键盘的使用问题。

我现在在EVC4.0,PB4.2下开发一个PDA软件, 两个问题: 1,已经实现当对话框的编辑框获得焦点时弹出软键盘,在按软键盘的ESC键时,软键盘退出了,此时整个对话框也自动关闭了,请问能不能只退出软键盘? 2,在软件中调用系统对话框时(比如CFileD ...…

查看全部问答>

最近帮朋友做了一个视频2入9出分配器

最近帮朋友做了一个视频2入9出分配器.最初设计的原理图如下图1.信号切换我用的是CD4066.在网上我也找到相关的例证了.可是在面包板上我发现CD4066开关的入和出的电阻很小,即使刚没有焊到PCB上,直接测量CD4066的1/2或3/4脚间电阻也不大.结果就是不论C ...…

查看全部问答>

看看这样的应用创新设计思路如何?

现在各种电子产品越来越多样化,在大家开始接受、喜欢这些功能的同时,怎样整合资源,实现多种产品功能一体化,越来越受到关注。   我前不久在一个展会上看到深圳一家叫芯海科技提供的低功耗电子秤芯片方案可以做到静态功耗低至1微安级,方 ...…

查看全部问答>

正在读STM32的datasheet感觉写得挺好,很详细。

芯片设计也考虑得很全面和方便使用,挺好。另外不知道你们的datasheet有没有出勘误的?能否提供个链接?看看下面这两个图片(RM0008 - STM32 Reference Manual (Oct 2007).pdf):…

查看全部问答>

*T1PER赋值的问题

我用的是2406,用C编程序。 电机变频调速时,需要改变定时器的周期,也就是 载波周期。可是我把计算得到的周期值赋给*T1PER 时,T1PER的值老是0。我发现直接赋值没问题,比如 *T1PER=925; 如果定义一个变量,比如unsigned int period=800; 然 ...…

查看全部问答>

求助:关于引脚辩认

我刚申了一片F247,是正对凹坑从左侧逆时针数起的第1个脚为1脚,还是正对字从左侧逆时针数起的第1个脚为1脚?我看网上有些是正对凹坑又有些是正对字,我被搞糊涂了。还有如果以凹坑为参考标准,芯片上有三个凹坑,是以哪个凹坑为准呢?…

查看全部问答>

【TI原创】基于LM3s811的数码相框实现

   采用SD卡的形式,从SD卡读取取模软件转换好的pic文件,然后通过3.2寸液晶屏显示出来,SD是在液晶屏背后的,LM3S811采用的就是原来EEWORLD送的,采用的文件格式是FAT格式, SD卡部分简介  该项目是我暑假时候学习FAT时候用的,下 ...…

查看全部问答>

学习Hercules 从_c_int00了解Hercules的初始化过程!

在IAR工程项目配置中 Linker/Library/Override default program entry Entery symbol 中 填入 _c_int00   在download and debug  后就直接跳到右边 _c_int00  函数 该函数与 “Initialization of the TMS570LS ...…

查看全部问答>