camera驱动和编程.doc_第1页
camera驱动和编程.doc_第2页
camera驱动和编程.doc_第3页
camera驱动和编程.doc_第4页
camera驱动和编程.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Camera驱动和编程了解了 framebuffer ,摄像头便只是fb 的数据来源而已。先了解些相关的概念:V4L2(video 4 linux 2)可以支持多种设备,它可以有以下几种接口:1. 视频采集接口(video capture interface):这种应用的设备可以是高频头或者摄像头 .V4L2 的最初设计就是应用于这种功能的.2. 视频输出接口 (video output interface): 可以驱动计算机的外围视频图像设备 -像可以输出电视信号格式的设备 .3. 直接传输视频接口 (video overlay interface): 它的主要工作是把从视频采集设备采集过来

2、的信号直接输出到输出设备之上 ,而不用经过系统的CPU.4. 视频间隔消隐信号接口 (VBI interface): 它可以使应用可以访问传输消隐期的视频信号 . 5. 收音机接口 (radio interface): 可用来处理从 AM 或 FM 高频头设备接收来的音频流. Video4linux 下视频编程的流程:(1)打开视频设备:( 2)读取设备信息( 3)更改设备当前设置(没必要的话可以不做)( 4)进行视频采集,两种方法:a. 内存映射b. 直接从设备读取(5)对采集的视频进行处理(6)关闭视频设备。 /* 这样的流程地球人都晓得*/关键步骤介绍:(1)打开视频:Open (” /

3、dev/video0”, vd fd);关闭视频设备用close(”/dev/video0”,vd fd);2)读(video_capability中信息ioctl(vd->fd,VIDIOCGCAP, &(vd->capability)成功后可读取vd->capability各分量eg. ( 3)读video_picture中信息ioctl(vd->fd, VIDIOCGPICT, &(vd->picture);(4)改变 video_picture中分量的值(可以不做的)先为分量赋新值,再调用VIDIOCSPICTEg.vd->pictu

4、re.colour =65535;if(ioctl(vd->fd, VIDIOCSPICT,&(vd->picture) <0)perror(VIDIOCSPICT);return -1;( 5)初始化 channel(可以不做的) 必须先做得到vd->capability中的信息for(i = 0; i < vd->capability.channels;i+)vd->channeli.channel = i;if(ioctl(vd->fd, VIDIOCGCHAN, &(vd->channeli)< 0)perro

5、r(v4l_get_channel:);return -1; /* 通过 ioctl ,将 struct v4l_struct作为参数的设备操作而已,那么重点将是整个结构体:structv4l_struct*/ typedefstruct v4l_structvideo_capabilitycapability;structchannel4;structvideo_picturestructvideo_windowwindow;video_capturecapture;structbuffer;structvideo_mmapint fd;structvideo_channelpicture;

6、structvideo_buffermmap;structvideo_mbufmbuf;unsigned char*map;int frame;int framestat2;vd;/*那么,对该结构体的了解便成了关键*/ Video4linux支持的数据结构及其用途( 1) video_capability包含设备的基本信息(设备名称、支持的最大最小分辨率、信号源信息等) ,包含的分量:name32/设备名称maxwidth ,maxheight,minwidth,minheightChannels/信号源个数type/是否能capture,彩色还是黑白,是否能裁剪等等。值如VID_TYPE_

7、CAPTURE等(2)video_picture设备采集的图象的各种属性brightness065535huecolourcontrastwhitenessdepth/24palette/ VIDEO_PALETTE_RGB24( 3)video_channel关于各个信号源的属性Channel/信号源的编号nametunersType/ VIDEO_TYPE_TV |IDEO_TYPE_CAMERANorm 制式( 4) video_window/包含关于 capture area 的信息xx windows中的坐标 .yx windows中的坐标 .widthThewidth of the

8、 image capture.heightThe height of theimage capture.chromakeyA host order RGB32value for the chroma key.flagsAdditional capture flags.clipsA listof clipping rectangles. (Set only)clipcountThe number of clipping rectangles. (Set only)( 5)video_mbuf/利用 mmap 进行映射的帧的信息size/每帧大小Frames/最多支持的帧数Offsets/每帧相对

9、基址的偏移(6)video_buffer最底层对 buffer 的描述void*baseBase/ physical address of the bufferintheight/ Height of the frame bufferint width/ Width of the frame bufferint depth/ Depth of the frame bufferint bytesperline/ Number of bytes of memorybetween the start of two adjacent lines实际显示的部分一般比它描述的部分小 ( 7)video_m

10、map/用于 mmap重点:用 mmap (内存映射)方式截取视频mmap( ) 系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必再调用read() ,write()等操作。两个不同进程A 、B 共享内存的意思是,同一块物理内存被映射到进程A 、B 各自的进程地址空间。进程A 可以即时看到进程 B 对共享内存中数据的更新,反之亦然采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝(1)设置 picture 的属性( 2)初始化 video_mbuf ,以得到所映射的

11、 buffer 的信息ioctl(vd->fd, VIDIOCGMBUF, &(vd->mbuf)( 3)可以修改 video_mmap 和帧状态的当前设置Eg.vd->mmap.format = VIDEO_PALETTE_RGB24vd->framestat0 = vd->framestat1 = 0; vd->frame= 0; ( 4)将 mmap与 video_mbuf绑定 void* mmap ( void *addr , size_t len , int prot , int flags , int fd , off_t offset

12、)len/ 映射到调用进程地址空间的字节数,它从被映射文件开头 offset 个字节开始算起Prot/ 指定共享内存的访问权限 PROT_READ (可读) , PROT_WRITE(可写), PROT_EXEC(可执行)flags / MAP_SHAREDMAP_PRIVATE 中必选一个 / MAP_ FIXED不推荐使用addr / 共内存享的起始地址,一般设0,表示由系统分配Mmap( ) / 返回值是系统实际分配的起始地址if(vd->map = (unsigned char*)mmap(0,vd->mbuf.size, PROT_READ|PROT_WRITE,MAP_

13、SHARED, vd->fd, 0) < 0)perror(v4l_mmap mmap:);return-1;( 5) Mmap 方式下真正做视频截取的VIDIOCMCAPTUREioctl(vd->fd,VIDIOCMCAPTURE, &(vd->mmap) ;若调用成功,开始一帧的截取,是非阻塞的,是否截取完毕留给VIDIOCSYNC来判断( 6)调用 VIDIOCSYNC等待一帧截取结束 if(ioctl(vd->fd, VIDIOCSYNC, &frame) <0)perror(v4l_sync:VIDIOCSYNC);return

14、-1; 若成功,表明一帧截取已完成。可以开始做下一次VIDIOCMCAPTUREframe是当前截取的帧的序号。* 关于双缓冲:video_mbuf mbuf.frames = 2;/一帧被处理时可以采集另一帧int frame;/当前采集的是哪一帧int framestat2;/帧的状态没开始采集|等待采集结束帧的地址由vd->map+vd->mbuf.offsetsvd->frame得到采集工作结束后调用munmap 取消绑定 munmap(vd->map, vd->mbuf.size)/*关于直接读取的方式,太落伍,不再赘述*/我们要区分video为顺序式和

15、交错式:顺序式video顺序的传输video image所有的行,交错式video则把一个video划分成两个 fields ,分别保存video image的奇数行和偶数行,被称作奇数 field 和偶数 field.阴极射线电视机需要交替的显示行来组成一个完整的帧,交替的时延需要我们交替的传输奇数field 和偶数 field.这个奇怪的技术的引用是因为:在刷新率接近电影时,图片会消退的过快。使用field可以避免使用double buffer以及额外的带宽需求。首先要明确camera并不是在同一时间曝光一帧,camera通过许多fields来传输这些帧的,这些field是在不同瞬间拍照。

16、屏幕上的一个对象因此会在两个field 之间产生动画效果。 这种情况下需要识别哪一帧更老一点,也称作“瞬间序”当驱动通过fields提供或者接收images,应用层应该知道如何通过这些fields组合成帧,通过划分为top bottom field,“空间序”:top field的第一行是帧的第一行, bottom field的第一行是帧的第二行。/* 问题:多个fields 和一个完整的帧的关系 */ 然而因为 field 是一个跟着一个拍的,争论帧是由top还是 bottom 开始的是没意义的, 任何两个相邻的top bottomfield, 或者 bottom top field 都可以

17、组成一个有效的帧。 与直觉相反 top field 不一定是 older field, older filed 是否包含 top 或者 bottom lines 是由 video 标准决定的 . 因此要区分瞬间序和空间序。下面的图会给出清晰的解释。所有的 video capture和 out devices必须汇报当前的field 顺序。一些驱动可能允许选择不同的序,end 应用可以在调用VIDIOC_S_FMT前初始化 struct v4l2_pix_format的field 成员。否则可以使用V4L2_FIELD_ANY下面列出了可能的 field 类型 V4L2_FIELD_ANY0Ap

18、plication可以请求使用这个参数,如果V4L2_FIELD_NONE,V4L2_FIELD_TOP, V4L2_FIELD_BOTTOM 4L2_FIELD_INTERLACE中任何一个格式都支持驱动选择使用哪一个格式依赖于硬件能力, 以及请求的image 尺寸,驱动选择一个然后返回这个格式。 struct_buffer的field 成员不可以为V4L2_FIELD_ANY.V4L2_FIELD_NONE1Images 是顺序式格式,驱动可以指定这种order ,当驱动无法区分 V4L2_FIELD_TOP和 V4L2_FIELD_BOTTOMV4L2_FIELD_TOP2Images

19、仅仅包含 top field V4L2_FIELD_BOTTOM3 Images 仅仅包含 bottom field. 应用可能希望防止设备捕获interlaced的图片,因为这种图片会在运动物体周围产生毛状特效V4L2_FIELD_INTERLACED4Images包含 top 和bottom field, 隔行交替, fields 的瞬间序依赖于当前 video 的标准。 /NTSC 首先传输 bottom field, 其他的则先传输 top field V4L2_FIELD_SEQ_TB5Images 包含 top 和 bottom field, top field的行首先存放在memory中

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论