一种带有运动检测功能的无线图像监控终端
扫描二维码
随时随地手机看文章
传统的无线图像监控系统,需要不间断地把监控图像传送至监控中心,而这些监控图像中的有用图像却只占少数,这就浪费了大量的数据流量,也增加了成本。同时,监控人员必须时刻注意监控画面,这不仅枯燥乏味,而且很容易忽略掉重要的监控画面。因此,开发一种能自动筛选出用户感兴趣的图像并发送至监控中心的监控终端具有重要意义。
本无线监控终端以三星公司的S3C2440A为主控芯片,移植了Linux操作系统。系统对USB摄像头采集到的图像进行运动检测,如果有物体在监控区域内运动,则将监控图像通过GPRS传送至监控中心。由于只发送用户感兴趣的监控图像,从而大大降低了无线数据传输中的数据流量,避免了传统无线监控系统中因传输大量无用的监控图像而造成的数据流量浪费,同时也减轻了监控人员因长时间监视监控图像带来的工作强度。
1 系统构成
本系统由硬件、底层软件和应用软件三部分组成,系统结构如图1所示。
系统硬件的微处理器采用三星公司的S3C2440A处理器,该处理器内含一个ARM920T内核,标准工作频率为400 MHz,内嵌丰富的外围设备,片外扩展64 MB的Nandflash(型号:K9F1208D0A)和2片32 MB的SDRAM(型号为HY57V561620);摄像头采用基于ZC301器件的奥尼S888,采用CMOS感光器件,48万像素,最大分辨率为800×600,需要单独安装驱动程序。GPRS模块采用华为公司的GTM900双频段GSM/GPRS无线模块,它支持标准的AT命令及增强AT命令,内嵌TCP/IP协议,工作频段为800 MHz/900 MHz/1 800 MHz/850 MHz/1 900 MHz。本系统采用RS232串口与S3C2440相连,SIM卡电压为3 V。
底层软件由BootLoader(vivi)、嵌入式Linux内核(版本为2.6.17)、设备驱动程序、文件系统组成。在内核配置中,需要添加对视频设备编程接口的支持,配置菜单路径选择Device Drivers->Multimedia device->Video for linux。
应用软件主要包括数据采集、运动检测和图像传输三部分。
2 应用软件设计
2.1 基本流程
应用软件的核心模块包括图像采集模块、运动检测模块和GPRS无线数据传输模块。首先图像采集模块用USB摄像头采集分辨率为320×240的图像,然后运动检测模块采用改进的帧差法对采集到的图像进行运动检测。如果运动检测模块检测出监控区域内有运动物体,则将有物体运动的图像添加到图像发送队列,并唤醒GPRS数据传输线程,将队列中的图像发送至监控中心。当图像发送队列中的图像全部被发送出去后,GPRS数据传输线程将置于休眠状态。
2.2 Video4Linux的图像采集
Video4Linux是Linux中关于视频设备的内核驱动,它为针对视频设备(常见的电视捕获卡及USB口的摄像头)的应用程序编程提供一系列接口函数,同时也提供无线电通信和文字电视广播解码和垂直消隐的数据接口[2]。本文主要针对USB摄像头设备文件/dev/video0进行图像采集方面的程序设计。下面介绍主要步骤及部分代码:
(1)打开视频设备
int fd; //为视频设备的文件描述符
fd=(open(“dev/video0”,O_RDWR));
if(fd<0){ //打开失败
printf(“No Camera found!n”);
exit(-1);
}
(2)读取设备信息
ioctl函数将摄像头的信息存放到结构videocap中,摄像头信息主要包含名称、类型、通道数、图像宽度、图像高度等。
struct video_capability videocap;
if(ioctl (fd,VIDIOCGCAP,&videocap) == -1){
printf(″Couldn′t get videodevice capability″);
exit(-1);
}
(3)更改设备当前设置
设置图像帧的属性,将需要设置的属性保存在结构体videopict中,主要包含图像亮度、色彩、对比度、调色板参数等。
if (ioctl (fd,VIDIOCSPICT,&videopict) < 0){
printf(″Couldnt set videopict params with VIDIOCSPICT″);
exit(-1);
}
(4)图像采集
图像采集主要有2种方式:read()直接读取和mmap()内存映射。本系统采用mmap()内存映射方式。
vmmap.height=240;
vmmap.width=320;
vmmap.format=vd-> VIDEO_PALETTE_JPEG;
ioctl (vd->fd,VIDIOCMCAPTURE,&(vd->vmmap);
ioctl (vd->fd,VIDIOCSYNC,0);
pFramebuffer=(unsigned char*) mmap(0,vd->videombuf.size,
PROT_READ | PROT_WRITE,MAP_SHARED,vd->fd,0);
第一个ioctl()设置了采集的图像大小为320×240,图像格式为JPEG;第二个ioctl()设置为单帧采集,再用mmap()函数将图像数据映射到pFramebuffer指针所指的内存中。
2.3 运动检测
采集到监控图像之后,就可进行运动检测了。视频图像处理中,运动目标检测方法主要有背景差分法、帧差法和光流法。本系统采用帧差法。其原理是:当监控区域内有物体运动时,在采集的图像帧中,对应区域的像素值会发生明显变化,这时只需将两帧差分,得到两帧图像亮度差的绝对值。如果绝对值比所设定的阈值大,则区域内存在运动物体;反之,则不存在运动物体。用公式表达如下[3]:
实际应用中,阈值T的选择相当关键。如果阈值过低,则不能有效地抑制图像中的噪声;反之将抑制图像中有用的变化信息。通常阈值的选择与监控场景的光照和摄像头位置等外界具体环境条件有关,不可能对不同监控环境设置相同的阈值。本文采用对不同的监控环境自动计算阈值,方法是在开始采集图像前,先采集N幅背景图像,将这些图像亮度分量的平均值作为该监控环境的阈值。公式如下:
本系统只需检测出监控区域内有无物体运动,无需提取出对象的完整区域,因此只需在图像差分时,统计大于阈值T的像素点数。如果像素点数超过报警阈值,表明有物体运动;反之则可能是光线变化或噪声干扰。这样不仅避免帧差法无法精确计算运动区域的缺点,同时也减轻了处理器的运算压力。程序流程如图2所示。
2.4 GPRS无线数据传输
本系统的GPRS模块主要用于将送入图像发送队列中的有运动物体的监控图像传输至监控中心。数据的发送流程图如图3所示。
GPRS模块GTM900B的主要初始化流程为:配置APN->进入TCPIP功能->打开一条TCP链接,由于该模块内嵌TCP/IP协议,直接操作AT指令就可实现数据传输,主要初始化部分代码如下:
SendData(″AT+CGDCONT=1,″IP″,″CMNET″″,13);
… //检查是否配置成功
SendData(″AT%ETCPIP″,13);
… //检查是否进入tcpip
SendData(″AT%IPOPEN=″TCP″,″202.206.1.26″,23″,13);
…
函数SendData()的功能是向串口设备发送数据。
初始化时需注意两点:
(1)模块上电20 s~30 s后再进行TCPIP相关命令的使用,因为模块需要时间搜索网络,以及相关信息初始化等。
(2)使用AT%ETCPIP命令,当命令还没有返回时,串口有任何输入都会导致该命令强制结束,有%IPCLOSE:5的返回,表明模块退出TCPIP功能,这时必须重新使用AT%ETCPIP进行TCPIP功能的打开操作。
当GPRS模块初始化成功后,模块就已经接入Internet,此时就可进行无线数据传输了,主要操作AT指令:AT%IPSEND。需要注意的是,在设置AT%IOMODE=1的数据传输模式下,数据包大小不能超过1 024 K,因此一幅图像须分割成多个数据包进行传送,而且数据收发时需要进行ASCII和HEX的格式转换。
3 测试结果
实际测试时,监控环境的阈值计算值为11,报警阈值取1 000,灰度值转换公式为gray=r×0.3+g×0.6+b×0.1,计算出的大于阈值的像素点有13 562个,大于报警阈值,GPRS模块开始传送图像。试验图像如图4所示。
S3C2440A的核心工作频率为406.425 MHz,当GPRS模块空闲时,从采集两幅320×240分辨率的图像开始到运动检测结束,时间约为55 ms,当GPRS忙时,时间约为115 ms,基本可以实现对有运动物体的监控图像的捕捉。GPRS模块发送一幅采集的JPEG图像,在网络正常情况下,系统延时通常不超过5 s。
本文简要介绍了无线监控终端的系统构成,详细阐述了应用软件的3个核心模块的实现方法。试验运行结果表明,本系统实现了将有运动物体的监控画面传输至监控中心的要求,具有成本低、结构简单等特点。与传统的无线监控系统相比,本系统可大大降低无线数据传输中的数据流量,同时也省去了监控人员长时间监视监控图像的工作。此外,本系统在软硬件设计时充分考虑了不同用户的需求,只需对软硬件稍加扩展,就可实现将监控画面或报警短信传送至用户的彩信手机,具有很好的使用和推广价值。