2024年4月21日发(作者:)
! 殳:
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,
射区域无法和其他进程共享。
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
本文发布于:2024-04-21 20:46:26,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/1713703586227068.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |