资源描述:
《一个比较详细的linux摄像头图像采集讲解》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、这一部分将会介绍如何在linux中对电视卡编程。开始已经提到过,电视卡使用的是videoforlinux驱动,简称v4l,实际上,现在已经有了videoforlinuxtwo驱动,即v4l2.它解决了v4l中存在的一些问题,并且提高了硬件性能。但是,目前来说,v4l2仍然没有集成到linux的内核中,要使用v4l2的话,只有去下载v4l2补丁了,以下如无特别说明,所涉及的内容只针对v4l设备而言。我们都知道,在linux中,为了屏蔽用户对设备访问的复杂性,采用了设备文件,即可以通过像访问普通文件一样的方式来对设备进行访问读写。电视卡在lin
2、ux中和打印机,鼠标一样,属于字符设备。其主设备号是81,在实际操作上,访问控制电视卡也和一般的设备文件没有什么不同。用open打开设备,intfd;fd=open("/dev/video0",O_RDWR);用一系列的ioctl发命令控制设备。v4l支持的ioctl命令大概有二十几个,为了尽快的编出一个简单的图象捕捉程序,让我们先来看看几个主要的命令:1.ioctl(fd,VIDIOCGCAP,&cap);该命令主要是为了获取电视卡的功能信息。例如电视卡的名称,类型,channel等。参数cap是一个结构,当ioctl命令返回时,结构的各
3、成员就被赋值了,结构体的定义为:structvideo_capability{charname[32];inttype;intchannels;/*Numchannels*/intaudios;/*Numaudiodevices*/intmaxwidth;/*Supportedwidth*/intmaxheight;/*Andheight*/intminwidth;/*Supportedwidth*/intminheight;/*Andheight*/};channel指的是有几个信号输入源,例如television,composite,s
4、-video等。2.ioctl(fd,VIDIOCGCHAN,&vc)3.ioctl(fd,VIDIOCSCHAN.&vc)这两个命令用来取得和设置电视卡的channel信息,例如使用那个输入源,制式等。vc是一个video_channel结构,其定义为:structvideo_capability{charname[32];inttype;intchannels;/*Numchannels*/intaudios;/*Numaudiodevices*/intmaxwidth;/*Supportedwidth*/intmaxheight;/*
5、Andheight*/intminwidth;/*Supportedwidth*/intminheight;/*Andheight*/};structvideo_channel{intchannel;charname[32];inttuners;//numberoftunersforthisinput__u32flags;__u16type;__u16norm;};成员channel代表输入源,通常,0:television1:composite12:s-videoname表示该输入源的名称。norm表示制式,通常,0:pal1:ntsc2
6、:secam3:auto4.ioctl(fd,VIDIOCGMBUF,*mbuf)获得电视卡缓存的信息,参数mbuf是video_mbuf结构。其定义如下:structvideo_mbuf{intsize;/*Totalmemorytomap*/intframes;/*Frames*/intoffsets[VIDEO_MAX_FRAME];};size是缓存的大小,frames表明该电视卡的缓存可以容纳的帧数,数组offsets则表明对应一帧的起始位置,0帧对应offsets[0],1帧对应offsets[1]....执行完该命令后,就可以
7、用mmap函数将缓存映射到内存中了。大致用法可以参考以下的代码structvideo_mbufmbuf;unsignedchar*buf1,*buf2;if(ioctl(fd,VIDIOCGMBUF,&mbuf)<0){perror("VIDIOCGMBUF");return-1;}printf("theframenumberis%d",mbuf.frames);buf1=(unsignedchar*)mmap(0,mbuf.size,PROT_READ
8、PROT_WRITE,MAP_SHARED,fd.0);buf1=buf1+mbu
9、f.offset[0];buf2=buf1+mbuf.offset[1];//当然,如果mbuf.frames=1,就不需要下面的了。......5.ioctl(fd.VIDIO