基于ARM的实验室红外感应视频报警系统的设计与实现

2014-11-19 00:32张滔古桃强曹子成贺绍存黄志敏
电脑知识与技术 2014年30期

张滔 古桃强 曹子成 贺绍存 黄志敏

摘要:基于ARM S3C6410平台,研究人员结合HR-S501人体热感红外模块和摄像头模块,运用H264视频压缩技术和百度云后台上传技术,设计开发了基于ARM的实验室红外监控视频报警系统。实现了由红外模块实现监控,摄像头辅助进行报警,传输视频到移动客户端等的功能。

关键词: ARM;视频压缩;红外感应;百度云

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)30-7085-05

计算机、通信、网络控制及嵌入式等技术的飞速发展, 信息交换沟通领域的不断扩大, 覆盖了从现场设备到控制、管理的各个层次。嵌人式系统因其稳定性、实时性高的特点,已在工业、国防、运输及航天等领域被广泛地应用。如果将嵌人式系统连接到应用广泛的网络上, 则几乎可以方便、低廉地将信息传到世界的任何一个地方来进行远程监控。嵌人式远程监控系统现已成为工业控制网络重要的发展方向之一。基于的远程监控系统是信息网络与控制结合的产物,它借助网络完成监视控制任务, 将监视范围扩大到更大的空间, 进一步推进了控制技术向网络化、分散化和开放化的发展[1]。

目前,在高等院校中的实验室监控系统都是采用传统的安防系统设计的24H摄像头录像进行监控。这种方式不仅大大浪费了摄像头的有效工作时间,而且不间断地工作也会缩短摄像头的使用寿命。基于实验室等高校教室的监控我们设计了一种更高效的监控方式,此方案相比于传统监控系统不仅大大缩短了摄像头的工作时间,而且大大提高了了摄像头采集信息的有效性。同时此方案也将移动技术融合到设计中来,将适用范围从传统的实验室扩展到家庭安防监控的队列,而移动技术的加入更是将实时监控信息反馈到目标客户端上,并且更加精准,更加方便。

本方案通过利用ARM S3C6410主板强大的硬件资源和LINUX系统设计了一套基于ARM的红外感应的视频报警系统。本方案主要由红外模块完成全天候的监控工作,摄像头进行辅助监控,H264视频压缩技术进行视频压缩,百度云实现视频的移动端对接。由于工业标准的红外模块不仅在强度上大大超过了传统摄像头的质量,而人体热感的立体监控在监控效果上面也大大超过了传统摄像头的监控系统。而红外探头的小巧隐蔽的特点使得此监控系统更容易布置和监控[2]。

1 总体框架设计

整体技术方案由前端用户端和后台硬件端组成。前端软件端主要是方便用户对日常监控的一些简单功能修改操作,主要的功能是登陆、修改信息、更改用户权限。后台硬件控制端主要包括了以下内容:1) 视频控制端:主要实现对已录制视频的压缩截取与后台转发; 2) 录像控制:主要实现信号感应还有录像的控制; 3) 传输控制:主要实现选择网络环境与百度云存储; 4) 监控管理:主要实现后台数据的用户存储推送.

整个系统的主体设计框架图如图1所示。

2 硬件设计

对于整个硬件端的设计我们进行了如下构思,根据设计要求,我们将整个监控端系统分成了以下几个部分:

1) 监控设备层,该部分主要包含了红外模块和摄像头模块,将此核心监控部分独立出来不仅便于设备的布线,也便于设备的正常运转,一旦系统出问题,这种分区式的结构将大大减少查错的时间。

2) 网络设备层,该部分主要包含了3G无线网卡,WIFI模块等通信设备,该层主要负责监控设备端的视频信息的转移,正是通过此层才得以实现监控视频直接到移动端的目的。

3) 内部控制管理层,主要以整个以太网、ARM11主控控制器组成。主要完成整个系统的信息搜集、处理和发布,同时承担着对整个系统的统一管理和监控。

硬件部分的ARM控制部分核心如下图所示:

图2 ARM硬件结构图

由ARM11核心微处理器连接各种输入,通过CPLD(Complex Programmable Logic Device)复杂可编程逻辑器件实现诸如红外,摄像头,3G,WLAN等各种模块的编程。有了ARM11处理器和CPLD的连接,从而全面实现了从信号输入输出,编程实现上来完成真正的ARM控制层[3]。

作为驱动监控设备的触发点,人体红外的探测距离、灵敏度和稳定性都是需要考虑的。在此我们选择了HC-SR501人体红外感应模块,它是基于红外线技术的自动控制模块,采用德国原装进口LHI778探头设计,基于人体测量的设计,适合用于实验室等安防报警的设计,同时它的高精度探测距离较远,灵敏度高,可靠性强,军工品质也保证了所选模块的使用寿命;摄像头作为整个系统的核心辅助,作用在于当红外探测发现系统异常需要报警的时候,摄像头能够完成拍摄而且对拍摄的清晰度有一定的要求,由于我们使用了云技术将视频同步到云端用移动设备查看。所以摄像头所拍视频的大小要有一定的限制,因此我们选择了主流130W像素的OV9650作为整个系统的摄像工具。不仅保证了其摄像的清晰度,也能保证在H264压缩模式下视频所占内存的最小化。

3 软件设计

程序主要是应用嵌入式技术的后台监控,软件起着辅助操作的作用,所以对于软件的考虑仅仅是辅助用户使用,为此设计软件的第一层是用户登陆关卡,第二层主要是常用的一些功能的融合。

3.1 常用功能融合

首先是常用的身份验证,除去常用的身份验证流程。

主要采用以下模式进行常用功能模块的嵌入,原理如4图所示。

图4采用了五个主要方式去实现整个软件界面:其中开启监控与开启3G,wifi、为用户主动开启装置,不仅可以检验设备状态,也可以随意切换网络模式进行监控的调试。

其余三种功能主要是为了方便用户更好的使用本软件。其中添加百度云账号方便了用户直接更改移动端的账号,即使用户变更账号也不用通过后台去修改。控制录制时间主要是方便用户的视频监控的时间间隔,便于用户使用自己喜欢的时间间隔进行收集,程序默认的录制时间为3S。监控管理部分主要便于用户进行前台的日常维护,即不通过后台也能完成软件功能检查,可用性维护等功能的实现。

其中我们是用的百度云上传技术,其中部分代码为:

int main(int argc, char **argv) {

int ret = 0;

if (argc < 2) {

usage();

return 1;}

char *command = argv[1];

argc —;

argv ++;

curl_global_init(CURL_GLOBAL_ALL);

if (strcmp(command, "info") == 0) {

ret = command_info(argc, argv);

} else if (strcmp(command, "ls") == 0) {

ret = command_ls(argc, argv);

} else if (strcmp(command, "upload") == 0 || strcmp(command, "up") == 0) {

ret = command_upload(argc, argv);

} else if (strcmp(command, "download") == 0 || strcmp(command, "down") == 0) {

ret = command_download(argc, argv);

} else if (strcmp(command, "mv") == 0) {

ret = command_move_or_copy(argc, argv, "mv");

} else if (strcmp(command, "cp") == 0) {

ret = command_move_or_copy(argc, argv, "cp");

} else if (strcmp(command, "rm") == 0) {

ret = command_remove(argc, argv);

} else {

color_log(COLOR_LOG_ERROR, "未知命令!\n");

usage();

ret = 1;

}if (api != NULL) {

BaiduPCS_Free(api);

}curl_global_cleanup();

return ret;

}

百度云主要使用了CURL技术,这是一种命令行方式下工作的开源文件传输工具,然后使用一种轻量级数据交换个格式JSON(JavaScript Object Notation),使用它与百度的PCS接口交互,从而在开发板上直接用对存储在百度网盘里的东西进行操作[4]。

以下来是H264即录像时间控制和压缩的部分代码:

int main(int argc, char **argv)

{int mytime;

if(argv[1] == NULL)

mytime=3;

else

mytime=atoi(argv[1]);

FBOpen();

system("clear");

fflush(stdin);

int fd =open("/dev/adc", 0);

if (fd < 0) return 0;

int value = -1;

while(1)

{while(value<400)

{ value = -1;

char buffer[30] = "";

int len = read(fd, buffer, sizeof buffer -1);

if (len > 0)

{buffer[len] = '\0';

sscanf(buffer, "%d", &value);

//printf("%d\n",value);

}}

try

{struct timeval start,end;

// TFrameBuffer FrameBuffer;

TVideo Video;

int timeuse = 0;

int oldTimeUse = 0;

TH264Encoder Encoder;

gettimeofday( &start, NULL );

for (;;)

{Video.FetchPicture();

Encoder.Encode(Video);

//FrameBuffer.DrawRect(Video);

gettimeofday( &end, NULL );

timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec;

timeuse /= 1000000;

if (oldTimeUse != timeuse)

{//printf(".\n");endprint