摘 要:研究在動態(tài)背景下對視頻圖像序列進(jìn)行運(yùn)動目標(biāo)的檢測。主要包括三個步驟,分別是運(yùn)動估計(jì),運(yùn)動補(bǔ)償和目標(biāo)檢測。在運(yùn)動估計(jì)中采用的主要是基于特征點(diǎn)匹配算法。這種算法與傳統(tǒng)的塊匹配算法最大的好處在于它的數(shù)據(jù)量少,計(jì)算簡單迅速而且圖像的匹配可靠性更高。最后用計(jì)算機(jī)視覺庫OpenCV進(jìn)行實(shí)現(xiàn)。
關(guān)鍵詞:運(yùn)動目標(biāo)檢測;動態(tài)背景;特征點(diǎn)匹配;OpenCV
Moving object detection in dynamic background based on OpenCV
HUANG Tianqi CHEN Dongqin YIN Xudong
(School of Computer Science and Engineering,Changshu Institute of Technology,Changshu 215500,China)
Abstract:The moving object detection in dynamic background in the video image sequence is studied. The method includes three steps, they are motion estimation, motion compensation and object detection. At the motion estimation, an algorithm based on the feature points matching is taken. The advantages of this algorithm is that it needs fewer data and indicates faster calculating speed compared to the block matching algorithm and the matching of the video image sequence is more reliable. At last the algorithm is implemented using an computer vision library named OpenCV.
Key words:moving object detection;dynamic background;feature points matching;OpenCV】
隨著社會的發(fā)展,在日常生活中攝像頭已經(jīng)隨處可見,我們經(jīng)常需要對視頻中的人、物進(jìn)行捕捉、檢測、跟蹤等圖片處理操作,這就要求對視頻中的運(yùn)動目標(biāo)進(jìn)行檢測及跟蹤。作為視覺領(lǐng)域的一部分,該技術(shù)在安保、交通、軍事、醫(yī)學(xué)等各種領(lǐng)域里都有著廣泛的應(yīng)用。
所謂運(yùn)動目標(biāo)的檢測就是在一段序列圖像中檢測出變化區(qū)域,并將運(yùn)動目標(biāo)從背景圖像中提取出來[1]。能否正確地檢測與分割出運(yùn)動目標(biāo)對于后續(xù)處理,諸如跟蹤分析等工作有著巨大的影響。常見的運(yùn)動目標(biāo)檢測方法有:背景差分法,幀差法,累積差分法,光流法[1-2]。本文主要研究的是一種在動態(tài)背景下對運(yùn)動目標(biāo)進(jìn)行檢測的算法——改進(jìn)的幀差法。
1 靜態(tài)背景下的檢測算法
目標(biāo)檢測算法有多種,不同的算法有其各自的利與弊。(1)背景差分法是事先將背景圖像存儲下來,再與觀測圖像進(jìn)行差分運(yùn)算,實(shí)現(xiàn)對運(yùn)動區(qū)域的檢測。這種方法能得到較為完整的運(yùn)動目標(biāo)信息,但背景圖像必須隨著外部條件比如光照等的變化而不斷更新,所以背景模型的獲取和更新比較麻煩。(2)幀差法是直接比較相鄰兩幀圖像對應(yīng)像點(diǎn)的灰度值的不同,然后通過閾值來提取序列圖像中的運(yùn)動區(qū)域。這種方法更新速度快,算法簡單易實(shí)現(xiàn),適應(yīng)性強(qiáng),不需要獲取背景圖像。但是背景與運(yùn)動目標(biāo)間需要有一定程度的灰度差,否則可能在目標(biāo)內(nèi)部產(chǎn)生空洞,不能完整的提取出運(yùn)動目標(biāo)。為了改進(jìn)相鄰兩幀間的差分效果,人們提出了累積差分法。(3)累積差分法是利用三幀圖像計(jì)算兩個差分圖像,再令其對應(yīng)像素相乘的算法。它通過分析整個圖像序列的變化來檢測小位移或緩慢運(yùn)動的物體。(4)光流法是在時間上連續(xù)的兩幅圖像中,用向量來表示移動前后的對應(yīng)點(diǎn),在適當(dāng)平滑性約束的條件下,根據(jù)圖像序列的時空梯度估計(jì)運(yùn)動場,通過分析運(yùn)動場的變化對運(yùn)動目標(biāo)和場景進(jìn)行檢測和分割。
2 動態(tài)背景下的檢測算法
2.1 概述
在很多情況下背景圖像都不是靜態(tài)的,比如有時攝像機(jī)安裝在一個運(yùn)動的平臺上,或者它本身也會在一定范圍內(nèi)進(jìn)行掃描運(yùn)動,這樣一來就會出現(xiàn)圖像背景的全局運(yùn)動。這時就需要對幀間圖像進(jìn)行配準(zhǔn),再經(jīng)過全局背景的運(yùn)動補(bǔ)償,然后才可以通過差分檢測檢測出目標(biāo)。
這種通過全局運(yùn)動估計(jì)進(jìn)行運(yùn)動目標(biāo)檢測的主要步驟如圖1所示。
2.2 運(yùn)動估計(jì)
運(yùn)動矢量估計(jì)的算法有多種,本文采用的是特征點(diǎn)匹配算法,也是目前使用較多的一種算法。它的方法是在圖像中找到基準(zhǔn)圖像的每一特征點(diǎn)的唯一匹配點(diǎn),通過兩幀間點(diǎn)位置的變化求出其位移矢量,再將所有運(yùn)動信息帶入運(yùn)動模型求出背景的全局運(yùn)動參數(shù)。以基準(zhǔn)圖像的特征點(diǎn)為中心對匹配圖像中使用三步搜索算法[3]進(jìn)行快速搜索。三步搜索算法的具體步驟為:
⑴以當(dāng)前特征點(diǎn)為中心,以4(可以更改)為步幅,將各單位正方形上的頂點(diǎn)(共9個點(diǎn))與當(dāng)前特征點(diǎn)進(jìn)行匹配,求出最佳匹配的特征點(diǎn)中心位置。
⑵以第一步求出的最佳特征點(diǎn)為中心,以2為步幅,將各單位正方形上的頂點(diǎn)(共9個點(diǎn))與當(dāng)前特征點(diǎn)進(jìn)行匹配,求出最佳匹配的特征點(diǎn)中心位置。
⑶以第二步求出的最佳特征點(diǎn)為中心,以1為步幅,將各單位正方形上的頂點(diǎn)(共9個點(diǎn))與當(dāng)前特征點(diǎn)進(jìn)行匹配,求出最佳匹配的特征點(diǎn)中心位置。它與當(dāng)前特征點(diǎn)中心的位置偏移量即為估計(jì)的位移量。
2.3 運(yùn)動補(bǔ)償
這一步的主要目的是盡量將由于攝像機(jī)的運(yùn)動而引起的背景移動消除。這里不需要估計(jì)所有像素點(diǎn)的運(yùn)動矢量。在上面特征點(diǎn)匹配的基礎(chǔ)上,采用仿射變換模型參數(shù)。設(shè)t時刻特征點(diǎn)的位置為(X,Y),t+1時刻的坐標(biāo)為(X’,Y’)。若以二維仿射變換描述其運(yùn)動,則關(guān)系可表示為:
由式(1)可知三個不共線的特征點(diǎn)就可以求得唯一解,顯然這是不合理的。所以我們采用最小二乘法,用所有已知特征點(diǎn)來求解參數(shù),這樣可以減小誤差。反向運(yùn)動補(bǔ)償后當(dāng)前的幀圖像和參考的幀圖像重合這樣就可以消除因攝像機(jī)掃描晃動而引起的背景移動。
2.4 目標(biāo)檢測
將背景圖像的穩(wěn)定序列進(jìn)行幀差運(yùn)算即可獲得運(yùn)動目標(biāo)區(qū)域,完成目標(biāo)檢測。
3 OpenCV實(shí)現(xiàn)
3.1 概述
OpenCV是一個開源的計(jì)算機(jī)視覺處理庫。它由一系列C函數(shù)和C++類構(gòu)成,獨(dú)立于操作系統(tǒng)、硬件和圖形管理器,具有通用的圖像與視頻載入、保存和獲取模塊,具有底層和高層的應(yīng)用開發(fā)包。功能涵蓋圖像處理,計(jì)算機(jī)視覺庫和模式識別等領(lǐng)域[4]。
OpenCV常用的圖象函數(shù):
分配圖像:IplImage* cvCreateImage(CvSize size, int depth, int channels);
其中:depth為像素深度,channels為每個像素值的通道數(shù)
釋放圖像:void cvRealeaseImage(IplImage**);
讀取圖像:img=cvLoadImage(filename);//filename為文件的目錄名
OpenCV常用的基礎(chǔ)結(jié)構(gòu)體包括:
(1)CvPoint:定義整型坐標(biāo)上的點(diǎn):
typedef struct {
int x; //x坐標(biāo)
int y; //y坐標(biāo)
} CvPoint;
(2)CvSize:定義矩形框大?。?/p>
typedef struct {
int width;
int height;
} CvSize;
還有其他基礎(chǔ)結(jié)構(gòu)體如:CvRect,CvScalar,CvMat,CvArr,IplImage等限于篇幅不再列出。
3.2 實(shí)現(xiàn)過程
3.2.1 灰度轉(zhuǎn)換
灰度連換或灰度化就是將一張三通道RGB顏色的圖像變成單通道灰度圖,為接下來的圖像處理做準(zhǔn)備。在RGB模型中,如果R=G=B時,則彩色表示一種灰度顏色,其中R=G=B的值叫灰度值。
首先使用cvCvtColor函數(shù)轉(zhuǎn)換原始圖片至灰度圖:
cvCvcolor(img,pImg,CV_BGR2GARY);
其中img為加載的源圖像,pImg是轉(zhuǎn)換以后的灰度圖。
3.2.2 二值化處理
cvThreshold函數(shù)可把圖像轉(zhuǎn)換為自適應(yīng)二值圖。二值化是將圖像上的像素點(diǎn)的灰度值設(shè)置為0或255,也就是使整個圖像呈現(xiàn)出明顯的黑白效果。二值化的處理強(qiáng)化了銳利的邊緣,進(jìn)一步去除圖像中無用的信息,但在使用過程中要注意閾值的選取。
cvSmooth(pMat,pMat,CV_GAUSSIAN,3,0,0); // 高斯濾波,先平滑圖像,pMat為當(dāng)前幀。
cvThreshold(pMat,pImg,60,255,0,CV_THRESH_BINARY);
3.2.3 形態(tài)學(xué)處理
接下來就是進(jìn)行一系列腐蝕膨脹處理,在閾值分割后,圖像中可能還存在一些空洞噪聲影響,形態(tài)學(xué)處理進(jìn)行進(jìn)一步去噪。膨脹腐蝕主要是通過cvDilate和cvErode這兩個函數(shù)來實(shí)現(xiàn)效果。
cvErode(pImg,pImg,0,1); //膨脹函數(shù)
cvDilate (pImg,pImg,0,1); //腐蝕函數(shù)
最后用OpenCV處理出的結(jié)果如圖4所示。
4 結(jié)論
本文采用了特征點(diǎn)匹配算法做運(yùn)動估計(jì),該方法能夠迅速且高可靠性地對圖像進(jìn)行匹配。采用了基于特征點(diǎn)匹配的基礎(chǔ)上的仿射變換模型參數(shù)和最小二乘法,用所有已知特征點(diǎn)來求解參數(shù)。該方法有效地減少了誤差,進(jìn)行反向運(yùn)動補(bǔ)償后可以消除因運(yùn)動而引起的背景移動。采用了幀差法獲得運(yùn)動目標(biāo)區(qū)域,完成目標(biāo)檢測。在OpenCV開發(fā)平臺下實(shí)現(xiàn)了算法,在運(yùn)動平臺上的攝像頭拍攝的圖像中可以有效地檢測出運(yùn)動的目標(biāo),且具有較好的檢測性能。
[參考文獻(xiàn)]
[1]郭寶龍,孫偉.數(shù)字圖像處理系統(tǒng)工程導(dǎo)論[M].西安:西安電子科技大學(xué)出版社,2012:121-126.
[2]谷口慶治.數(shù)字圖像處理(應(yīng)用篇)[M].北京:科學(xué)出版社共立出版,2002:291-297.
[3]朱秀昌,劉峰,胡棟.數(shù)字圖像處理與圖像通信(修訂版)[M].北京:北京郵電大學(xué)出版社,2008:298-300.
[4]劉瑞禎,于仕琪.OpenCV教程(基礎(chǔ)篇)[M].北京:北京航空航天大學(xué)出版社,2007:1-90.