基于S3C44B0开发板的图像采集方法研究
并可以在用户内存空间修改
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基础上。建立节约型社会的今天,能使用规格和价格较低的设备开发同样的产品,也让其有较广的应用前景和市场。
uClinux S3C44B0 OV511 V4L 相关文章:
- 基于ARM-UClinux的无线家庭网关设计(04-29)
- stm32能跑linux吗(09-10)
- uC/OS和uClinux操作系统的区别(09-13)
- 用ARM和FPGA搭建神经网络处理器通信方案(07-19)
- ARM与神经网络处理器通信方案的设计实现(07-10)
- 基于ARM44B0x的信号发射机控制器设计(06-28)