搭建摄像机需要Linux系统环境,首先移植Bootloader,对Linux 2.6.32内核进行裁剪,加载Linux UVC(USB video device class)驱动及相关驱动,将编译好的Linux系统镜像烧写到ARM板Nand Flash中,对Bootloader设置启动引导地址,即完成软件运行环境搭建。
分析网络摄像机性能需求与拓展性,须满足下列条件:
◆ 视频监控实时性;
◆ 支持多客户端同时连接;
◆ 图像识别算法或预留接口;
◆ 功能模块化满足后期开发可扩展。
因此,采用多线程架构与互斥锁机制来保证实时性、模块化的思想设计代码结构。软件程序主流程如图3所示。
图3 软件程序主流程
其中主要实现如下功能。
① 初始化Linux V4L2接口,必须按照V4L2标准结构初始化结构体,其中包括struct v4l2_capability cap;struct v4l2_format fmt;struct v4l2_buffer buf;struct v4l2_requestbuffers rb; struct v4l2_streamparm setfps。此外将视频设备名、视频宽度、视频高度、帧率、视频格式和抓取方法传递给函数init_videoIn(struct vdIn *vd, char *device, int width, int height, int fps, int format, int grabmethod)实现初始化。值得注意的是众多USB camera并不支持JPEG格式视频流直接抓取,针对YUYV格式抓取却有广泛支持。后期进行图像识别算法操作时直接分析YUYV原始图像数据,将节省JPEG压缩数据转换为原始图像数据的大量运算开销,因此采用YUYV抓取模式。