鄒振興,張國(guó)安,梁俊銘
(廣東職業(yè)技術(shù)學(xué)院,廣東佛山,528041)
近年來,隨著人工智能技術(shù)迅猛發(fā)展,計(jì)算機(jī)設(shè)備己經(jīng)深入涉及到社會(huì)生活中的各個(gè)方面,計(jì)算機(jī)機(jī)器視覺得到快速發(fā)展。利用視覺傳感器采集,進(jìn)行靜態(tài)及動(dòng)態(tài)目標(biāo)圖像處理分析成為當(dāng)下研究應(yīng)用的主題。如在家居安全監(jiān)測(cè)中,利用視覺系統(tǒng)對(duì)目標(biāo)進(jìn)行運(yùn)動(dòng)跟蹤和檢測(cè),監(jiān)測(cè)和智能人機(jī)交互及分析目標(biāo)行為,可分析發(fā)現(xiàn)異常行為,從而監(jiān)控系統(tǒng)發(fā)出報(bào)警,進(jìn)而進(jìn)行科學(xué)處理,從而提高日常生活質(zhì)量。計(jì)算機(jī)視覺其目的是分析、研宄讓計(jì)算機(jī)智能化一定程度實(shí)現(xiàn)人的眼睛和大腦感知外部環(huán)境,分析和執(zhí)行等功能[1]。而其中目標(biāo)運(yùn)動(dòng)檢測(cè)與跟蹤是通過視頻圖像的處理,采用如閾值分割、高斯模糊、濾波算子等算法進(jìn)一步掌握目標(biāo)圖像的運(yùn)動(dòng)信息和特征,為后續(xù)執(zhí)行系統(tǒng)提供信息數(shù)據(jù)依據(jù),可以實(shí)現(xiàn)對(duì)運(yùn)動(dòng)物體的圖像檢測(cè)。
樹莓派是一款基于ARM的信用卡大小的單板計(jì)算機(jī)[2],擁有豐富的接口,能夠安裝任何ARM平臺(tái)的操作系統(tǒng),如Android、Windows等。一臺(tái)這么多接口的單板計(jì)算機(jī),實(shí)際只有掌心大小,樹莓派CPU功耗低,處理能力強(qiáng)。比較其他開發(fā)板控制平臺(tái),樹莓派提供的引腳能直接控制其他底層硬件。樹莓派細(xì)小靈活,性價(jià)比高,應(yīng)用成熟,開源代碼多,利于開發(fā)與應(yīng)用。樹莓派核心板及外接引腳圖如圖1所示。
圖1 樹莓派核心板及外接引腳圖
對(duì)比常規(guī)的8位單片機(jī)和32位嵌入式等控制器,樹莓派擁有豐富的I/O,還能搭配靈活的操作系統(tǒng),完成各種任務(wù)管理與調(diào)度,支持上層應(yīng)用的開發(fā),為了開發(fā)與設(shè)計(jì)提供更多的可能性和可靠性。隨著圖像處理技術(shù)發(fā)展和各種微型計(jì)算機(jī)研發(fā),使用傳統(tǒng)計(jì)算機(jī)作為處理圖像的平臺(tái)已經(jīng)無法滿足很多運(yùn)動(dòng)檢測(cè)設(shè)備對(duì)處理平臺(tái)簡(jiǎn)潔性的需求,而樹莓派作為一個(gè)微型計(jì)算機(jī)同樣可以進(jìn)行圖像處理,只要通過OpenCV就可以在樹莓派上使用幀差法把樹莓派攝像頭采集到的圖像進(jìn)行運(yùn)動(dòng)檢測(cè),再通過控制程序就可以直接控制執(zhí)行機(jī)構(gòu)。所以把OpenCV與樹莓派結(jié)合起來處理圖像就可以得到一個(gè)簡(jiǎn)潔高效的自動(dòng)運(yùn)動(dòng)檢測(cè)控制系統(tǒng)。
Linux是開源免費(fèi)和自由傳播的操作系統(tǒng),具有豐富的社區(qū)資源。開源能讓用戶自由裁剪,靈活性高,功能強(qiáng)大,成本低。Linux的開源性和穩(wěn)定性,都能更好地使用戶調(diào)用硬件功能,方便了查看資源的利用率。
無論是Linux的開源性、多線程、多任務(wù)的性能優(yōu)點(diǎn),還是其別具一格的開發(fā)用途都使得用戶在學(xué)習(xí)和開發(fā)上的難度有一定的降低,尤其是Linux的開源性對(duì)本次設(shè)計(jì)有很大的幫助,由于本設(shè)計(jì)作品需要連接局域網(wǎng)之外還需要配置相關(guān)的編譯軟件和開發(fā)環(huán)境,所以Linux的開源性在搭建開發(fā)環(huán)境上就有了很大的便利性。
基于OpenCV自動(dòng)運(yùn)動(dòng)檢測(cè)控制系統(tǒng)是由一塊4B、2GB的樹莓派、2個(gè)可調(diào)舵機(jī)和1個(gè)攝像頭所組成。開發(fā)環(huán)境是在Linux系統(tǒng)上使用Python調(diào)用OpenCV數(shù)據(jù)庫(kù)來實(shí)現(xiàn)一個(gè)可以自動(dòng)跟蹤目標(biāo)并時(shí)刻拍攝的控制系統(tǒng),除了自動(dòng)跟蹤外還可以通過控制調(diào)節(jié)攝像頭的拍攝方向。在這個(gè)設(shè)計(jì)中,要做到一個(gè)自動(dòng)識(shí)別物體并且實(shí)現(xiàn)運(yùn)動(dòng)目標(biāo)的監(jiān)測(cè)系統(tǒng),需具備這幾個(gè)模塊圖像傳感器采集模塊、圖像數(shù)據(jù)處理模塊、運(yùn)動(dòng)目標(biāo)提取及跟蹤、執(zhí)行舵機(jī)動(dòng)作模塊等這些流程。其設(shè)計(jì)思路如圖2所示。
圖2 設(shè)計(jì)思路圖
(1)圖像傳感器采集
圖像傳感器采集模塊是利用傳感器內(nèi)部的光電器件的光電轉(zhuǎn)換功能。將感光面上的光像轉(zhuǎn)換為與光像成相應(yīng)比例關(guān)系的電信號(hào),從而實(shí)現(xiàn)對(duì)研究對(duì)象的視頻及圖像信息的抓取。包含了傳感器視頻數(shù)據(jù)的采集、傳感器采集圖像顯示幀數(shù)和分辨率的調(diào)整、數(shù)據(jù)傳輸以及信號(hào)初始處理等。圖像傳感器采集是圖像處理、確定邊緣、定位目標(biāo)及執(zhí)行控制的前提。
(2)圖像數(shù)據(jù)處理
傳感器采集數(shù)據(jù)后,往往是進(jìn)行數(shù)據(jù)處理,由于圖像往往會(huì)受環(huán)境的影響,存在噪聲的干擾、亮度不足、曝光不足或過度等情況,這樣的數(shù)據(jù)是會(huì)增加處理難度、產(chǎn)生濾波的延長(zhǎng)及邊緣不清晰等。因此可以傳感器采集到的視頻圖像數(shù)據(jù)進(jìn)行預(yù)處理,進(jìn)行濾波處理去除干擾,實(shí)現(xiàn)顏色空間轉(zhuǎn)換、亮度和色度達(dá)到合理,方便二值化的處理使邊緣清晰,減少算法處理時(shí)間。這部分是實(shí)現(xiàn)運(yùn)動(dòng)目標(biāo)檢測(cè)的關(guān)鍵。
(3)運(yùn)動(dòng)目標(biāo)提取
運(yùn)動(dòng)監(jiān)測(cè)技術(shù)日益成熟,視頻圖像信息通常包括多個(gè)元素,但一般背景是相對(duì)固定的,相近各幀特征變化不大,所以運(yùn)動(dòng)目標(biāo)的提取也成為可能。運(yùn)動(dòng)目標(biāo)提取主要就是在圖像數(shù)據(jù)序列中檢測(cè)出運(yùn)動(dòng)目標(biāo),并將前景與背景圖像做分割處理,再做目標(biāo)跟蹤算法,這方面的算法常見有光流法、幀間差分法、背景減除法等。
(4)運(yùn)動(dòng)目標(biāo)跟蹤
在系統(tǒng)設(shè)計(jì)中要求監(jiān)測(cè)對(duì)象要在圖像處理模板的中心,所以記得多監(jiān)測(cè)對(duì)象的運(yùn)動(dòng)軌跡進(jìn)行控制。目標(biāo)跟蹤算法就是在相鄰每幀圖像之間的數(shù)據(jù)形成與監(jiān)測(cè)對(duì)象匹配的關(guān)系。把運(yùn)動(dòng)目標(biāo)在數(shù)據(jù)序列中一一對(duì)應(yīng),再通過模板匹配和算法計(jì)算得到運(yùn)動(dòng)目標(biāo)的中心、定位、路線、速度等特征與參數(shù)。進(jìn)一步將這些參數(shù)輸送給后續(xù)算法處理分析,最終實(shí)現(xiàn)對(duì)運(yùn)動(dòng)目標(biāo)的跟蹤和定位分析。
(5) 執(zhí)行舵機(jī)動(dòng)作
舵機(jī)接收到上級(jí)信息信號(hào)后,執(zhí)行動(dòng)作,往往是系統(tǒng)的后續(xù)執(zhí)行機(jī)構(gòu)。執(zhí)行舵機(jī)根據(jù)信號(hào)往往會(huì)判斷圖像視頻中目標(biāo)物體在拍攝窗口內(nèi)移動(dòng)的情況,按照設(shè)定的條件算法進(jìn)行運(yùn)動(dòng)動(dòng)作,達(dá)到指定位置。
在Linux系統(tǒng)下搭建OpenCV開發(fā)環(huán)境需要以下步驟:
(1)首先要啟用攝像頭,進(jìn)入Interfacing Options->Camera->Yes,即可啟用攝像頭。
sudo raspi-config
檢測(cè)攝像頭是否正常,可以使用以下命令進(jìn)行檢測(cè):raspivid -t 0 -cs 0
(2)準(zhǔn)備視頻流設(shè)備,在OpenCV中,若要讀取攝像頭數(shù)據(jù),需要開啟v4l2(video for linux 2),開啟后,攝像頭設(shè)備文件為/dev/video0,OpenCV將從該文件中讀取視頻流文件。
sudo vim /etc/modules
(3)更換樹莓派軟件源
# 編輯 `/etc/apt/sources.list` 文件,刪除原文件所有內(nèi)容,用以下內(nèi)容取代:
git clone -b 4.1.0 --recursive https://github.com/opencv/opencv_contrib.git
運(yùn)動(dòng)檢測(cè)設(shè)計(jì)這部分是往往最復(fù)雜的,不僅要把物體和背景區(qū)分開來,還要讓機(jī)器知道物體是否在移動(dòng),這需要大量的算法和數(shù)據(jù)處理支持,所幸的是在C和C++的庫(kù)里有這么一個(gè)數(shù)據(jù)庫(kù)可以支持計(jì)算機(jī)視覺程序開發(fā)的,這就是OpenCV函數(shù)庫(kù)。它可以在Windows、Linux、Mac OS等系統(tǒng)上面運(yùn)行。由于它的底層是C和C++所以O(shè)penCV數(shù)據(jù)的處理能力很強(qiáng), OpenCV是一個(gè)廣泛應(yīng)用于視頻圖像處理、機(jī)器視覺方、運(yùn)動(dòng)監(jiān)測(cè)等方面的開源函數(shù)庫(kù),該庫(kù)主要采用C語言進(jìn)行編譯與優(yōu)化,編程靈活數(shù)據(jù)處理快。OpenCV具有模塊化結(jié)構(gòu)能為設(shè)計(jì)友好的視覺對(duì)接函數(shù)提供簡(jiǎn)便的支撐,這意味著該包包含多個(gè)共享庫(kù)或靜態(tài)庫(kù)。這次設(shè)計(jì)加上使用Python作為開發(fā)語言,其數(shù)據(jù)與函數(shù)的調(diào)用能力相結(jié)合使得這一獲取視頻和識(shí)別物體的程序變得簡(jiǎn)單和方便了起來。
基于OpenCV的運(yùn)動(dòng)物體的視頻檢測(cè)原理:根據(jù)監(jiān)測(cè)對(duì)象的圖像處理提取特征信息,如邊緣、二值化圖像等, 在捕獲連續(xù)圖像幀信息中進(jìn)行對(duì)比或進(jìn)行背景圖像分離等從而跟蹤得到運(yùn)動(dòng)目標(biāo)的信息等。整個(gè)過程體系如圖3所示。
圖3 圖像分離背景程序流程圖
視頻圖像預(yù)處理:是針對(duì)于捕獲到的視頻流信息進(jìn)行圖像處理。預(yù)處理目的是平滑圖像濾除噪點(diǎn),然后再進(jìn)行邊緣檢測(cè)輪廓提取等處理,為圖像特征提取分析與處理打好基礎(chǔ)。
捕獲最小包圍領(lǐng)域,從其中圖像中提取目標(biāo)對(duì)象可以進(jìn)一步減小算法計(jì)算量提高圖像處理時(shí)間,也可以對(duì)圖像進(jìn)行灰度處理、閾值分割及二值化處理等。采用幀差法將相鄰的兩幀圖像對(duì)應(yīng)像素點(diǎn)進(jìn)行相減而得到運(yùn)動(dòng)目標(biāo)數(shù)據(jù)[3]。在幀差法運(yùn)動(dòng)檢測(cè)前對(duì)灰度圖像可進(jìn)行濾波平滑。然后使用灰度重心法確定運(yùn)動(dòng)物體的坐標(biāo),進(jìn)而將背景與目標(biāo)分離。為減小噪聲對(duì)運(yùn)動(dòng)檢測(cè)的影響,可對(duì)運(yùn)動(dòng)檢測(cè)結(jié)果進(jìn)行閾值分割,閾值分割處理得到運(yùn)動(dòng)物體的二值化圖像。對(duì)于從圖像中提取目標(biāo)對(duì)象,本質(zhì)就是對(duì)于目標(biāo)邊緣檢測(cè)及分割的過程。通常就是利用圖像像素之間的差異性,判斷是否有運(yùn)動(dòng)目標(biāo),算法處理步驟一般為相鄰幀對(duì)比相減、閾值分割、濾波噪聲、膨脹處理、邊緣檢測(cè)、繪制外接矩形區(qū)域等,其中閾值的選擇也很重要,閾值過低無法去除噪聲,太高則影響圖像中變化數(shù)據(jù),可能會(huì)無法提取完整運(yùn)動(dòng)目標(biāo)信息。
在OpenCV中可將運(yùn)動(dòng)部分劃為感興趣區(qū)域ROI(region of interest)[4],來計(jì)算出運(yùn)動(dòng)目標(biāo)的幾何中心。ROI的幾何中心在運(yùn)動(dòng)目標(biāo)上,通過計(jì)算ROI幾何中心的坐標(biāo),可得出其與圖像中心的距離,通過控制執(zhí)行機(jī)構(gòu),將幾何中心與圖像中心重合則選定運(yùn)動(dòng)目標(biāo)中心。計(jì)算采集到的圖像的中心坐標(biāo)算法用灰度重心法?;叶戎匦姆ㄔ砭褪菍^(qū)域內(nèi)每一個(gè)像素位置處的灰度值當(dāng)作該點(diǎn)的質(zhì)點(diǎn),其求區(qū)域中心的公式如下:
(1)式中,f(u,v)是坐標(biāo)為 (u,v)的像素點(diǎn)的灰度值, Ω是目標(biāo)區(qū)域的集合,是區(qū)域的中心坐標(biāo)。
設(shè)計(jì)過程中還需留意OpenCV的設(shè)置,因?yàn)樗荂和C++所提供的庫(kù),所有OpenCV類和函數(shù)都放在cv命名空間中。因此,要從代碼中訪問此功能,需要在程序中說明cv:符或using namespace cv;指令,由于設(shè)計(jì)需要用到Python來進(jìn)行編譯程序所以需要把OpenCV和Python對(duì)接,而OpenCV for Python就是通過NumPy進(jìn)行綁定的,如果讀取圖像首先要導(dǎo)入OpenCV包。
對(duì)于檢測(cè)物體圖像可以利用幀差法可將背景與目標(biāo)分離,從而獲得的前景和背景的差圖,再使用閾值分割技術(shù),從而將目標(biāo)物體分離出圖像。在本項(xiàng)目設(shè)計(jì)中使用OpenCV處理圖像時(shí)除了用閾值分割法之外,還用到了高斯模糊算法。高斯模糊可有效過濾掉可能被誤認(rèn)為運(yùn)動(dòng)檢測(cè)目標(biāo)的高斯噪聲[5],所謂模糊其實(shí)相當(dāng)就是將每一個(gè)像素都取周邊像素的平均值。高斯模糊本質(zhì)是屬于低通濾波器,它是將正態(tài)分布用到了圖像處理中,處理得出圖像的每個(gè)像素點(diǎn)是原圖像相應(yīng)像素點(diǎn)與相鄰像素點(diǎn)的加權(quán)和。其計(jì)算公示如下所示:
式中, (,)Huv表示頻率域;σ表示高斯曲線標(biāo)準(zhǔn)差,是方差: (u,v)D表示傅里葉變換后某點(diǎn)距離遠(yuǎn)點(diǎn)的距離。當(dāng) 0Dσ= 時(shí),即 0D取到截止頻率,當(dāng)濾波器的頻率域下降到其最大值時(shí),經(jīng)過這種濾波后能夠增強(qiáng)圖像的細(xì)節(jié)部分。即在保證全部圖像清晰的同時(shí)又能濾除局部的干擾噪聲。
使用cv2做高斯模糊,需要調(diào)用GaussianBlur函數(shù)
void GaussianBlur( InputArray src,OutputArray dst, Size ,Ksize double sigmaX, double sigmaY=0, int borderType=BORDER_DEFAULT )
Ksize 為高斯濾波器窗口大??;double sigmaX 為X方向?yàn)V波系數(shù);
double sigmaY=0 為Y方向?yàn)V波系數(shù)。
通過實(shí)驗(yàn)證明,本文選用樹莓派作為運(yùn)動(dòng)檢測(cè)的核心硬件,使用智能攝像頭結(jié)合了庫(kù)和實(shí)時(shí)釆集視頻幀數(shù)據(jù),進(jìn)行圖像處理,通過OpenCV庫(kù)可以做到物體的自動(dòng)識(shí)別和跟蹤。OpenCV庫(kù)的是C和C++所編寫的函數(shù)庫(kù),它提供了Python的接口,可以用Python來調(diào)用OpenCV的函數(shù),結(jié)合了Python和CC++的優(yōu)點(diǎn),選取幀差法、閾值分割、高斯模糊等合適高效的算法進(jìn)行圖像序列的分析和處理,可以分析出運(yùn)動(dòng)物體的運(yùn)動(dòng)情況和軌跡,控制舵機(jī)轉(zhuǎn)動(dòng),實(shí)現(xiàn)目標(biāo)物體的跟蹤。