新闻中心

EEPW首页>嵌入式系统>设计应用> 基于ARM的嵌入式USB图像采集与显示

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

作者: 时间:2011-11-14 来源:网络 收藏

  (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);

 3Qt/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 编写的图形界面程序,将摄像头采集的视频图像在LCD 上实时显示。

  4 结论

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

linux操作系统文章专题:linux操作系统详解(linux不再难懂)

上一页 1 2 下一页

评论


相关推荐

技术专区

关闭