《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于Linux及S3C2440A的嵌入式遠(yuǎn)程視頻監(jiān)控系統(tǒng)的設(shè)計(jì)
基于Linux及S3C2440A的嵌入式遠(yuǎn)程視頻監(jiān)控系統(tǒng)的設(shè)計(jì)
來源:微型機(jī)與應(yīng)用2011年第21期
吳 健,趙建軍,朱繼珍
(昆明理工大學(xué) 理學(xué)院,云南 昆明 650500)
摘要: 介紹了一種遠(yuǎn)程視頻監(jiān)控系統(tǒng)的實(shí)現(xiàn)方案。其以嵌入式Linux和S3C2440A為核心平臺(tái),通過嵌入式平臺(tái)將攝像頭采集的視頻信號(hào)進(jìn)行壓縮,同時(shí)進(jìn)行入侵檢測(cè),再通過網(wǎng)絡(luò)將數(shù)據(jù)傳送至Web服務(wù)器。實(shí)現(xiàn)了一種體積小、成本低、數(shù)字化的監(jiān)控解決方案,具有廣泛的應(yīng)用價(jià)值。
Abstract:
Key words :

摘  要: 介紹了一種遠(yuǎn)程視頻監(jiān)控系統(tǒng)的實(shí)現(xiàn)方案。其以嵌入式LinuxS3C2440A為核心平臺(tái),通過嵌入式平臺(tái)將攝像頭采集的視頻信號(hào)進(jìn)行壓縮,同時(shí)進(jìn)行入侵檢測(cè),再通過網(wǎng)絡(luò)將數(shù)據(jù)傳送至Web服務(wù)器。實(shí)現(xiàn)了一種體積小、成本低、數(shù)字化的監(jiān)控解決方案,具有廣泛的應(yīng)用價(jià)值。
關(guān)鍵詞: 嵌入式Linux;S3C2440A;圖像采集;Video4Linux;JPEG壓縮

 隨著網(wǎng)絡(luò)、通信和數(shù)字信息技術(shù)的不斷發(fā)展,監(jiān)控系統(tǒng)的組成模式也在快速變化和發(fā)展中,當(dāng)前網(wǎng)絡(luò)技術(shù)與嵌入式系統(tǒng)技術(shù)的結(jié)合催生了全新的基于嵌入式Web服務(wù)器的監(jiān)控系統(tǒng)。與傳統(tǒng)的視頻采集監(jiān)控系統(tǒng)相比,它具有可靠性高、組網(wǎng)方便、可遠(yuǎn)程監(jiān)控等優(yōu)點(diǎn),因而更適用于機(jī)要部門、工廠、市場(chǎng)、交通運(yùn)輸?shù)陌卜辣O(jiān)控系統(tǒng)中[1]。
 本文介紹了一種以S3C2440A開發(fā)板為基礎(chǔ)的嵌入式遠(yuǎn)程監(jiān)控系統(tǒng)的實(shí)現(xiàn),該系統(tǒng)基于嵌入式Web服務(wù)器技術(shù),在嵌入式硬件平臺(tái)和Linux操作系統(tǒng)下進(jìn)行。采用ov511芯片的網(wǎng)眼300CMOS攝像頭進(jìn)行數(shù)字圖像采集,利用JPEG圖像壓縮編碼方式,進(jìn)行視頻圖像入侵檢測(cè),可以直接在以太網(wǎng)上解碼顯示。
1 視頻監(jiān)控系統(tǒng)總體設(shè)計(jì)
1.1 系統(tǒng)總體結(jié)構(gòu)

 硬件系統(tǒng)是嵌入式系統(tǒng)的核心,它是承載軟件的實(shí)體,軟件通過它來控制各種接口。本系統(tǒng)中硬件的總體構(gòu)架包括系統(tǒng)存儲(chǔ)器、外圍接口電路、電源及復(fù)位電路等幾個(gè)部分。系統(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(最高可達(dá)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定時(shí)器和1通道內(nèi)部定時(shí)器/看門狗定時(shí)器、雙端口的USB(主機(jī))、1端口的USB(設(shè)備)、8通道10 bit ADC、觸摸屏接口、鎖相環(huán)(PLL)片上時(shí)鐘發(fā)生器、通用I/O端口、相機(jī)接口、SD卡和MMC卡接口。其支持各種型號(hào)的ROM引導(dǎo)(Nor/Nand Flash,EEPROM或其他),1.2 V內(nèi)核供電,1.8 V/2.5 V/3.3 V存儲(chǔ)器供電,3.3 V外部I/O供電,具備16 KB的I-Cache和16 KB D Cache/MMU微處理器。
2 系統(tǒng)軟件開發(fā)平臺(tái)的建立
 本系統(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)的存儲(chǔ)空間有限,因此通常使用交叉編譯環(huán)境。簡(jiǎn)單地說,交叉編譯就是在一個(gè)平臺(tái)上生成另一個(gè)平臺(tái)上的可執(zhí)行代碼,即在宿主機(jī)(PC機(jī))安裝開發(fā)工具,編輯、編譯開發(fā)板上的引導(dǎo)程序(Bootloader)、內(nèi)核和根文件系統(tǒng),使其能在開發(fā)板上運(yùn)行。本系統(tǒng)使用的編譯系統(tǒng)為arm-linux-gcc-3.4.1版本。
2.2 Linux系統(tǒng)的移植
 從網(wǎng)上下載標(biāo)準(zhǔn)的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)中添加對(duì)ARM的支持,進(jìn)入內(nèi)核源碼,修改“Makefile”文件,將“ARCH?= (SUBARCH)”修改為“ARCH=arm”,將“CROSS_COMPILE?=”修改為“CROSS_COMPILE=arm_linux_”,進(jìn)行保存。在配置單中導(dǎo)入對(duì)內(nèi)核的默認(rèn)配置,再在此基礎(chǔ)上選擇需要的功能,如Nand Flash、Video4Linux編程接口函數(shù),MTD設(shè)備、USB設(shè)備的支持及Cramfs文件系統(tǒng)的支持。再使用Cramfs制作工具mkcramfs把根文件目錄制作成映像文件,最后安裝DM9000E芯片網(wǎng)卡的驅(qū)動(dòng)程序,即完成了系統(tǒng)移植。
3 視頻數(shù)據(jù)處理模塊設(shè)計(jì)
3.1 基于V4L的視頻采集設(shè)計(jì)

 Linux對(duì)于視頻數(shù)據(jù)采集設(shè)備的支持是通過Video4Linux(V4L)來實(shí)現(xiàn)的。V4L是在Linux下用于視頻和音頻數(shù)據(jù)的API接口,它為視頻設(shè)備的應(yīng)用程序提供了一系列的接口函數(shù)。這些視頻設(shè)備包括市場(chǎng)上常見的電視捕獲卡和USB接口的攝像頭等[2]。
 在編寫圖像采集程序時(shí),根據(jù)需要定義一個(gè)結(jié)構(gòu)體來保存采集過程中需要的各種參數(shù)。該結(jié)構(gòu)體如下:
typedef struct v4l_struct{
in fd;
struct video_capability capability; //設(shè)備的基本信息
struct video_channel channel[4];//各個(gè)信號(hào)源是屬性
struct video_picture picture;//設(shè)備采集的圖像的各種屬性
struct video_window window;//capture area的信息
struct video_capture capture;
struct video_buffer buffer;//最底層對(duì)buffer的描述
struct video_mmap mmap;//用于mmap
struct video_mbuf mbuf;//利用mmap進(jìn)行映射的幀的信息
unsigned char *map;
int frame;
int framestat[2];
}v4l_device;
 從上面的結(jié)構(gòu)體可以看出,想要完成視頻數(shù)據(jù)的采集,首先要獲得對(duì)應(yīng)視頻采集設(shè)備的信息和圖像的信息,同時(shí)需要對(duì)采集的窗口、顏色模式和幀的狀態(tài)進(jìn)行初始化,然后才能進(jìn)行視頻圖像的采集。視頻采集流程如圖2所示。

 

 

 下面對(duì)V4L編程中使用的函數(shù)進(jìn)行簡(jiǎn)單的介紹。
 (1)打開視頻設(shè)備,調(diào)用函數(shù)int v4l_open(char*dev,v4l_device*vd);函數(shù)調(diào)用成功后,返回的文件描述就代表了所捕獲的設(shè)備硬件。
 下面的幾步都會(huì)用到ioctl()函數(shù)來和設(shè)備進(jìn)行“對(duì)話”,ioctl是input output control的縮寫,函數(shù)原型是int ioctl(int fd,ind cmd,…)。其中,fd表示設(shè)備的文件描述,cmd表示用于程序?qū)υO(shè)備的控制命令,省略號(hào)一般是一個(gè)類型的參數(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)用使得進(jìn)程之間通過映射同一個(gè)普通文件實(shí)現(xiàn)內(nèi)存共享。將普通文件映射到進(jìn)程的地址空間中,進(jìn)程就可以像訪問普通內(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之后,便可以進(jìn)行真正的圖像采集,需要調(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ò)傳輸前進(jìn)行壓縮。本系統(tǒng)由于硬件條件的限制,為了達(dá)到遠(yuǎn)程視頻監(jiān)控的效果,采用基于MJPEG算法進(jìn)行視頻壓縮。其主要特點(diǎn)是動(dòng)態(tài)使用JPEG算法,基本不考慮視頻流中不同幀之間的變化,只單獨(dú)對(duì)某一幀進(jìn)行JPEG壓縮,配合嵌入式Web服務(wù)器,采用基于Socket的編程,實(shí)現(xiàn)了面向用戶端的視頻監(jiān)控[4]。
 對(duì)于Linux下的JPEG圖像數(shù)據(jù)壓縮,可以使用Libjpeg庫實(shí)現(xiàn)。Libjpeg是Linux下的一個(gè)標(biāo)準(zhǔn)而常用的庫,它的功能是將圖片以一定的壓縮比率壓縮成如JPEG格式的圖片,或者對(duì)JPEG圖片進(jìn)行解壓縮以及其他一些對(duì)JPEG圖片進(jìn)行處理的功能。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 視頻圖像的入侵檢測(cè)
 視頻序列檢測(cè)是為了能夠?qū)崿F(xiàn)在監(jiān)控過程中的自動(dòng)報(bào)警。報(bào)警系統(tǒng)是視頻監(jiān)控系統(tǒng)中不可或缺的一部分。在數(shù)字視頻監(jiān)控系統(tǒng)中,圖像序列的運(yùn)動(dòng)檢測(cè)及報(bào)警不僅可以自行替代監(jiān)視人員的部分工作,提高監(jiān)視系統(tǒng)的自動(dòng)化水平,而且還可以提高監(jiān)控存儲(chǔ)效率。
本視頻監(jiān)控系統(tǒng)主要是對(duì)視頻是否有入侵對(duì)象進(jìn)行分析檢測(cè),一旦畫面上出現(xiàn)超過閾值的變化就會(huì)自動(dòng)報(bào)警。
 運(yùn)動(dòng)目標(biāo)檢測(cè)的方法主要可以分為幀差法、流光法和背景差法三種。本系統(tǒng)使用背景差法,因?yàn)橐曨l監(jiān)控系統(tǒng)主要使用規(guī)定的攝像機(jī)對(duì)場(chǎng)景進(jìn)行監(jiān)控,場(chǎng)景固定。背景差法的基本思想是通過輸入圖像與背景模型進(jìn)行比較的方法檢測(cè)運(yùn)動(dòng)目標(biāo)[5]。
 本文結(jié)合視頻監(jiān)控系統(tǒng)發(fā)展的方向,給出了一種基于嵌入式ARM的視頻監(jiān)控系統(tǒng)設(shè)計(jì)方案,并給出了系統(tǒng)的實(shí)現(xiàn)方法。本系統(tǒng)采用了基于模塊的設(shè)計(jì)方法,各個(gè)模塊之間相互獨(dú)立,增強(qiáng)了系統(tǒng)的健壯性和靈活性,當(dāng)需要更換其中一個(gè)模塊時(shí),其他模塊并不需要進(jìn)行很大的改動(dòng),有利于系統(tǒng)的更新?lián)Q代。
參考文獻(xiàn)
[1] 于明,范書瑞,普祥燁.ARM9嵌入式系統(tǒng)設(shè)計(jì)與開發(fā)教程[M].北京:電子工業(yè)出版社,2006.
[2] 張曉東,李秀娟,張杰.基于ARM的嵌入式遠(yuǎn)程監(jiān)控系統(tǒng)設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2008,31(6):22-23.
[3] 楊穎,陳之龍,黃志.基于USB攝像頭的嵌入式遠(yuǎn)程視頻監(jiān)控系統(tǒng)[J].安防科技,2007(3):24-26.
[4] 蘇日建,宋勝利.嵌入式圖像采集系統(tǒng)的JPEG算法改進(jìn)[J].重慶工學(xué)院學(xué)報(bào),2006,20(11):75-76.
[5] 付思華,張小虎.基于序列圖像的運(yùn)動(dòng)目標(biāo)實(shí)時(shí)檢測(cè)方法[J].光學(xué)技術(shù),2004,30(2):215-217.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。