【原创】嵌入式系统USB 摄像头工作解密
0赞本次我给大家讲讲嵌入式系统使用USB摄像头的原理,这个应用太广泛了,希望能给大家带来一点帮助。
硬件:UP-NETARM2410-S 嵌入式实验平台、PC 机Pentium 500 以上,硬盘10G 以上
软件:PC 机操作系统REDHAT LINUX 9.0+MINICOM+ARM LINUX 开发环境
原理
Video4linux(简称 V4L),是linux 中关于视频设备的内核驱动。现在已有Video4linux2,还未加入linux 内核,使用需自己下载补丁。
Video4linux 下视频编程的流程:
1、打开视频设备:视频设备是设备文件,可以像访问普通文件一样对其进行读写,在我们的平台上,摄像头设备是/dev/v4l/video0。
2、读取设备信息
3、更改设备当前的设置(如果有必要)
4.进行视频采集,视频采集主要有两种方法:
(1)内存映射(本实验中采用)
(2)直接从设备读取
5、对采集的视频进行处理(本实验中没有做处理)
6、关闭视频设备。
Video4linux 支持的主要数据结构
video_capability
包含设备的基本信息,包含的成员:
name[32]; 设备名称
type; 是否能capture,彩色还是黑白,是否能裁剪等等。
值如 VID_TYPE_CAPTURE 等
channels; 信号源个数
audios; 音频设备数目
maxwidth; 支持视频显示的宽度上限
maxheight; 视频显示的高度上限
minwidth;
minheight;
video_picture
设备采集的图象的各种属性,在应用程序中使用VIDIOCSPICT ioctl 来改变设备的此种属性。包含的成员:
brightness 亮度 0~65535
hue 色调
colour 颜色(彩色模式)
contrast 对比度
whiteness 白色度(灰度级模式)
depth 捕获深度(配合显示缓冲区的颜色深度)
palette 调色板信息
video_channel
关于各个信号源的属性,每种video4linux 视频或者音频设备可以从一个或者多个信号源捕获数据。调用的ioctl 接口是VDIOCGCHAN。调用前必须设置信号源的各个信道域。
包含的成员:
channel 信号源的标号
name 信号源名称
tuners tuners 的数目
flags tuner 的属性
type 输入类型
norm 制式
video_mbuf
利用mmap 进行映射的帧的信息。系统调用syscall 时会从设备返回下一个可用的影像。而调用者
首先要设置获取图像的大小和格式。通过调用ioctl 接口 VDIOCGCHAN 实现。注意并不是所有的设备
都支持此种操作:
size 帧大小
frames 最多支持的帧数
offsets[VIDEO_MAX_FRAME] 每帧相对基址的偏移
代码分析
视频采集实验的代码在实验目录/v4lcap 目录下。程序入口main.c 函数的main 函数。跟踪其中capture 函数:
注释:成功打开framebuffer 后,在终端的提示信息中会有如下的一条:
frame buffer: 640x480, 16bpp, 0x96000byte
在其中调用接口ioctl(vd->fd, VIDIOCGCAP, &(vd->capability)),读取图像设备的基本信
息,成功后显示capability 各个分量。
drv-v4l.c 272 if (-1 == ioctl(h->fd,VIDIOCGCAP,&h->capability))
读video_picture 中信息:
drv-v4l.c 403 xioctl(h->fd,VIDIOCGPICT,&h->pict);
步骤
1、首先配置内核make menuconfig
(1)进入Multimedia devices ---> 选中video for Linux 后;
在video for Linux 选项展开中如下选中V4L information in proc filesystem
(2)进入USB Suppot, 在 ---USB Multimedia devices 中选中 USB OV511 Camera Support
后退出。
2、编译内核make; make zImage;
3、烧录kernel
4、启动Linux,之后插入USB 摄像头设备,显示提示信息:
5、编译视频采集应用程序v4lcap,进入 /实验目录/v4lcap; make;
6、挂载nfs 文件系统,运行刚生成的v4lcap 程序
7、通过参数调整视频输出的尺寸,
[]#./v4lcap -s 320:240
8、若为中兴微zx301 芯片的摄像头,把spca5xx.o 文件拷贝到开发板,在开发板上插入zx301 芯片的驱动spca5xx.o,插入usb 摄像头,然后运行v4lcap 应用程序。
就写这么多吧, 谢谢大家!