微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 基于S3C44B0开发板的图像采集方法研究

基于S3C44B0开发板的图像采集方法研究

时间:04-29 来源:互联网 点击:

  1 引言

  Linux嵌入式系统,具有高性能、低功耗、体积小、可靠性高、源代码开放等优点,逐渐被越来越多的人认可并使用。原先只有在PC机上实现的功能,如今也被移植到了更加方便的嵌入式系统上。在嵌入式多媒体开发中,视频采集、存储、处理是必不可少的环节。CMOS传感器USB摄像头以其低廉的价格和较高的性能,成为了图片采集首选工具。至于图像传输,传统的有线传输已经开始被无线网络传输所替代。这里就着重介绍一下,图像采集。

  2 软硬件平台

  S3C44B0是三星公司为手持设备推出的16/32位RISC处理器,总线结构为SAMBAII,速度可达75MHz,它使用ARM7TDMI内核,采用0.25umCMOS工艺制造。S3C44B0提供了丰富的内置部件,包括:8KB Cache和内部4MB Flash,8MB SDRAM,LCD控制器,2个具有握手功能的UART,4通道DMA,一个内部定时器,71个通用目的I/O端口,8个外部中断源, 8通道10-bit ADC,IIC总线接口,IIS总线接口,同步SIO接口和PLL倍频器,一个外扩USB HOST,接摄像头,将摄像头采集的图片信息存储到内存空间中。采用uCLinux操作系统,它是由Linux经过裁减后的微型Linux操作系统,它经编译压缩后的二进制文件只有700k左右,适合嵌入式开发环境使用。通常的在PC机上进行的软件开发模式不适用于嵌入式系统。因为嵌入式系统没有足够的系统资源来满足开发需要,因此在开发过程中,需要在PC机上建立一个交叉编译环境对程序进行编译、链接,然后将程序烧写入开发板运行。这里用到的交叉编译环境是arm-elf-tools-20030314.sh,只需在终端执行sh arm-elf-tools-20030314.sh即可安装好交叉编译环境。之后在该环境中进行开发,调试通过后,再经过编译,将程序烧写入嵌入式系统中运行。

  

  图1硬件平台结构图

  3 图像采集

  Linux 设备驱动一般分字符设备、块设备、网络设备三种类型[1]。而在Linux下要使用系统所挂接的外围设备,必需加载相应的驱动程序。这里采用的是网眼V3000摄像头作为图像采集设备,它采用的USB控制器为OV511,Linux操作系统支持该驱动模块。在编译uCLinux内核时,主要是经过配置内核、编译内核、生成镜像几个过程。进入uCLinux的kernel目录,在终端输入make menuconfig配置内核,进入usb support,选中USB OV511 Cameral support。保存退出后make dep建立依赖关系、make zImage产生镜像,编译完毕,将编译好的内核烧写入ARM板,则uCLinux系统就支持该摄像头模块。www.51kaifa.com

  3.1 Video For Linux[2]

  Linux操作系统内核自带了一套Video For Linux(V4L)程序接口。它是Linux中关于视频设备的内核驱动,支持包括视频捕捉卡、摄像头等设备。应用程序可以利用这个程序接口,使硬件设备与内核进行交互,从而实现采集图像的目的。V4L提供了一套比较完整的I/O操作接口,open、close、read、write、ioctl,内存映射功能和I/O通道的接口函数ioctl,并将它们定义在struct file_operations数据结构体中。当应用程序对设备文件进行诸如open等系统调用操作时,Linux内核将通过file_operations结构访问驱动程序提供的函数接口。V4L需要编译进内核,具体方法为在终端/usr/src/linux目录下输入make menuconfig,进入设置界面选中multimedia devices选项,选中Video For Linux,保存退出后,make dep、make image即可。目前较高版本的Linux操作系统都已经把V4L编译进了内核,不再需要重新编译。V4L中定义了许多结构体,包含了获取图片用到的所有属性,因此在程序头文件中,应该加入#include《linux/videodev.h》。www.51kaifa.com

  3.2 图像采集

  利用V4L进行图像采集,有两种方法,一种是read()[3]方法,直接进入缓冲区里读取图片信息;另一种方法就是mmap()方法,该方法是把设备内存映射到用户地址空间中,各进程可以共享该内存空间,加快了访问速度。

  Linux中摄像头属于字符设备,因此,可以把摄像头看作文件一样操作。首先打开摄像头设备,应用到了标准函数open(),并以读写方式打开设备文件[4]:

  int fd= open(dev_videodevice,O_RDWR);

  if(fd《0);

  {

  perror("open error");

  return(0);

  }

  ioctl(fd,VIDIOCGCAP,&cap);

  //读取摄像头设备信息,包括设备名称、支持分辨率、信号源属性等,使用printf函数即可输出查看各属性值

  ioctl(fd,VIDIOCGCHAN,&cha);

  //读取摄像头通道参数,可以不设置

  ioctl(fd,VIDIOCGPICT,&pic);

//获取缓冲中设备参数,包palette、depth等,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top