为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

linux摄像头驱动

2017-10-14 8页 doc 23KB 24阅读

用户头像

is_014457

暂无简介

举报
linux摄像头驱动linux摄像头驱动 1. Video4linux 1.1 概述 V4L是Linux的影像串流系统与嵌入式影像系统的基础。Linux在TV、多媒体上的应用是目前相当热门的研究领域,而其中最关键的技术则是Linux的V4L。V4L是Linux kernel里支持影像设备的一组APIs,配合适当的摄像头与摄像头驱动程序,可以实现影像采集、AM/FM无线广播、影像CODEC、频道切换等功能。 1.2一般操作流程 (1)打开视频设备; (2)读取设备信息; (3)必要时修改设备当前设置; (4)视频采集,有两种方法: ...
linux摄像头驱动
linux摄像头驱动 1. Video4linux 1.1 概述 V4L是Linux的影像串流系统与嵌入式影像系统的基础。Linux在TV、多媒体上的应用是目前相当热门的研究领域,而其中最关键的技术则是Linux的V4L。V4L是Linux kernel里支持影像设备的一组APIs,配合适当的摄像头与摄像头驱动程序,可以实现影像采集、AM/FM无线广播、影像CODEC、频道切换等功能。 1.2一般操作流程 (1)打开视频设备; (2)读取设备信息; (3)必要时修改设备当前设置; (4)视频采集,有两种方法: a.内存映射 b.直接读取设备 (5)处理采集的视频; (6)关闭视频设备; 1.3常用数据结构 编写代码过程中,常用的结构体以及应用如下: (1) video_capability 包含设备的基本信息(设备名称、支持的最大最小分 辨率、信号源信息等),包含的分量: •name[32] //设备名称 •maxwidth ,maxheight,minwidth,minheight •Channels //信号源个数 •type //是否能capture,彩色还是黑白,是否能裁剪等等。值 如 VID_TYPE_CAPTURE等 (2)video_picture 设备采集的图象的各种属性 •brightness //0~65535 •hue •colour •contrast •whiteness •depth // 24 •palette //VIDEO_PALETTE_RGB24 video_channel 关于各个信号源的属性 (3) ?Channel //信号源的编号 ?name[32] ?tuners ?Type VIDEO_TYPE_TV | IDEO_TYPE_CAMERA ?Norm制式 (4)video_window 包含关于capture area的信息 ? x、y windows 中的坐标. ? width 捕捉图像的宽度 ?height 捕捉图像的高度 ?chromakey A host order RGB32 value for the chroma key. ?flags 标志符号 ?clips A list of clipping rectangles. (Set only) ?clipcount The number of clipping rectangles. (Set only) (5)video_mbuf 利用mmap进行映射的帧的信息 ?size 每帧大小 ?Frames 最多支持的帧数 ?Offsets 每帧相对基址的偏移 (6)video_buffer 最底层对buffer的描述 ?*baseBase 缓冲区的物理地址 ?height 帧缓冲区的高 ?width 帧缓冲区的宽 ?depth 帧缓冲区的深度 ?bytesperline (7) struct v4l2_file_operations soc_camera_fops = { .owner = THIS_MODULE, .open = soc_camera_open, .release = soc_camera_close, .ioctl = video_ioctl2, .read = soc_camera_read, .mmap = soc_camera_mmap, .poll = soc_camera_poll, }; 其中soc_camera_open,soc_camera_close是打开和关闭视频采集设备; soc_camera_read,是读取视频图像;视频驱动主要的控制接口都是通过 ioctl来实现的,如图像的格式、亮度、色度等信息都是通过ioctl函数获取和设置的。 1.4 具体操作步骤 (1)打开视频: Open(”/dev/video0”,O_RWONLY); 关闭视频设备用close(”/dev/video0”, O_RWONLY); (2)读video_capability 中信息 ioctl(vd->fd, VIDIOCGCAP, &(vd->capability)) 成功后可读取vd->capability各分量。 (3)读video_picture中信息 ioctl(vd->fd, VIDIOCGPICT, &(vd->picture)); (4)改变video_picture中分量的值 先为分量赋新值,再调用VIDIOCSPICT vd->picture.colour = 65535; ioctl(vd->fd, VIDIOCSPICT, &(vd->picture); (5)初始化channel 必须先做得到vd->capability中的信息 for (i = 0; i < vd->capability.channels; i++) { vd->channel[i].channel = i; if(ioctl(vd->fd, VIDIOCGCHAN, &(vd->channel[i])) < 0) { perror("v4l_get_channel:"); return -1; } } 1.5 截取图象 截取图像有两种方式,内存映射和直接读取设备。 1.5.1 内存映射 •mmap( )系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。 操作步骤如下: (1)设置picture的属性; (2)初始化video_mbuf,以得到所映射的buffer的信息; 调用VIDIOCGMBUF获取映射buffer的信息 (3)修改video_mmap和帧状态的当前设置; (4)将mmap与video_mbuf绑定; (5)在mmap方式下进行视频截取; 调用 VIDIOCMCAPTURE进行视频截取 •若调用成功,开始一帧的截取,操作过程是非阻塞的; •是否截取完毕用VIDIOCSYNC来判断 (6)调用VIDIOCSYNC等待一帧截取结束; 若成功,表明一帧截取已完成。可以开始做下一次 VIDIOCMCAPTURE 1.5.2 直接读设备 关于缓冲大小,图象等的属性须由使用者事先设置 •调用read(); •int read (要访问的文件描述符;指向要读写的信息的指针;应该读写的字符数); •返回值为实际读写的字符数。 2. Video4linux2 2.1 概述 Video-4linux2(简称V4L2)较V4L有较大的修改,并已成为linux2.6版本的接口。V4L2采用流水线的方式,操作更简单直观,基本遵循打开视频设备、设置格式、处理数据、关闭设备,更多的具体操作通过ioctl函数来实现。 2.1 一般操作流程 (1) 打开设备文件。 (2) 取得设备的capability。 (3) 选择视频输入 。 (4) 设置视频的制式和帧格式。 (5) 向驱动申请帧缓冲区。 (6) 将申请到的帧缓冲映射到用户空间。 (7) 将申请到的帧缓冲全部入队列。 (8) 开始视频的采集。 (9) 出队列以取得已采集数据的帧缓冲,取得原始采集数据。 (10) 将缓冲重新入队列尾,实现循环采集。 (11) 停止视频的采集。 (12) 关闭视频设备。 2.2 常用数据结构 struct v4l2_requestbuffers :向驱动申请帧缓冲的请求,里面包含申请的个数 struct v4l2_capability :这个设备的功能,比如是否是视频输入设备 struct v4l2_input :视频输入 struct v4l2_standard :视频的制式,比如PAL,NTSC struct v4l2_format :帧的格式,比如宽度,高度等 struct v4l2_buffer :代表驱动中的一帧 struct v4l2_std_id :视频制式,例如:V4L2_STD_PAL_B struct v4l2_queryctrl :查询的控制 struct v4l2_control :具体控制的值 2.3 具体操作步骤 2.3.1 打开视频设备 在V4L2中,视频设备被看做一个文件来进行操作。使用open函数打开这个设备。打开视频设备有两种方法,一种是非阻塞模式,另一种是阻塞模式。应用程序能够使用阻塞模式或非阻塞模式打开视频设备,如果使用非阻塞模式调用视频设备,即使尚未捕获到信息,驱动依旧会把缓存(DQBUFF)里的数据返回给应用程序。 2.3.2 设置属性及采集方式 打开视频设备后,可以设置该视频设备的属性,例如裁剪、缩放等。在Linux编程中,一般使用ioctl函数来对设备的I/O通道进行管理: extern intioctl(int__fd, unsigned long int__request, …) __THROW; __fd:设备的ID,例如刚才用open函数打开视频通道后返回的ID号; __request:具体的命令标志符。 在进行V4L2开发编程中,一般会用到以下的命令标志符: (1)VIDIOC_REQBUFS:分配内存 (2)VIDIOC_QUERYBUF:把VIDIOC_REQBUFS中分配的数据缓存转换成 物理地址 (3) VIDIOC_QUERYCAP:查询驱动功能 (4)VIDIOC_ENUM_FMT:获取当前驱动支持的视频格式 (5) VIDIOC_S_FMT:设置当前驱动的频捕获格式 (6) VIDIOC_G_FMT:读取当前驱动的频捕获格式 (7) VIDIOC_TRY_FMT:验证当前驱动的显示格式 (8) VIDIOC_CROPCAP:查询驱动的修剪能力 (9) VIDIOC_S_CROP:设置视频信号的边框 (10) VIDIOC_G_CROP:读取视频信号的边框 (11) VIDIOC_QBUF:把数据从缓存中读取出来 (12) VIDIOC_DQBUF:把数据放回缓存队列 (13) VIDIOC_STREAMON:开始视频显示函数 (14) VIDIOC_STREAMOFF:结束视频显示函数 (15) VIDIOC_QUERYSTD:检查当前视频设备支持的标准,例如PAL或NTSC。 2.3.3 设置视频捕获格式 该设置主要用到v4l2_format结构体,对该结构体里面的变量进行相应的配置。 2.3.4 分配内存 接下来为视频捕获分配内存:
/
本文档为【linux摄像头驱动】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索