摘 要: 介紹了一種遠程視頻監(jiān)控系統(tǒng)的實現(xiàn)方案。其以嵌入式Linux和S3C2440A為核心平臺,通過嵌入式平臺將攝像頭采集的視頻信號進行壓縮,同時進行入侵檢測,再通過網(wǎng)絡(luò)將數(shù)據(jù)傳送至Web服務(wù)器。實現(xiàn)了一種體積小、成本低、數(shù)字化的監(jiān)控解決方案,具有廣泛的應(yīng)用價值。
關(guān)鍵詞: 嵌入式Linux;S3C2440A;圖像采集;Video4Linux;JPEG壓縮
隨著網(wǎng)絡(luò)、通信和數(shù)字信息技術(shù)的不斷發(fā)展,監(jiān)控系統(tǒng)的組成模式也在快速變化和發(fā)展中,當前網(wǎng)絡(luò)技術(shù)與嵌入式系統(tǒng)技術(shù)的結(jié)合催生了全新的基于嵌入式Web服務(wù)器的監(jiān)控系統(tǒng)。與傳統(tǒng)的視頻采集監(jiān)控系統(tǒng)相比,它具有可靠性高、組網(wǎng)方便、可遠程監(jiān)控等優(yōu)點,因而更適用于機要部門、工廠、市場、交通運輸?shù)陌卜辣O(jiān)控系統(tǒng)中[1]。
本文介紹了一種以S3C2440A開發(fā)板為基礎(chǔ)的嵌入式遠程監(jiān)控系統(tǒng)的實現(xiàn),該系統(tǒng)基于嵌入式Web服務(wù)器技術(shù),在嵌入式硬件平臺和Linux操作系統(tǒng)下進行。采用ov511芯片的網(wǎng)眼300CMOS攝像頭進行數(shù)字圖像采集,利用JPEG圖像壓縮編碼方式,進行視頻圖像入侵檢測,可以直接在以太網(wǎng)上解碼顯示。
1 視頻監(jiān)控系統(tǒng)總體設(shè)計
1.1 系統(tǒng)總體結(jié)構(gòu)
硬件系統(tǒng)是嵌入式系統(tǒng)的核心,它是承載軟件的實體,軟件通過它來控制各種接口。本系統(tǒng)中硬件的總體構(gòu)架包括系統(tǒng)存儲器、外圍接口電路、電源及復(fù)位電路等幾個部分。系統(tǒng)的總體結(jié)構(gòu)如圖1所示。
1.2 S3C2440A處理器概述
本系統(tǒng)使用的微處理器是三星公司生產(chǎn)的S3C2440A芯片,該芯片采用ARM公司的ARM920T的32 bit CPU核,并集成了ARM結(jié)構(gòu)的MMU單元,各有16 KB的指令緩存和數(shù)據(jù)緩存,最大尋址空間為1 GB,主頻為400 MHz(最高可達533 Hz)。
S3C2440A提供了豐富的片內(nèi)資源:64 MB SDRAM、256 MB Nand Flash、2 MB的NOR Flash、LCD控制器(STN/TFT)、DM9000E型網(wǎng)卡、4通道的DMA、3通道的異步串口(UART)、兩通道的高速同步串行口(SPI)、4通道的帶脈寬調(diào)制的PWM定時器和1通道內(nèi)部定時器/看門狗定時器、雙端口的USB(主機)、1端口的USB(設(shè)備)、8通道10 bit ADC、觸摸屏接口、鎖相環(huán)(PLL)片上時鐘發(fā)生器、通用I/O端口、相機接口、SD卡和MMC卡接口。其支持各種型號的ROM引導(dǎo)(Nor/Nand Flash,EEPROM或其他),1.2 V內(nèi)核供電,1.8 V/2.5 V/3.3 V存儲器供電,3.3 V外部I/O供電,具備16 KB的I-Cache和16 KB D Cache/MMU微處理器。
2 系統(tǒng)軟件開發(fā)平臺的建立
本系統(tǒng)使用Linux操作系統(tǒng),編譯環(huán)境采用交叉編譯調(diào)試方式。內(nèi)核采用Linux 2.6.30.4版本,使用Cramfs根文件系統(tǒng)。
2.1 嵌入式交叉編譯環(huán)境搭建
在裁剪和定制嵌入式Linux之前,必須先建立起編譯環(huán)境。由于一般的嵌入式開發(fā)系統(tǒng)的存儲空間有限,因此通常使用交叉編譯環(huán)境。簡單地說,交叉編譯就是在一個平臺上生成另一個平臺上的可執(zhí)行代碼,即在宿主機(PC機)安裝開發(fā)工具,編輯、編譯開發(fā)板上的引導(dǎo)程序(Bootloader)、內(nèi)核和根文件系統(tǒng),使其能在開發(fā)板上運行。本系統(tǒng)使用的編譯系統(tǒng)為arm-linux-gcc-3.4.1版本。
2.2 Linux系統(tǒng)的移植
從網(wǎng)上下載標準的Linux-2.6.30.4版本內(nèi)核,使用解壓命令#tra xvfj linux2.6.30.4tra.bz-C/opt/EmbedSky/,然后解壓到PC的“opt/EmbedSky”目錄下。由于系統(tǒng)還不支持ARM,因此必須在系統(tǒng)中添加對ARM的支持,進入內(nèi)核源碼,修改“Makefile”文件,將“ARCH?= (SUBARCH)”修改為“ARCH=arm”,將“CROSS_COMPILE?=”修改為“CROSS_COMPILE=arm_linux_”,進行保存。在配置單中導(dǎo)入對內(nèi)核的默認配置,再在此基礎(chǔ)上選擇需要的功能,如Nand Flash、Video4Linux編程接口函數(shù),MTD設(shè)備、USB設(shè)備的支持及Cramfs文件系統(tǒng)的支持。再使用Cramfs制作工具mkcramfs把根文件目錄制作成映像文件,最后安裝DM9000E芯片網(wǎng)卡的驅(qū)動程序,即完成了系統(tǒng)移植。
3 視頻數(shù)據(jù)處理模塊設(shè)計
3.1 基于V4L的視頻采集設(shè)計
Linux對于視頻數(shù)據(jù)采集設(shè)備的支持是通過Video4Linux(V4L)來實現(xiàn)的。V4L是在Linux下用于視頻和音頻數(shù)據(jù)的API接口,它為視頻設(shè)備的應(yīng)用程序提供了一系列的接口函數(shù)。這些視頻設(shè)備包括市場上常見的電視捕獲卡和USB接口的攝像頭等[2]。
在編寫圖像采集程序時,根據(jù)需要定義一個結(jié)構(gòu)體來保存采集過程中需要的各種參數(shù)。該結(jié)構(gòu)體如下:
typedef struct v4l_struct{
in fd;
struct video_capability capability; //設(shè)備的基本信息
struct video_channel channel[4];//各個信號源是屬性
struct video_picture picture;//設(shè)備采集的圖像的各種屬性
struct video_window window;//capture area的信息
struct video_capture capture;
struct video_buffer buffer;//最底層對buffer的描述
struct video_mmap mmap;//用于mmap
struct video_mbuf mbuf;//利用mmap進行映射的幀的信息
unsigned char *map;
int frame;
int framestat[2];
}v4l_device;
從上面的結(jié)構(gòu)體可以看出,想要完成視頻數(shù)據(jù)的采集,首先要獲得對應(yīng)視頻采集設(shè)備的信息和圖像的信息,同時需要對采集的窗口、顏色模式和幀的狀態(tài)進行初始化,然后才能進行視頻圖像的采集。視頻采集流程如圖2所示。
下面對V4L編程中使用的函數(shù)進行簡單的介紹。
(1)打開視頻設(shè)備,調(diào)用函數(shù)int v4l_open(char*dev,v4l_device*vd);函數(shù)調(diào)用成功后,返回的文件描述就代表了所捕獲的設(shè)備硬件。
下面的幾步都會用到ioctl()函數(shù)來和設(shè)備進行“對話”,ioctl是input output control的縮寫,函數(shù)原型是int ioctl(int fd,ind cmd,…)。其中,fd表示設(shè)備的文件描述,cmd表示用于程序?qū)υO(shè)備的控制命令,省略號一般是一個類型的參數(shù),也可省略。
(2)讀取設(shè)備信息。用ioctl()函數(shù)讀取struct video_capability中有關(guān)攝像頭的信息。該函數(shù)成功返回后,將結(jié)果存放到vd->capability中。程序如下:
int v4l_get_capability(v4l_device*vd){
if(ioctl(vd->fd,VIDIOCGCAP,&(vd->capability))<0){
preeoe(“v4l_get_capability:”);
return-1;}
return 0;
}
(3)讀取視頻信息。同樣使用ioctl()函數(shù),從struct video_picture中讀取視頻信息,函數(shù)成功返回后,將結(jié)果存放在vd->picture中。調(diào)用的函數(shù)如下:
int v4l_get_picture(v4l_device*vd) {
if(iotcl(vd->fd,VIDIOCGPICT,&(vd->picture))<0{
perror(“v4l_get_picture:”);
return-1;}
return 0;
}
(4)視頻圖像截取。有兩種方法截取視頻圖像:直接讀取設(shè)備(read())和內(nèi)存映射方式(mmap())。本系統(tǒng)采用內(nèi)存映射方式,mmap()系統(tǒng)調(diào)用使得進程之間通過映射同一個普通文件實現(xiàn)內(nèi)存共享。將普通文件映射到進程的地址空間中,進程就可以像訪問普通內(nèi)存一樣訪問文件,無需再調(diào)用read()、write()等操作。所調(diào)用的mmap代碼如下:
int v4l_mmap_int(v4l_device *vd) {
if(v4l_get_mbuf(vd) <0)
return-1;
if((vd->map=mmap(0,vd->mbuf.size,PROT_READ|PROT_WRITE,MAP_SHARED,vd->fd,0))<0){
perror(“v4l_mmap-int:mamap”);
return-1;}
return 0;
}
執(zhí)行完mmap之后,便可以進行真正的圖像采集,需要調(diào)用兩次iotcl()函數(shù),命令代碼是VIDIOCMCAPTURE和VIDIOCSYNC。VIDIOCMCAPTURE的作用是告知ioctl()將圖像數(shù)據(jù)采集到mmap所映射的內(nèi)存中。如果調(diào)用成功,就開始一幀圖像的截取,VIDIOCSYNC用來判斷這一幀的截取的否成功,若成功,就表明這一幀的截取已完成,可以開始下一幀的截取。本系統(tǒng)采用連續(xù)幀采集方式,具體的代碼就不在這贅述了[3]。
3.2 視頻數(shù)據(jù)壓縮
在獲得視頻數(shù)據(jù)后,由于原始的圖像數(shù)據(jù)量較大,網(wǎng)絡(luò)帶寬有限,需要在網(wǎng)絡(luò)傳輸前進行壓縮。本系統(tǒng)由于硬件條件的限制,為了達到遠程視頻監(jiān)控的效果,采用基于MJPEG算法進行視頻壓縮。其主要特點是動態(tài)使用JPEG算法,基本不考慮視頻流中不同幀之間的變化,只單獨對某一幀進行JPEG壓縮,配合嵌入式Web服務(wù)器,采用基于Socket的編程,實現(xiàn)了面向用戶端的視頻監(jiān)控[4]。
對于Linux下的JPEG圖像數(shù)據(jù)壓縮,可以使用Libjpeg庫實現(xiàn)。Libjpeg是Linux下的一個標準而常用的庫,它的功能是將圖片以一定的壓縮比率壓縮成如JPEG格式的圖片,或者對JPEG圖片進行解壓縮以及其他一些對JPEG圖片進行處理的功能。Libjpeg的主要文件有jpeglib.h、libjpeg.a和libjpeg.so等??梢匀ゾW(wǎng)上下載Libjpeg的源碼,取得文件jpegsrc.v6b.tar.gz,放于/usr/src目錄下。依次執(zhí)行:
#cd/usr/src
#tar xzvf jpegsrc.v6b.tar.gz
#./configure
#make
#make install
執(zhí)行完上述命令后,jpeglib.h被拷到/usr/include目錄下,libjpeg.a和libjpeg.so被拷到/usr/local/lib目錄下,至此,Libjpeg庫的安裝配置完成。
3.3 視頻圖像的入侵檢測
視頻序列檢測是為了能夠?qū)崿F(xiàn)在監(jiān)控過程中的自動報警。報警系統(tǒng)是視頻監(jiān)控系統(tǒng)中不可或缺的一部分。在數(shù)字視頻監(jiān)控系統(tǒng)中,圖像序列的運動檢測及報警不僅可以自行替代監(jiān)視人員的部分工作,提高監(jiān)視系統(tǒng)的自動化水平,而且還可以提高監(jiān)控存儲效率。
本視頻監(jiān)控系統(tǒng)主要是對視頻是否有入侵對象進行分析檢測,一旦畫面上出現(xiàn)超過閾值的變化就會自動報警。
運動目標檢測的方法主要可以分為幀差法、流光法和背景差法三種。本系統(tǒng)使用背景差法,因為視頻監(jiān)控系統(tǒng)主要使用規(guī)定的攝像機對場景進行監(jiān)控,場景固定。背景差法的基本思想是通過輸入圖像與背景模型進行比較的方法檢測運動目標[5]。
本文結(jié)合視頻監(jiān)控系統(tǒng)發(fā)展的方向,給出了一種基于嵌入式ARM的視頻監(jiān)控系統(tǒng)設(shè)計方案,并給出了系統(tǒng)的實現(xiàn)方法。本系統(tǒng)采用了基于模塊的設(shè)計方法,各個模塊之間相互獨立,增強了系統(tǒng)的健壯性和靈活性,當需要更換其中一個模塊時,其他模塊并不需要進行很大的改動,有利于系統(tǒng)的更新?lián)Q代。
參考文獻
[1] 于明,范書瑞,普祥燁.ARM9嵌入式系統(tǒng)設(shè)計與開發(fā)教程[M].北京:電子工業(yè)出版社,2006.
[2] 張曉東,李秀娟,張杰.基于ARM的嵌入式遠程監(jiān)控系統(tǒng)設(shè)計[J].現(xiàn)代電子技術(shù),2008,31(6):22-23.
[3] 楊穎,陳之龍,黃志.基于USB攝像頭的嵌入式遠程視頻監(jiān)控系統(tǒng)[J].安防科技,2007(3):24-26.
[4] 蘇日建,宋勝利.嵌入式圖像采集系統(tǒng)的JPEG算法改進[J].重慶工學(xué)院學(xué)報,2006,20(11):75-76.
[5] 付思華,張小虎.基于序列圖像的運動目標實時檢測方法[J].光學(xué)技術(shù),2004,30(2):215-217.