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

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

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

并可以在用户内存空间修改

  ioctl(fd,VIDIOCSPICT,&spi);

  //设置要采集图片的参数:颜色深度、调色板类型、亮度、对比度、色度等

  ioctl(fd,VIDIOCSWIN,&win);

  //设置图片窗口大小,分别奖宽和高赋值予window.width,window.height

  ioctl(fd,VIDIOCMCAPTURE,&vmmap);

  //获取一帧图片

  ioctl(fd,VIDIOCSYNC,&mmap.frame);www.51kaifa.com

  //判断是否获取成功

  程序详细流程如下:

  

  图2图像采集程序流程

  成

  网眼V3000摄像头支持depth=24,palette=VIDEO_PALETTE_RGB24,输出图片为BMP格式,因此在程序中需要对BMP的格式进行定义。

  BMP格式包括位图文件头:struct tatBITMAPFILEHEADER

  位图信息头:struct tagBITMAPINFOHEADER

  彩色表:struct tagRGBQUAD,

  需要说明的是,BMP格式的图像数据阵列存储的扫描行是由下往上存储的,即图像第一个像素在左下角,最后一个像素在右上角,因此在读取的时候要注意。

  (1)用read()方法获取图片,将图片数据直接读到用户内存空间,然后写入文件。

  read(fd,data,size); //将fd所指位置size大小的数据读写到data内存空间

  fwrite(&bf,14,1,fp); //BMP文件头信息写入文件

  fwrite(&bi,40,1,fp); //BMP位图信息头信息写入文件

  fwrite(buffer,ImageSize,1,fp); //图片写入文件

  (2)用mmap()内存映射方法,需要ioctl(fd,VIDIOCGMBUF,&mbuf)获取缓冲区的帧信息,调用mmap()函数把设备文件映射到内存区,这样就可以把读到的信息,读写到文件里。内存映射法加速了I/O的访问速度,它使得各进程指向一块共享内存空间,各进程可以随时进行访问,因此内存映射获取图片的方法速度要比read()方法快一些。

  //设置图像水平和垂直分辨率及、彩色显示格式

  vmmap.height=height;

  vmmap.width=width;

  vmmap.format=VIDEO_PALETTE_RGB24;

  //调用mmap进行内存映射

  buffer=mmap(0,buf.size,PORT_READ|PORT_WRITE,MAP_SHARD,fd,0);

  picture.depth=24;

  ioctl(fd,VIDIOCSPICT,&picture)

  //采集图像

  if(ioctl(fd,VIDIOCMCAPTURE,&vmmap)《0)

  { www.51kaifa.com

  perror("VIDIOCMCAPTURE");

  return 0;

  }

  //判断采集是否完成

  if (ioctl(fd,VIDIOCSYNC,&buf)《0)

  perror("VIDIOCSYNC");

 

  4 总结

  在图像采集过程中,因为BMP格式的特殊原因,用read()方法采集图片是倒立的,因为其扫描行是自下往上存储,因此在将图片写入文件时,可以自下往上写入,读出来的图片将是正立的;或者另行编写代码将BMP文件转过来。具体方法可以参考BMP文件格式。完成图像采集工作后,配上无线上网设备,将图片传至Internet,将形成一个实时监控系统或者远程数据采集系统,可扩展到较广的应用范围。

  本文作者创新点:基于无MMU的ARM7的数据采集应用较少,大部分相关开发都是建立在高端的ARM9基础上。建立节约型社会的今天,能使用规格和价格较低的设备开发同样的产品,也让其有较广的应用前景和市场。

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

网站地图

Top