《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于OpenCV的ARM嵌入式網絡視頻監(jiān)控系統(tǒng)
基于OpenCV的ARM嵌入式網絡視頻監(jiān)控系統(tǒng)
來源:微型機與應用2013年第9期
梁 艷
(廣西師范大學 電子工程學院,廣西 桂林 541004)
摘要: 詳細描述了在ARM-Linux嵌入式系統(tǒng)中移植OpenCV的方法,并在OpenCV的基礎上運用Surendra算法設計了一個結合監(jiān)控和運動目標跟蹤功能的網絡視頻監(jiān)控系統(tǒng)。
Abstract:
Key words :

摘  要: 詳細描述了在ARM-Linux嵌入式系統(tǒng)中移植OpenCV的方法,并在OpenCV的基礎上運用Surendra算法設計了一個結合監(jiān)控和運動目標跟蹤功能的網絡視頻監(jiān)控系統(tǒng)。
關鍵詞: 視頻監(jiān)控;ARM-Linux嵌入式系統(tǒng);OpenCV;Surendra算法

 近年來,公共場所的安全防范問題得到了越來越多的關注,一些視頻監(jiān)控系統(tǒng)也日益重要起來。嵌入式系統(tǒng)的硬件集成化程度高,軟件采用實時多任務操作系統(tǒng)和相應的應用軟件,軟硬件均可裁減。隨著大規(guī)模集成電路的發(fā)展,ARM處理器的速度也越來越快,以ARM處理器為核心的嵌入式平臺在視頻監(jiān)控方面具有很大的優(yōu)勢[1]。本文詳細描述了在ARM-Linux嵌入式系統(tǒng)中移植OpenCV的方法,并在此基礎上運用Surendra算法設計了一個結合監(jiān)控和運動目標跟蹤功能的網絡視頻監(jiān)控系統(tǒng)。
1 OpenCV簡介
 OpenCV是由Intel公司發(fā)起并參與開發(fā)且在近年來迅速普及的計算機視覺研究工具,是一個跨平臺的計算機視覺庫[2]。OpenCV可以在Windows、Linux以及Android等系統(tǒng)上運行,Intel公司免費開放該函數庫的源代碼。OpenCV提供了非常豐富的幀提取函數和視覺處理算法,開發(fā)者可以在其視頻開發(fā)項目中直接調用進行算法移植并添加自己編寫的程序,即可完成復雜龐大的開發(fā)任務,達到事半功倍的效果[3]。
2 系統(tǒng)硬件構架
 系統(tǒng)基于客戶端/服務器的模式運行。服務器采用Mini2440開發(fā)板,該開發(fā)板基于ARM9內核,安裝了Linux-2.6.32內核的Linux操作系統(tǒng),微處理器采用Samsung S3C2440,采用專業(yè)的CPU內核電源芯片和復位芯片以保證系統(tǒng)的穩(wěn)定性,最高主頻為533 MHz。客戶端為普通PC,在PC上安裝Fedora11操作系統(tǒng)和OpenCV函數庫,客戶端通過網絡同時接收來自多個服務器的視頻數據[4-5]。整個系統(tǒng)的硬件結構如圖1所示。

 

 

3 移植OpenCV函數庫
 最終的目標是要在ARM嵌入式平臺上實現(xiàn)系統(tǒng)監(jiān)控和跟蹤功能,故需要交叉編譯在ARM-Linux平臺上移植OpenCV函數庫[6]。移植過程如下:
 (1)獲取OpenCV源代碼后解壓,在當前目錄下輸入如下命令:./configure
  --host=arm-linux --without-gtk
 --without-carbon --without-quicktime
 --without-ffmpeg --without-python
 --without-swig --enable-static
 --enable-share --disable-apps
 CXX=arm-linux-g++ CC=arm-linux-gcc
 --prefix=/usr/local/opencv
 &make &make install
 (2)設置環(huán)境變量:export PKG_CONFIG
 _PATH=$PKG_CONFIG_PATH:/usr/local/opencv/lib/pkgconfig。編譯OpenCV源代碼自帶的例程,測試OpenCV函數庫移植是否成功。因為在移植OpenCV函數庫時沒有添加對gtk的支持,故在編譯例程drawing.c時要去掉與顯示相關的函數。使用命令:arm-linux-gcc drawing.c-o drawing′pkg-config--cflags opencv′′pkg-config--libs opencv′,生成可執(zhí)行文件drawing。
 (3)在OpenCV安裝路徑/usr/local/opencv下,把lib文件夾里的庫文件拷貝到ARM-Linux平臺的文件系統(tǒng)里。運行可執(zhí)行文件drawing,如果在ARM-Linux平臺上成功執(zhí)行,則表示OpenCV函數庫移植成功。
4 嵌入Surendra算法
 網絡視頻監(jiān)控系統(tǒng)是通過攝像頭獲取圖像,對獲取到的圖像進行處理確定運動目標,若發(fā)生異常情況,系統(tǒng)會自動發(fā)出警告并啟動錄像功能進行錄制保存。運動目標檢測是該系統(tǒng)的核心,是實現(xiàn)運動目標識別和跟蹤的基礎。對比各種運動目標檢測算法,同時根據系統(tǒng)處理器的運算能力,本文選用Surendra背景更新算法作為運動目標的檢測算法[7]。
 Surendra算法能夠自適應地獲取背景圖像,其基本思想是通過當前幀幀差圖像找到物體的運動區(qū)域,保持該區(qū)域內的背景不變,用當前幀更新非運動區(qū)域的背景,經過迭代運算后就可以提取出背景圖像,實現(xiàn)自動更新[8]。Surendra算法步驟如下:

 運動目標的檢測就是在當前幀圖像中提取運動目標,而一般情況下前景的運動目標與背景的灰度值有很大的差異,但運動物體本身的灰度值差異一般不會很大。因此背景差分二值圖像為:

 其中,Ii為當前幀圖像,Bi為背景圖像。差分二值圖像的灰度值為255的像素點可視為前景的運動目標點。通過比較這些點的個數變化是否在一定的閾值內可以判斷是否有運動物體進入監(jiān)控區(qū)域。
 在圖像處理中,不同類型的圖像內部結構不同,需要根據圖像的結構采用不同的方法將圖像數據讀入內存[9]。OpenCV的API函數cvCaptureFromCAM可以將圖像數據從攝像頭中加載進來,圖像結構類型使用IplImage結構體來表示。cvCaptureFromCA的函數原型為:CvCapture*cvCaptureFromC AM(int index),它返回值為一個指向CvCapture結構體的指針,然后通過調用API函數cvQueryFrame(CvCapture*capture)返回得到一個指向IplImage結構體的指針,采集進來的圖像信息就保存在IplImage結構體中。IplImage結構體的width、height、widthStep成員分別指示了圖像的寬像素數、高像素數、排列圖像的行大小,指針參數imageData指向了實際的圖像數據。圖像數據可以看作一個二維矩陣,相應的處理可以看作對一個二維矩陣的處理,對圖像進行嵌入Surendra算法開發(fā)主要就是對imageData指向的數據進行操作[10]。在實際開發(fā)中,為了減輕處理器的運算壓力,嵌入Surendra算法是以當前幀的前4幀圖像作為背景圖像,即Ii和Ii-4分別代表當前幀和前一幀圖像,然后依據Surendra算法原理對兩幀圖像求幀差分并進行二值化,最終檢測出運動物體。
5 客戶端/服務器設計
 系統(tǒng)軟件設計采用客戶端/服務器的模式結合Linux多線程的編程方法,使整個系統(tǒng)能夠流暢地實現(xiàn)多用戶的接入和切換。每個作為服務器的ARM嵌入式平臺上外接一個USB攝像頭,分布于監(jiān)控點上的多個服務器通過網絡連接到作為客戶端的PC上,由此構成了整個網絡監(jiān)控系統(tǒng)[11]。在系統(tǒng)中使用IP地址作為服務器的編號,用來區(qū)分來自于不同監(jiān)控點上傳送來的視頻信息。
 系統(tǒng)軟件由兩部分組成,分別是基于ARM嵌入式平臺上的服務器端和基于PC上的客戶端[12]。服務器端需要完成3個基本任務,即圖像獲取、圖像處理和處理后圖像數據的網絡發(fā)送。在軟件設計上,使用3個線程實現(xiàn)這3個任務,在線程之間采用互斥鎖的機制對關鍵數據進行保護和實現(xiàn)線程之間的同步,以保證系統(tǒng)的平穩(wěn)、流暢運行。圖像獲取線程與圖像處理線程之間、圖像處理線程與圖像發(fā)送線程之間共同維護了兩個緩沖區(qū)img1和img2,圖像數據基于流水線的模式由USB攝像頭采集進來經處理后再通過TCP/IP網絡發(fā)送出去[13-14]。服務器端的運行機制如圖2所示。

 可看到緩沖區(qū)img1和img2分別有兩個線程擁有權限對其進行操作,如果兩個線程同時對數據進行讀寫,就會出現(xiàn)競爭現(xiàn)象,進而破壞數據的完整性。針對這種情況,采用了Linux互斥鎖的機制,控制程序在對緩沖區(qū)進行讀寫操作時永遠只會響應一個線程的操作請求,如在圖像獲取線程與圖像處理線程之間采用如下處理:
 ……
 data_process=0;
 pthread_mutex_lock(&mutex);
 ……//算法處理代碼
 data_process=1;
 pthread_mutex_lock(&mutex);
 ………
 運用這樣的方法就可以對數據在特定時間進行保護,同時也可以實現(xiàn)線程之間的同步,非常有利于系統(tǒng)的流暢運行。圖像獲取線程每秒從USB攝像頭中采集30幀的數據。為了提高處理速度,選擇灰度圖像處理,大大減少了ARM處理器的工作量,提高了系統(tǒng)的運行效率。
 相對于服務器端,客戶端在實現(xiàn)上簡單很多??蛻舳藰嫿ㄔ赑C上,只需要完成圖像數據的網絡接收和圖像顯示兩個基本任務。它們由兩個線程來實現(xiàn),兩個線程之間共同維護一個緩沖區(qū),也是采用互斥鎖的機制對數據在特定時間進行保護。用戶通過IP地址作為編號識別不同的服務器端,在計算機上可以對關心的區(qū)域進行實時的遠程監(jiān)控和跟蹤。
 本系統(tǒng)成功地將OpenCV函數庫移植到ARM-Linux嵌入式系統(tǒng)中,并基于OpenCV函數庫和Surendra算法開發(fā)與實現(xiàn)了一個嵌入式網絡視頻監(jiān)控系統(tǒng)。在系統(tǒng)運行的過程中,每秒從USB攝像頭中采集30幀的圖像數據,每4幀圖像之間進行一次算法處理,即相當于每間隔0.13 s進行一次Surendra算法處理。這樣不但減輕了處理器的運算壓力,同時也能滿足系統(tǒng)對視頻連續(xù)性與運動物體檢測的要求。
參考文獻
[1] 陳艷華,侯安華,劉盼盼.基于ARM的嵌入式系統(tǒng)開發(fā)與實例[M].北京:人民郵電出版社,2008.
[2] Intel Corporation. OpenCV reference manual[S/OL]. (2001)[2001].http://www.intel.com.
[3] 劉瑞幀,于士琪.OpenCV教程——基礎篇[M].北京:北京航空航天大學出版社,2007.
[4] 周香珍,芮筱亭,張順.基于DSP的運動目標跟蹤系統(tǒng)的實現(xiàn)[J].微計算機信息,2008(23):189-191.
[5] 汪愛麗,劉孟洪.基于ARM的嵌入式網絡監(jiān)控系統(tǒng)構建[J].微處理機,2009(5):59-60.
[6] 尹俊超,劉直芳.基于OpenCV的運動目標檢測與跟蹤[J].計算機工程與設計,2011,32(8):2817-2820.
[7] 汪成亮,賈亮亮.一種基于改進Surendra背景更新算法的運動目標檢測[J].世界科技研究與發(fā)展,2012,34(2):272-275.
[8] 徐方明,盧官明.基于改進surendra背景更新算法的運動目標檢測算法[J].山西電子技術,2009(5):39-40,71.
[9] 阮秋琦.數字圖像處理學[M].北京:電子工業(yè)學院,2007.
[10] 賈永紅,張謙.數字圖像處理實習教程[M].武漢:武漢大學出版社,2012.
[11] 唐人財,劉連浩.基于嵌入式Linux遠程圖像監(jiān)控系統(tǒng)的設計[J].計算機與現(xiàn)代化,2010(11):31-34,38.
[12] 諶洪茂,徐猛華.基于嵌入式遠程監(jiān)控系統(tǒng)的設計[J].計算機與現(xiàn)代化,2004(2):86-88.
[13] 方曉翠,周淵平,王小紅.嵌入式遠程視頻監(jiān)控系統(tǒng)的設計[J].通信技術,2011,44(10):105-108.
[14] 王秀芳,張昆,桑圣潔.基于ARM的圖像監(jiān)控系統(tǒng)的開發(fā)[J].科學技術與工程,2011,11(14):3313-3317,3321.

此內容為AET網站原創(chuàng),未經授權禁止轉載。