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