没有合适的资源?快使用搜索试试~ 我知道了~
智能家居的项目用的 V4L2
5星 · 超过95%的资源 需积分: 9 48 下载量 73 浏览量
2011-06-29
22:54:35
上传
评论 1
收藏 80KB DOC 举报
温馨提示
试读
15页
以前做的智能家居的项目用的是Linux2.6.13的核,使用的中星微的摄像头,移植了spcaview进行图像的获取,后来用了2.6.29的核,发现以前移植的spcaview不能用了,后来查了一下,发现2.6.29核采用了UVC的驱动(万能驱动),采用了V4L2框架,而spcaview是基于V4L1的框架,API接口存在差异。所以需要自己写图片获取的应用程序
资源推荐
资源详情
资源评论
以前做的智能家居的项目用的是 Linux2.6.13 的核,使用的中星微的摄像头,移植了
spcaview 进行图像的获取,后来用了 2.6.29 的核,发现以前移植的 spcaview 不能用了,后
来查了一下,发现 2.6.29 核采用了 UVC 的驱动(万能驱动),采用了 V4L2 框架,而
spcaview 是基于 V4L1 的框架,API 接口存在差异。所以需要自己写图片获取的应用程序。
下面主要是一些资料的总结,并给出一个可以结果测试的代码:
一.什么是 video4linux
Video4linux2(简称 V4L2),是 linux 中关于视频设备的内核驱动。在 Linux 中,视频设备是
设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video0 下。
二.一般操作流程(视频设备):
1.打开设备文件。 int fd=open(/dev/video0,O_RDWR);
2.取得设备的 capability,看看设备具有什么功能,比如是否具有视频输入,或者音频输入输
出等。VIDIOC_QUERYCAP,struct v4l2_capability
3.设置视频的制式和帧格式,制式包括 PAL,NTSC,帧的格式个包括宽度和高度等。
VIDIOC_S_STD,VIDIOC_S_FMT,struct v4l2_std_id,struct v4l2_format
4.向驱动申请帧缓冲,一般不超过 5 个。struct v4l2_requestbuffers
5.将申请到的帧缓冲映射到用户空间,这样就可以直接操作采集到的帧了,而不必去复制。
mmap
6.将申请到的帧缓冲全部入队列,以便存放采集到的数据.VIDIOC_QBUF,struct v4l2_buffer
7.开始视频的采集。VIDIOC_STREAMON
8.出队列以取得已采集数据的帧缓冲,取得原始采集数据。VIDIOC_DQBUF
9.将缓冲重新入队列尾,这样可以循环采集。VIDIOC_QBUF
10.停止视频的采集。VIDIOC_STREAMOFF
11.关闭视频设备。close(fd);
三、常用的结构体(参见/usr/include/linux/videodev2.h):
struct v4l2_requestbuffers reqbufs;//向驱动申请帧缓冲的请求,里面包含申请的个数
struct v4l2_capability cap;//这个设备的功能,比如是否是视频输入设备
struct v4l2_standard std;//视频的制式,比如 PAL,NTSC
struct v4l2_format fmt;//帧的格式,比如宽度,高度等
struct v4l2_buffer buf;//代表驱动中的一帧
v4l2_std_id stdid;//视频制式,例如:V4L2_STD_PAL_B
struct v4l2_queryctrl query;//查询的控制
struct v4l2_control control;//具体控制的值
下面具体说明开发流程(网上找的)
打开视频设备
在 中,视频设备被看做一个文件。使用 函数打开这个设
备:
用非阻塞模式打开摄像头设备
!""#$%&
如果用阻塞模式打开摄像头设备,上述代码变为:
&
关于阻塞模式和非阻塞模式
应用程序能够使用阻塞模式或非阻塞模式打开视频设备,如果使用非
阻塞模式调用视频设备,即使尚未捕获到信息,驱动依旧会把缓存
('#()里的东西返回给应用程序。
设定属性及采集方式
打开视频设备后,可以设置该视频设备的属性,例如裁剪、缩放等。
这一步是可选的。在 )* 编程中,一般使用 + 函数来对设备的
, 通道进行管理:
* +- )./ +/ 0). 1&
23
-:设备的 ,,例如刚才用 函数打开视频通道后返回的
;
0).:具体的命令标志符。
在进行 开发中,一般会用到以下的命令标志符:
,,$4'#(5:分配内存
,,$'(46#(:把 ,,$4'#(5 中分配的数据缓存转
换成物理地址
,,$'(46$78:查询驱动功能
,,$4"(992:获取当前驱动支持的视频格式
,,$592:设置当前驱动的频捕获格式
,,$:92:读取当前驱动的频捕获格式
,,$2692:验证当前驱动的显示格式
,,$$8$78:查询驱动的修剪能力
,,$5$8:设置视频信号的边框
,,$:$8:读取视频信号的边框
,,$'#(:把数据从缓存中读取出来
,,$'#(:把数据放回缓存队列
,,$52479":开始视频显示函数
,,$52479:结束视频显示函数
,,$'(4652:检查当前视频设备支持的标准,例如 87
或 "25$。
这些 , 调用,有些是必须的,有些是可选择的。
检查当前视频设备支持的标准
在亚洲,一般使用 87(;<=;>)制式的摄像头,而欧洲一般使用
"25$(;<?),使用 ,,$'(4652 来检测:
+..
@
+-,,$'(4652A.&
BCD+EFAA47:7,"&
剩余14页未读,继续阅读
yinggegege
- 粉丝: 17
- 资源: 37
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页