snifer

【原创】嵌入式系统USB 摄像头工作解密

0
阅读(2342)

本次我给大家讲讲嵌入式系统使用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 函数:

1.png

注释:成功打开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);

2.jpg

3.png

步骤

1、首先配置内核make menuconfig

(1)进入Multimedia devices ---> 选中video for Linux 后;

blob.png

在video for Linux 选项展开中如下选中V4L information in proc filesystem

blob.png

(2)进入USB Suppot, 在 ---USB Multimedia devices 中选中 USB OV511 Camera Support

后退出。

2、编译内核make; make zImage;

3、烧录kernel

4、启动Linux,之后插入USB 摄像头设备,显示提示信息:

blob.png

5、编译视频采集应用程序v4lcap,进入 /实验目录/v4lcap; make;

6、挂载nfs 文件系统,运行刚生成的v4lcap 程序

blob.png

7、通过参数调整视频输出的尺寸,

[]#./v4lcap -s 320:240

8、若为中兴微zx301 芯片的摄像头,把spca5xx.o 文件拷贝到开发板,在开发板上插入zx301 芯片的驱动spca5xx.o,插入usb 摄像头,然后运行v4lcap 应用程序。

就写这么多吧, 谢谢大家!