基于Linux的USB摄像头的探索使用和编程实现

阅读: 评论:0

2024年4月21日发(作者:)

基于Linux的USB摄像头的探索使用和编程实现

! 殳: 

ScIence and TechnoIogy lnnovation Heraid 

丁技术 

基于L i n u x的U S B摄像头的探索使用和编程实现 

徐向前1l 

(1.苏州大学 江苏苏州 21 5021;2.苏州工业园区工业技术学校 江苏苏州 21 51 23) 

摘要:在Wi ndows OS中,USB接口的摄像头目其成本低廉,安装方便而被广泛应用,, ̄Linux作为目前最具有潜力的Os被业界一直看好, 

因此,如何在I iflUX下开发USB摄像头的应用成为了一种迫切需求。本文介绍了当今Lintlx内核都普遍支持的摄像头驱动的安装以及鳊程 

实现,目的只为把读者引-&USB摄像头的Linilx世界。 

关键词:l,inux USB 摄像头 鳊程实现 

中图分类号:G 6 2 3.5 8 文献标识码:A 文章编号:16 74—098x(2OO9)1 2(c)-O01 3--02 

UsB摄像头连接简单、使用灵活、价格 

spca 5XX.k0(这里使用的是spca 5XX一 

低廉H.具有良好的性能,因此,得到r广泛 

20060501.tar.gz)。 

Int minheight;/十捕捉图像的最小宽度 

(单位:像素) / 

的应用。Us}{{聂像头在嵌入武系统中主要 

应用十图像采集设备、视频监控系统以及 

可视电话等方面。 

I iFlUX 核包含'广多种UsB摄像头驱 

动,最常用的有基干0V511及其兼容芯片 

(包括OV 5l1/0V 51 1+以及0V6620/ 

OV76lO/20/2OAE)。不过,基于OV51l芯片 

的摄像头并不多。目前,在低端市场占有率 

较高的摄像头芯片是中芯微公司生产的 

ZC 0 30X系列摄像头芯片,它町以使用 

http://mxhaard.free.fr/提供的SPCA5XX 

驱动稃序驱动(该驱动是一一个支持多种摄 

像头的通用驱动程序)。 

1摄像头驱动安装 

1.1 OV511兼容摄像头 

由于内核自带了OV 5ll芯片摄像头的 

驱动,因此,只须修改内核配置并编译即 

可。在2.6.16版本之前的内核,OV5ll的支 

持可住配置菜单中选择。 

1)evice Drivers > 

Multimedia dex ices一> 

< >Video For 1 iHUX 

USB support一> 

<十>USB OV 5l l Camera support 

(NEW) 

而2.6.16版本之后的内核,USB摄像头 

的菜单移动到了Video For Linux的子菜 

中。 

Device Drivcrs > 

Multimedia devices一> 

< >Video For Linux 

Video Capture Adapters一> 

V4I USB devices一> 

<¥>USB 0V5l l Camera 

(NEW) 

1.2 SPCA5XX ̄Ig动支持的摄像头 

SPCA 5Xx驱动的安装比较容易,从 

http://mxhaard.free.fr/download.html上 

下载驱动程序,交叉编译(使用目标平台为 

ARM处 器)后,就可以得到内核模块文件 

#tar xzf spca5xx一2006O501.tar.gz 

; 

#cd sDca5xx 2006O501 

帧缓NO(FrameBuffer)处理指令用于将 

赶make CC=arm-linux gcc KERN— 

采集到的图像数据直接放到FrameBuffer显 

ELDIR=¥KERNEL—SRC 

示缓冲区显示出来(该方法不是每个图像 

采集设备都支持的)。指令VIDIOSCFBUF/ 

2基于Video4Linux的视频采集 

VIDIOCGFBUF用于设置/捕获FrameBuffer 

Linux系统中的视频子系统Vide— 的信息,需使用struct video—buffer数据结 

o4Linux为视频应用程序提供_『一套统一 

构实现。 

的API,视频应用程序通过调节即可操作各 

Struct video— buffer 

种不同的视频捕狭设备,包括电视卡、视频 { 

捕捉卡和USB摄像头等。对于摄像头的视 

Void*base;/*FrameBuffer的物理基地 

频采集,需要使用Video4Linux提供的设备 

址}/ 

接口/dev/video,若文件系统中没有这个设 

Int height,width;/*FrameBuffer图像 

备文件,则先建立该设备节点文件。 

的高度和宽度 / 

#mknod/dev/video C 81 0 

Int depth;/}FrameBuffer的位深度十/ 

基于Vide04Linux的视频采集就是对/ 

Int bytesperline;/ FrameBuffer每行 

dev/video设备的操作,其过程如图7—1 3所 

所占用内存字节数 / 

不。 

}; 

其中,打开和关闭视频设备操作比较 图像参数处理(VIDIO C GPI C T/ 

简单,即使用标准的I/O做操— pen()和 

VIDIOCSPIcT)指令用于获取/设置采集图 

close()函数,较为复杂是它的ioctl0操作。下 像的各项参数,并保存在结构体 

面对视频采集相关的几条重要ioctl()控制 

video—picture中。 

指令以及用到的相关数据结构做些说明。 

Struct video

picture 

功能查询指令(VIDIOCGcAP)用于查 { 

询视频设备。这个操作可返回设备的一些 u16 brightness;/{图像亮度 / 

基本信息,并将结果存放在结构体vide ul6 hue;/}图像色调(只对彩色图 

o capability中。 像有效) / 

Struct video—capability 

Ul6 color;/}图像颜色数(只对彩 

J 

色图像有效) / 

Char name[ 1;/}设备名称 / U16 contrast;/}图像对比度十/ 

Int type;/十设备功能标识 / u16 whiteness;/十图像白度(只对黑 

Int channels;/{设备支持的视频通道 白图像有效) / 

数 / 

u16 depth;/}图像色深}/ 

Int audios;/ 设备支持的音频通道数 

u16 palette;/ 调色板格式}/ 

}; 

Int maxwidth;/ 捕捉图像的最大宽度 

可以使用内存映射(mmap)方式取得采 

(单位:像素) / 集图像数据。Mmap()函数用于将某个文件 

Int maxheight;/耐甫捉图像的最大高 的内容(此处为设备文件/dev/video的图像 

度(单位:像素) / 数据空间)映射到进程的虚拟地址空间,则 

lnt minwidth;/ 捕捉图像的最小宽度 

对该内存区域的存取即是直接对该文件内 

(单位:像素) / 

容的读写。这样,通过使用mmap()进行内存 

科技创新导报Science and Technology Innovation Herald 1 3 

T技术 

映射,使得多个进程间可以实现内存共享。 

文件被映射到进程的虚拟地址空间后,进 

程可以像访问普通内存一样对文件进行访 

Struct video_mbuf 

mm.width=vcp.maxwidtht 

mm.format=vp.palette; 

{ 

Int size;/}可映射的内存大小 / 

ioctl(fvideo,VID10CMCAPTURE, 

问,不必再调用read(),write()等操作。Mmap 

()函数的原型为: 

Void*mmap(void start,size—t length, 

int port,int flags,int fd,off_t offset); 

Int frames}/{图像帧数}/ 

Int offset[VIDEO—MAX—FRAME];/十 

&mm);//开始采集 

ioctl(fvideo,VIDIOCSYNC, &mm. 

每帧图像的偏移量 / 

f; 

frame);//等待采集结束 

write

bmp(mmbuf+mb.offsets[0】, 

其中,参数start指向欲映射的内存起始 

接下来,就可以使用V I D 1 0一 

CMCAPTURE ̄IIVIDIOCSYNC指令对图像 

向视频采集设备发送采集图像数据命令, 

mm);//将采集到的图像写入bmp文件 

m unm aP(mmbUf,mb.Si z e); 

地址,通常设为NULL,表示让系统自动选 

定地址,映射成功则返回该地址;参数 

进行数据采集。VIDIOCMCAPTURE指令 //取消内存映射 

close(fvideo);//关闭图像采集设备 

length表示映射到内存中的文件长度;参数 

port表示映射区域的保护方式,它可以使以 vID10cSYNc则等待数据采集结束。这两 

下几种方式或其组合: 

条指令总是成对出现,控制设备完成一帧 

P0RT

EXEC 映射区域可披执行; 

图像采集,且须使用video—mmap结构体向 

PORT—READ 映射区域可被读取; 

设备传递相关信息。 

PORTStruct video

WRITE映射区域可被写入; 

mmap 

PORT NONE 映射区域不能存取; 

参数flags会影响映射区域的各种特性, Unsigned int frame;/}帧号(O~n) / 

它可以为: 

Int height,width;/}图像的高度和宽 

MAP

FIxED如果参数start所指向的 

度十/ 

地址无法成功建立映射,则放弃映射,且不 

Unsigned int format;/}图像格式}/ 

对地址做修正。通常不鼓励用此标志位。 

; 

MAP

SHARED与其他进程共享该映 下面是一个采用内存映射方式从摄像 

射,对映射区域的写入操作等同于对文件 

头采集一帧图像数据的示例代码。 

的写操作。 

Int fvideo; 

MAP

PRIVATE对映射区域的写入操 

Struct video—capability vcap; 

作会产生一个映射文件的复制,即私有的 

Struct video—picture vp; 

“写入时复制”(copy on write),对此区域 

Struct videombuf一 0; 

的任何修改不会影响原来的文件内容。 

Unsigned char*mmbuf; 

MAP

AN0NYMOUS建立匿名映射。 

Struct video mmap min; 

此时,会忽略参数fd,不涉及文件,而且映 

F vid eo=oP en(“/dev/vide o, 

射区域无法和其他进程共享。 

RDWR”);//打开设备 

MAP

L0CKED将映射区域锁定,该区 Ioctl(fvideo,VIDIO CG CAP,&vcap); 

域不会被置换(swap)出内存。这个标志位在 //获得设备参数 

老的内核中不可用 Ioctl(fvideo,VIDIOCGPICT.&vp、 , 

调用m m a P()时,必须指定标识 获取图像采集参数 

MAP

SHARED或MAP—PR IVATE。参数fd 

//根据实际需要修改图像采集参数设 

为open()函数返回的文件描述符,表示进行 

置 

映射操作的文件;参数offset为文件映射的 

Vp.brightness:42767; 

偏移量,通常设置为0,表示从文件起始处 

Vp.contrast=22767; 

开始映射,offset必须是内存分页大小的整 

Vp.hue=32767; 

数倍。若映射成功,则函数的返回值为映射 

Vp.color=44767; 

区域的内存起始地址,否则,返回 

VD.palette=VIDEO ̄PALETTE

RGB24; 

MAP

FAILED(~1)。 

Vp.depth=24; 

用内存映射方式可以提高数据处理的 ioctl(fvideo,VID10CSPICT,&vp); 

效率,且较容易实现多线程的程序设计,其 //进行内存映射 

中,一个进程读取图像数据,另一个处理图 

Ioctl(fvideo,VIDIOcGMBUF,&mb); 

像数据(例如保存为文件或压缩等操作)。两 Mmbuf=(unsigned char*)mmap(0, 

个进程间的数据共享通过共享内存来实 

mb.sie,PORT—READIPORT——WRITE, 

现。进行内存映射之前,需要使用 

MAP

SHARED,fvideo,0); 

VID10cGMBUF指令取得设备支持的内存 //采集一帧图像 

映射属性,而这些属性存放于结构体 

mm.frame=0: 

video_mbuf。 lnm.height=vcp.maxheigh*; 

1 4 科技创新导报Science and Technology Innovation Herald 

基于Linux的USB摄像头的探索使用和编程实现

本文发布于:2024-04-21 20:46:26,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/1713703586227068.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:映射   图像   设备   采集   内存   文件
留言与评论(共有 0 条评论)
   
验证码:
排行榜

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23