賈紅賓
摘 要:本文構(gòu)建了一個基于OpenCV軟件的運(yùn)動目標(biāo)檢測跟蹤實(shí)驗平臺,采用CamShift算法對攝像頭視野中的運(yùn)動目標(biāo)進(jìn)行實(shí)時檢測和跟蹤,取得較好的效果,為計算機(jī)視覺研究奠定基礎(chǔ)。
關(guān)鍵詞:目標(biāo)跟蹤;CamShift算法;OpenCV
1 引言
隨著數(shù)字圖像處理技術(shù)的發(fā)展,基于視頻信息的目標(biāo)檢測跟蹤技術(shù)成為當(dāng)今計算機(jī)視覺領(lǐng)域研究的熱點(diǎn),其在安防監(jiān)控、智能交通機(jī)、器人等領(lǐng)域有著廣泛應(yīng)用前景。OpenCV作為一個開源發(fā)行的跨平臺計算機(jī)視覺庫,實(shí)現(xiàn)了 數(shù)字圖像處理和計算機(jī)視覺方面的很多通用算法,具有簡單易用、功能強(qiáng)大、移植方便等優(yōu)越性能,廣泛用于計算機(jī)視覺領(lǐng)域研究。本文借助OpenCV計算機(jī)視覺庫和VC++6.0編程環(huán)境,構(gòu)建了一個運(yùn)動目標(biāo)檢測跟蹤實(shí)驗平臺,對從攝像頭采集來的圖像數(shù)據(jù)進(jìn)行實(shí)時分析、處理,從而實(shí)現(xiàn)對運(yùn)動物體的檢測與跟蹤。
2 OpenCV簡介[1]
OpenCV是Intel開源計算機(jī)視覺庫(Open Computer Vision)的簡稱。它由一系列 C 函數(shù)和少量 C++ 類構(gòu)成。OpenCV實(shí)現(xiàn)了圖像處理和計算機(jī)視覺方面的很多通用算法。OpenCV 擁有包括300多個C函數(shù)的跨平臺的中、高層API。它不依賴與其它的外部庫,盡管也可以使用某些外部庫。OpenCV具有以下特點(diǎn):
(1)開放源碼
(2)基于Intel處理器指令集開發(fā)的優(yōu)化代碼
(3)統(tǒng)一的結(jié)構(gòu)和功能定義
(4)強(qiáng)大的圖像和矩陣運(yùn)算能力
(5)方便靈活的用戶接口
(6)支持Windows和Linux操作系統(tǒng)
由于有了以上性能特點(diǎn),OpenCV函數(shù)庫功能強(qiáng)大,簡單易用,移植也很方便,不失為學(xué)生和科研人員進(jìn)行數(shù)字圖像處理和計算機(jī)視覺方面學(xué)習(xí)和研究的好工具。
3 運(yùn)動物體的檢測與跟蹤
3.1 目標(biāo)檢測
目標(biāo)檢測即為從攝像機(jī)視野區(qū)域的序列圖像中將進(jìn)入該區(qū)域的運(yùn)動物體從場景中提取出來。運(yùn)動目標(biāo)檢測的算法依照目標(biāo)與攝像機(jī)之間的關(guān)系可以分為靜態(tài)背景下運(yùn)動檢測和動態(tài)背景下運(yùn)動檢測[2]。背景差分法、幀間差分法以及光流法等是靜態(tài)背景下運(yùn)動目標(biāo)檢測的常用方法。對于動態(tài)背景下運(yùn)動目標(biāo)檢測,其算法要比靜態(tài)背景下的運(yùn)動目標(biāo)檢測復(fù)雜得多。
3.2 目標(biāo)跟蹤
視頻信息中,運(yùn)動目標(biāo)跟蹤就是在圖像序列中尋找與檢測目標(biāo)匹配最相似目標(biāo)區(qū)位置的過程。簡單的說,就是在攝像機(jī)采集的序列圖像中為目標(biāo)確定在圖像區(qū)域中的位置。跟蹤算法通常有以下四類:基于主動輪廓的跟蹤、基于特征的跟蹤、基于區(qū)域的跟蹤和基于模型的跟蹤等。算法的精度、魯棒性和實(shí)時性是衡量跟蹤效果的主要指標(biāo)。
4 運(yùn)動目標(biāo)檢測跟蹤的算法實(shí)現(xiàn)
4.1 運(yùn)動檢測跟蹤算法
平臺硬件由PC機(jī)和通用攝像機(jī)組成,攝像機(jī)所帶開發(fā)包提供二次開發(fā)的API接口函數(shù)。平臺在進(jìn)行運(yùn)動物體檢測跟蹤時所采用的算法是:首先利用“幀差法”檢測出初始的運(yùn)動目標(biāo);一旦認(rèn)為此目標(biāo)合法,便根據(jù)目標(biāo)在HSI(色調(diào)、飽和度、強(qiáng)度)空間中H通道的色調(diào)特性,利用“連續(xù)適應(yīng)性均值移動算法(CamShift)”,對目標(biāo)進(jìn)行跟蹤。
CamShift算法簡述如下:首先,在圖像HSI空間中計算H通道(色彩通道)分量的1D直方圖;接著,利用此1D直方圖將原圖改建成2D概率分布圖;第三步,計算出目標(biāo)區(qū)域的重心;第四部,利用經(jīng)典的“Mean Shift”算法,不斷平移調(diào)整窗口中心到與目標(biāo)重心重合;第五步,將上一幀的窗口大小和中心,作為下一幀Mean Shift算法搜索窗口的初始值,在下一幀中繼續(xù)Mean Shift運(yùn)算。
上述運(yùn)動物體檢測和跟蹤的算法運(yùn)算量小,跟蹤效果好。只要初始抓取目標(biāo)無誤,并且在色彩空間上目標(biāo)與背景有一定偏差,視頻跟蹤便能夠達(dá)到相當(dāng)?shù)臏?zhǔn)確度。更好的一點(diǎn)是,此算法在跟蹤同一場境內(nèi)多個運(yùn)動目標(biāo)其中的一個時的效果,是其它同樣計算復(fù)雜度的算法所難以比擬的。
4.2 VC++6.0編程環(huán)境下的實(shí)現(xiàn)
目標(biāo)檢測與跟蹤的算法程序編寫在VC++6.0環(huán)境下結(jié)合OpenCV進(jìn)行實(shí)現(xiàn)。為了達(dá)到良好的實(shí)時性能,充分利用CPU資源,本平臺采用多線程并發(fā)處理模式進(jìn)行編程,以達(dá)到提高程序運(yùn)行效率的目的[3]。
本平臺中,算法程序由兩個線程組成:MainThread線程和GetImageThread線程。MainThread線程是算法實(shí)現(xiàn)的主線程,主要功能就是利用OpenCV函數(shù)庫,對從攝像頭獲取的圖像數(shù)據(jù)進(jìn)行分析處理,同時,它負(fù)責(zé)啟動GetImageThread線程。GetImageThread線程的主要工作就是循環(huán)地從攝像頭讀取數(shù)據(jù)放到緩存中,以供主線程分析。在視頻采集處理的過程中,GetImageThread線程向緩存中寫數(shù)據(jù)與從緩存中讀數(shù)據(jù)將不可避免地操作同一塊緩存。因此,為防止數(shù)據(jù)讀寫沖突出錯,兩線程在操作這塊緩存時都必須上鎖,可以通過“互斥量”來實(shí)現(xiàn)的。此外,為防止主線程重復(fù)地分析同一幀圖像,要求MainThread線程必須等待GetImageThread線程的一個信號才能進(jìn)行數(shù)據(jù)讀取和分析。
5 實(shí)驗結(jié)果
經(jīng)過實(shí)驗證明,本文構(gòu)建的基于OpenCV計算機(jī)視覺庫的運(yùn)動目標(biāo)檢測跟蹤實(shí)驗平臺可以在實(shí)時顯示圖像的基礎(chǔ)上,實(shí)時檢測和跟蹤運(yùn)動目標(biāo),并且檢測和跟蹤都具有較高的魯棒性。在跟蹤過程中,即使目標(biāo)保持靜止,程序也不會丟失對目標(biāo)的跟蹤。以橙色小球檢測跟蹤實(shí)驗為例,檢測跟蹤結(jié)果如圖1所示:
實(shí)踐表明,OpenCV使得在PC機(jī)上的數(shù)字圖像處理和計算機(jī)視覺處理變得更加簡單便捷、高效優(yōu)化。本平臺的構(gòu)建為計算機(jī)視覺研究提供了一個基礎(chǔ)平臺,對學(xué)習(xí)和掌握OpenCV、熟悉圖像處理技術(shù),特別是運(yùn)動目標(biāo)跟蹤方面的知識,以及提高Windows操作系統(tǒng)下的C++編程能力等方面,能夠起到很大的作用。
參考文獻(xiàn)
[1] 布拉德斯基.學(xué)習(xí)OpenCV [M], 北京:清華大學(xué)出版社,2009.
[2] 張娟,毛曉波,等.運(yùn)動目標(biāo)跟蹤算法研究綜述[J],《計算機(jī)應(yīng)用研究》, 2009, 26(12):4407-4410
[3] Jeffery Richter. Windows核心編程[M],北京: 機(jī)械工業(yè)出版社,2008.