当前位置:首页 > 单片机 > 单片机
[导读]1 引言Linux嵌入式系统,具有高性能、低功耗、体积小、可靠性高、源代码开放等优点,逐渐被越来越多的人认可并使用。原先只有在PC机上实现的功能,如今也被移植到了更加方便的嵌入式系统上。在嵌入式多媒体开发中,视

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即可安装好交叉编译环境。之后在该环境中进行开发,调试通过后,再经过编译,将程序烧写入嵌入式系统中运行。

 

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系统就支持该摄像头模块。

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>。

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等,并可以在用户内存空间修改
ioctl(fd,VIDIOCSPICT,&spi);
//设置要采集图片的参数:颜色深度、调色板类型、亮度、对比度、色度等
ioctl(fd,VIDIOCSWIN,&win);
//设置图片窗口大小,分别奖宽和高赋值予window.width,window.height
ioctl(fd,VIDIOCMCAPTURE,&vmmap);
//获取一帧图片
ioctl(fd,VIDIOCSYNC,&mmap.frame);

//判断是否获取成功


程序详细流程如下:

 

网眼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)
{perror("VIDIOCMCAPTURE");
return 0;
}
//判断采集是否完成
if (ioctl(fd,VIDIOCSYNC,&buf)<0)
perror("VIDIOCSYNC");

单帧图片采集完毕,采集图片实验效果如下:

 

4 总结

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

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

参考文献:
[1]ALESSANDRO RUBINI .LINUX设备驱动程序[M].魏永明,等译.北京:中国电力出版社,2002
[2]Alan Cox.Video4Linux Programming. alan@redhat.com.2000
[3]K.Wall,等.GNU/LINUX编程指南[M].王勇等译.北京:清华大学出版社,2000
[4]徐伟等.基于AT91RM9200的图像采集系统设计[J].微计算机信息,2006,11
 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭