Linux及OK6410环境下视频监控系统设计与实现

2019-06-06 04:21张海娇孙文胜
软件导刊 2019年3期

张海娇 孙文胜

摘 要:随着城市建设数字化、智慧化、管理远程化、生产异地化,安防和智能管理技术拥有越来越广阔的发展前景。针对监控产品技术升级需求,提出了一种以OK6410嵌入式ARM开发板为硬件平台,以Linux-3.6.0为软件平台的视频监控系统。描述了整个系统架构以及系统软硬件设计,重点介绍了V4L2视频框架设计以及CMOS摄像头实现图像捕捉的过程,并创新设计了循环链表缓冲池,明显缓解了输入输出同步问题,提高了程序健壮性。实际应用表明,该系统能较好地为多个用户同时提供实时视频服务,具有较高的稳定性和可扩展性,并拥有日志记录功能。

关键词:视频监控系统;Linux;OK6410;V4L2;缓冲池

DOI:10. 11907/rjdk. 182098

中图分类号:TP319文献标识码:A文章编号:1672-7800(2019)003-0121-05

0 引言

随着科技的不断发展和人们安防意识的提升,网络视频监控系统得到了广泛应用 [1]。网络视频监控系统主要经历了3个发展阶段:第一阶段为已经退出历史舞台的模拟监控系统[2];第二阶段为目前小范围使用的PC机插卡式监控系统[3];第三阶段为当今普遍使用的嵌入式视频监控系统[4]。

目前,网络视频监控系统逐步向移动化和全数字化演进[5],移动视频监控[6]、基于IPV的视频监控[7]、满足数字化家庭需求的视频监控[8]均以嵌入式技术为依托。随着嵌入式处理器性能的不断提高,嵌入式视频监控系统应用越来越广泛。

为在嵌入式芯片上进行多种方式扩展,本系统选用资源容量和图像处理能力较为强大的OK6410开发板作为硬件平台,利用嵌入式Linux操作系统内核搭建软件平台,为多个用户同时提供实时视频服务。系统在V4L2视频框架[9]中新定义了摄像头捕捉结构体,创新设计了V412框架操作,实现用户查看监控视频中重要画面的抓图功能;同时创新设计了适用于本系统的循环链表缓冲池,以及采用适当的线程同步机制对缓冲池进行读写操作,使系统可以明确分离输入输出设备,增强程序健壮性,提高系统模块化水平;充分利用OK6410的开发资源,加入日志记录功能,实现系统的调试控制,保障运行稳定性,为日后系统升级扩展提供支持。

1 系統总体设计

本系统采用C/S(客户/服务)架构[10],通过个人PC上通用的http服务,用户不需要安装客户端即可在网页上获取监控服务[11]。以因特网作为通信平台,传输html文件表单和视频流数据,结合相关传感和嵌入式技术,有效获取实时视频数据,同时利用高效稳定的Linux操作系统内核管理硬件平台,使系统拥有强大功能。

系统有前端采集、视频处理、网络服务 [12] 3大子系统,通过前端采集系统将CMOS摄像头[13]采集的视频数据导入视频处理系统,经过处理的视频数据更适合存储和传输。当有客户登录服务器时,被处理的视频数据导入网络服务系统,客户即可通过网页查看实时监控视频。

1.1 系统硬件设计

本监控系统采用基于三星S3C6410处理器ARM 11的飞凌公司OK6410开发板,此开发板具有更高的主频和丰富的外设,提供LCD 接口、Camera 输入接口、4路串口、SDIO接口、100M 网卡、USB2.0-OTG接口、USB Host 接口、音频输入输出接口、按键接口等硬件资源[14],适用于对性能和处理能力有更高要求的嵌入式系统应用场合。系统主控机硬件由电源模块、按键设备模块、串口设备模块、网络设备模块、数据存储单元模块和视频监控模块组成,硬件设计如图1所示。

1.2 系统软件设计

系统软件平台采用功能强大、稳定安全的Linux操作系统,使用的Linux内核版本为3.6.0。前期在OK6410开发板上完成Linux操作系统的移植、U-BOOT移植、文件系统制作与移植以及交叉编译环境的搭建[15]。系统软件设计要满足以下几个功能:①通过软件编程,控制CMOS摄像头传感器,实现视频数据的采集;②完成文件系统搭建以及FLASH和 SD卡存储设备驱动,使所采集视频信息可以保存到本地存储设备;③完成基于Linux的TCP并发服务器搭建[16];④在软件编程上考虑使用对应的硬件视频编解码控制器驱动软件代码,通过S3C6410的H.264硬件编码器[17]和PP硬件多媒体转换器[18],完成视频硬件H.264编码和缩放转码功能;⑤因为系统需要使用按键作为系统功能控制输入设备,所以在软件设计上需要加上对应按键驱动。系统软件功能结构设计如图2所示。

2 系统功能模块设计

2.1 V4L2视频框架设计

V4L2视频框架只能在Linux操作系统上运行,是针对uvc免驱USB设备的编程框架,主要用于设置摄像头的频率、帧率、视频压缩格式等图像参数,完成对USB摄像头设备图像数据的采集,在APP编程中主要使用该框架提供的API和驱动命令工作。该框架的工作模式如图3所示。

针对v4l2_camera.h新定义了描述摄像头捕捉的结构体CAMERA_CAPABILITY,该结构体定义如下:

typedef struct

{  /* output param */

int cam_fd;

unsigned int width;

unsigned int height;

unsigned long int file_length;

unsigned long int data_size;

int isstreaming;                  // state

void *mem[NB_BUFFER];       // 内核视频缓冲区长度

struct v4l2_capability cap;        // 摄像头查询驱动能力

struct v4l2_fmtdesc fmtdesc;      // 摄像头支持的视频格式

struct v4l2_format format;        // 摄像头视频参数

struct v4l2_requestbuffers req;     // 前端数据缓冲区转换物理地址

struct v4l2_buffer buf;           // 前端视频缓冲区

}CAMERA_CAPABILITY;

系统创新设计了v4l2框架操作,在v4l2_camera.c源文件中实现了摄像头捕捉,相关操作实现如下:

extern int Camera_Init(CAMERA_CAPABILITY *cam)    // 初始化v4l2框架

extern int Camera_Start(CAMERA_CAPABILITY *cam)   // 开启视频捕捉

extern int Camera_Stop(CAMERA_CAPABILITY *cam)    // 停止视频捕捉

extern int Camera_Grab(CAMERA_CAPABILITY *cam

#if CAM_PHOTO

char *photo_name,

int volatile *photo_enable_flag

#endif

)  // 循环捕捉一帧

extern int Camera_Exit(CAMERA_CAPABILITY *cam)    // 退出视频捕捉

操作流程如下:

(1)调用Camera_Init(&cam);初始化摄像头捕捉程序。

(2)调用Camera_Grab(&cam,PHOTONAME,&photo_post);进行一帧图像的捕获,其中第二和第三个参数在用户配置宏CAM_PHOTO非0时有效。PHOTONAME为保存图片的名字,photo_post为是否拍照的flag标准,非0代表保存当前帧图片,保存格式默认为BMP图片文件格式。

(3) 调用Camera_Exit(&cam);退出摄像头视频捕捉。

2.2 循环链表缓冲池设计

本系统创新设计了循环单向链表缓冲池,使用该缓冲池可明确分离输入输出设备,提高系统模块化水平,很简单地增加输入或输出设备数量使之同时工作。循环单向链表缓冲池结构如图4所示。

循环链表缓冲池设计方案如下:

在queue.h中新定义了描述循环链表节点NODE和缓冲池的结构体MyQueue:

typedef struct signal_loop_chain

{

unsigned int * dataaddr;

unsigned long int len;

struct signal_loop_chain *next;

}NODE;

typedef struct _QUEUE

{

NODE *queue_head;

NODE *queue_end;

int n;

}MyQueue;

在queue.c源文件中定義了功能函数的实现,具体如下:

extern NODE *Create_loop_chain(int n);    // 循环链表缓冲池创建

extern int Quere_Show();  // 打印当前链表信息,调试用

extern int Quere_Read_Buf(S3C_HD_JPEG_DECODE_INFO *to

#if WEB_CAP

,WEB_STREAM_CAP *web

#endif

);   // 读链表某一数据块

extern int Quere_Write_Buf(CAMERA_CAPABILITY *in);  // 写链表某一空块

extern int Free_loop_chain(); // 链表注销资源

设计链表后,还需要利用存储空间块储存数据,故使用OK6410的硬件cached内存分配器,获取8块cached虚拟内存区域,在链表初始化时依次插入到链表中。

采用循环链表缓冲池优化了存储,同时使用多线程编程,极大优化了系统执行灵活度,提高了系统模块化程度,但是随之产生的是线程同步问题。

在Linux线程同步中,有POSIX无名信号量、POSIX有名信号量、线程互斥锁、线程读写锁、线程条件变量等几种同步机制[19]。综合比较这几种同步机制,本系统采用POSIX无名信号量和线程读写锁作为缓冲池的同步机制,使用POSIX无名信号量用于读写缓冲池同步。由于多用户的网络数据传输模型与单一写多个同时读取的同步模型相似,故使用线程读写锁用于多用户网络数据流传输,从而实现系统稳定的同步机制。

3 系统调试与测试

本系统调试工作主要有:串口调试、摄像头数据捕捉调试、网络调试、HTTP服务器调试。

3.1 串口调试

本系统需要串口进行Linux命令和调试信息传输。OK6410开发板自带COM19针串口接口,并在系统软件設计中留有DEBUG配置宏和config.h配置文件,故只需在电脑上开启串口软件,同时在配置文件中打开DEBUG宏,即可在串口中打印系统调试日志信息。

3.2 摄像头数据捕捉调试

本系统使用罗技C270高清USB摄像头,该款摄像头支持USB2.0,最大分辨率为1 024×768,感光元件为CMOS。在使用前打开总线热插拔功能,注册USB摄像头驱动程序以及V4L2驱动。

在设计调试中发现,OK6410开发板的USB Host是1.1接口,Linux在识别USB1.1接口后,强制减缓了V4L2框架的最大传输速率,导致V4L2框架识别的YUV格式分辨率只有160×120。为了得到较为正常的分辨率,系统使用了经过压缩的MJPEG图像,其分辨率可以达到800×600,基本满足设计要求。开启摄像头捕捉调试宏,通过调试信息查看摄像头捕捉子系统是否正常工作。经上板测试,该摄像头捕捉子系统工作正常。

3.3 网络调试

OK6410开发板带有RJ-45网络变压器,开发板使用192.168.0.232作为自身的IP地址,使用网线将其与路由器相连,然后在电脑上使用PING命令检测网络层是否可以建立连接。经上板测试,该开发板可与电脑正常通信。

3.4 HTTP服务器调试

在调试HTTP服务器前,需要将自行开发的几个HTML文件放入BOA指定的www文件夹中,BOA默认使用index.html作为主页[20]。调试时使用boa命令打开BOA服务器守护进程,然后利用IP地址即可登陆服务器页面,如图5所示。

输入账号密码后,CGI程序将通过数据库查询账号密码是否符合要求。如果符合要求则跳转到控制页面,如图6所示。

按下“视频预览选择”中的视频图标后,将进入视频实时监控页面,如图7所示。

按下“视频预览选择”中的照相机图标后进入拍照演示页面,如图8所示。

4 结语

本系统利用嵌入式系统优点,在OK6410开发板基础上设计了一种基于Linux操作系统的视频监控系统,同时创新设计了V412框架操作,实现了摄像头抓拍功能,并创新定义使用了循环链表缓冲池,以及采用POSIX无名信号量和线程读写锁的同步机制,极大优化了系统执行灵活度,提高了软件模块化水平。上板调试与测试表明:本系统稳定可靠,图像实时准确,日志记录功能方便调试,符合设计预期要求,同时系统可扩展性良好,对安防监控系统设计有借鉴作用。

参考文献:

[1] NAERING N, VENETIANER PL, LIPTON A. The evolution of video surveillance:an overview[J]. Machine Vision and Application,2008,19(5):279-290.

[2] 马瑜晨,许全宜. 基于模拟和数字技术相结合的视频监控系统[J]. 电子技术与软件工程,2018,63(6):62-63.

[3] RAJESH N, SAROJADEVI H. Emerging trends in video surveillance application[C]. Proceedings of International Conference on Software and Computer Application,2011:125-128.

[4] 钱晓东. 摄像机监控的发展与应用[J]. 中国安防,2013(1):56-60.

[5] 王若涵. 网络视频监控系统现状与发展趋势研究[J]. 科技与创新,2018(1):79-80.

[6] 薛树滨. 基于嵌入式Linux的移动视频监控系统[D]. 济南:山东大学,2014.

[7] 陶祥亚,仲兆满. IPv6环境下嵌入式视频监控系统设计与实验性研究[J]. 智能建筑与智慧城市,2017(4):44-48.

[8] 王菲. 嵌入式智能家居控制系统的设计[J]. 电子技术与软件工程,2017(16):193-194.

[9] 郝俊,孟传良. 基于V4L2的ARM11 USB视频采集终端的设计与实现[J]. 贵州大学学报:自然科学报,2011,28(4):74-78.

[10] 刘科. 基于C/S的局域网内远程控制系统的设计与实现[D]. 成都:电子科技大学,2015.

[11] ANTONY J,MATHURIA D S,DATTA T S,et al. Development of intelligent instruments with embedded HTTP servers for control and data acquisition in a cryogenic setup——the hardware, firmware,and software implementation[J]. Review of Scientific Instruments,2015,86(12): 131-132.

[12] WANG Y, PANG Z Y, WANG S, et al. Design and implementation of embedded wireless video monitoring system[J]. Journal of Chongqing University of Technology, 2015, 29(4):67-72.

[13] 刘磊. 基于CMOS图像传感器的无线视频监控系统设计[D]. 上海:上海师范大学,2015.

[14] JIA Y. S3C6410(OK6410开发板介绍) [EB/OL]. https://blog.csdn.net/qq_33265533/article/details/53048380

[15] PAN L,WANG W. Design of the remote video monitoring system platform[J]. Ieri Procedia,2012,2(4):62-68.

[16] 徐成杰. 创建高效的多用户TCP服务器[J]. 计算机应用,2002,22(2):110-112.

[17] 肇启龙. 基于网络和H.264的视频监控系统设计[J]. 电子科技,2015,28(2):113-118.

[18] 甄聪聪,赵磊. 基于RTSP和H.264的嵌入式网络视频监控系统[J]. 科技信息,2014, 10(1):121-128.

[19] 吴宇佳,浦伟,周妍. Linux下多线程数据采集研究与实现[J]. 信息安全与通信保密,2012:90-94.

[20] ZHAO H, XIAO C, ZHUO L, et al. The design of embedded video system based BOA server[C].  International Conference on Computer Science&Service System,2012: 483-486.

(责任编辑:杜能钢)