李 如,胡競(jìng)文
(河南科技學(xué)院,河南 新鄉(xiāng) 453003)
現(xiàn)代社會(huì)對(duì)小區(qū)和居家安全的關(guān)注和要求不斷提高,運(yùn)動(dòng)目標(biāo)的識(shí)別與跟蹤技術(shù)也已經(jīng)迅速發(fā)展成為現(xiàn)代信息處理領(lǐng)域中一項(xiàng)非常重要的技術(shù),在許多領(lǐng)域都發(fā)揮著不可代替的作用。目前,目標(biāo)檢測(cè)與跟蹤算法已經(jīng)較為成熟,但其在與嵌入式結(jié)合方面的應(yīng)用研究還處于探索階段,很多識(shí)別算法還未移植到相關(guān)平臺(tái)。
由于嵌入式和各類開源硬件具有方便攜帶、占位置小等優(yōu)勢(shì),故在無(wú)法連接計(jì)算機(jī)的地方,如野外、便利店門口、街口等地,可實(shí)時(shí)完成對(duì)采集數(shù)據(jù)的處理。因此,根據(jù)上述情況設(shè)計(jì)一個(gè)能夠?qū)崟r(shí)調(diào)用識(shí)別算法,在計(jì)算機(jī)無(wú)法裝配的地方實(shí)現(xiàn)對(duì)目標(biāo)檢測(cè)與跟蹤系統(tǒng)是本次項(xiàng)目的主要目的。
本系統(tǒng)的實(shí)現(xiàn)主要可分為兩個(gè)步驟。第一步是攝像頭傳回實(shí)時(shí)視頻的數(shù)據(jù)采集和對(duì)視頻的逐幀數(shù)據(jù)處理,完成后即可獲得視頻每一幀中目標(biāo)中心坐標(biāo)。繼而在第二步中轉(zhuǎn)換成電信號(hào)傳遞給控制攝像頭位置的舵機(jī)以實(shí)現(xiàn)攝像頭對(duì)目標(biāo)的跟蹤。
系統(tǒng)中的Raspberry通過(guò)排線連接攝像頭模塊(Pi Cam)[1]傳回實(shí)時(shí)視頻。并使用GitHub上提供的MMAL庫(kù)和Raspivid的源代碼,使其可以通過(guò)OpenCV進(jìn)行圖像處理。
程序運(yùn)行時(shí)會(huì)默認(rèn)解析上次運(yùn)行時(shí)錄制的視頻文件,我們可以檢測(cè)該視頻中的運(yùn)動(dòng)。如果不存在存儲(chǔ)的視頻,程序會(huì)轉(zhuǎn)而調(diào)用攝像頭數(shù)據(jù)。程序中定義了區(qū)域圖像的最小像素尺寸,為了防止像素級(jí)別的光線變化和塵埃影響,處理圖像數(shù)據(jù)之前進(jìn)行降噪,過(guò)濾掉對(duì)于運(yùn)動(dòng)跟蹤無(wú)用的數(shù)據(jù)。
數(shù)據(jù)處理主要是利用Camshift算法對(duì)圖像的每一幀進(jìn)行處理。具體做法是遍歷攝像頭數(shù)據(jù)流的同時(shí),程序中的camera.read()將返回一個(gè)二元組[2]。首值為grabbed,將用于判斷讀取frame的緩沖是否成功。末值則為frame的值。
程序通過(guò)調(diào)用OpenCV中的函數(shù)對(duì)攝像頭中的圖像進(jìn)行處理,并將運(yùn)動(dòng)跟蹤數(shù)據(jù)傳回。數(shù)據(jù)在終端進(jìn)一步轉(zhuǎn)換為Arduino可以運(yùn)行的源文件,進(jìn)而控制舵機(jī)使攝像頭進(jìn)行X軸和Y軸雙方向轉(zhuǎn)向。
進(jìn)行運(yùn)動(dòng)分析之前,為了提高精確度并降低數(shù)據(jù)量和方便計(jì)算機(jī)進(jìn)行顏色之間的對(duì)比處理,故先進(jìn)行反向投影圖處理。隨后程序?qū)D像幀進(jìn)一步轉(zhuǎn)換為灰階圖像,并調(diào)整到合適的大小,去除無(wú)用的RGB格式有利于壓縮數(shù)據(jù)提高運(yùn)行速度。而使用高斯模糊平滑圖像是對(duì)一個(gè)11×11的區(qū)域的像素強(qiáng)度進(jìn)行平均能進(jìn)一步過(guò)濾使檢測(cè)算法失效的高頻噪音。
1.2.1 獲取反向投影圖
單幀圖像轉(zhuǎn)換為HSV圖像后,即可對(duì)其進(jìn)行反向投影處理。反向投影的原理是對(duì)需要處理圖像的H分量單獨(dú)作直方圖,其中,不同H分量值的概率和像素總數(shù)各不相同,查找H分量大小的概率,可以到顏色概率查找表查找。再將圖像中像素的值用其顏色出現(xiàn)的概率對(duì)替換,就得到了顏色概率分布圖。所得到的輸出的顏色概率分布圖為一個(gè)灰度圖像。
其具體步驟是:
(1)對(duì)測(cè)試圖像中的每個(gè)像素( p(i, j) ),獲取色調(diào)數(shù)據(jù)并找到該色調(diào)( H ij, S ij )在直方圖中bin的位置。
(2)查詢模型直方圖中對(duì)應(yīng)bin的數(shù)值。
(3)將此數(shù)值存儲(chǔ)在新的反射投影圖像中。也可以先歸一化直方圖數(shù)值0~255,這樣可以直接顯示反射投影圖像。
對(duì)每個(gè)像素進(jìn)行(1)~(3)步驟的循環(huán)即可完成對(duì)一整幀的反投影處理。而在OpenCV中,使用calcBackProject()函數(shù)便可進(jìn)行上述處理。
反向處理后可得到目標(biāo)圖像的顏色直方圖,以及反向投影,此輸出與輸入圖像同等大小,其上的像素表征一種概率,即全圖上該點(diǎn)是目標(biāo)圖像一部分的概率。像素點(diǎn)亮度大小直接與該點(diǎn)是否屬于原圖的概率相關(guān)[3]。
1.2.2 利用CamShift算法獲得移動(dòng)軌跡
CamShift算法的程序?qū)崿F(xiàn)步驟如下:
(1)提取運(yùn)動(dòng)物體的輪廓,并從原圖中獲取運(yùn)動(dòng)圖像的信息。對(duì)這個(gè)信息進(jìn)行反向投影,獲取反向投影圖。根據(jù)反向投影圖和輸入的方框進(jìn)行meanshift迭代,由于它是向重心移動(dòng),即向反向投影圖中概率大的地方移動(dòng),所以始終會(huì)移動(dòng)到目標(biāo)上。
(2)運(yùn)用運(yùn)動(dòng)檢測(cè)算法將運(yùn)動(dòng)的物體與背景分割開來(lái)。程序通過(guò)兩方相應(yīng)的像素強(qiáng)度差的絕對(duì)值來(lái)計(jì)算兩幀的不同。如果兩幀的數(shù)據(jù)差少于運(yùn)動(dòng)跟蹤的設(shè)定值,將其設(shè)置為黑色。若差值大于設(shè)定值,則將其設(shè)定為白色。
(3)下一幀圖像用上一幀輸出的方框來(lái)迭代即可。
完成圖像處理后,視頻中跟蹤目標(biāo)圈定的中心坐標(biāo)軌跡將寫入outpos文件,示例如圖1所示。其中命令行中每一行“1”代表上一行坐標(biāo)可以寫入文件。為了避免靜止不動(dòng)的鏡頭,沒有識(shí)別時(shí)的(0,0)坐標(biāo)均不會(huì)寫入outpos文件。
通過(guò)Raspberry上Python程序?qū)ψ鴺?biāo)的處理,即可得到控制方向的4位二進(jìn)制碼用于控制舵機(jī)方向,處理方式如圖2所示。高兩位控制垂直方向,低兩位控制水平方向。1為轉(zhuǎn)動(dòng),0為靜止。使得攝像頭可以跟隨追蹤物體移動(dòng)。
通過(guò)上述過(guò)程即可實(shí)現(xiàn)在嵌入式等硬件平臺(tái)上的實(shí)時(shí)目標(biāo)跟蹤與處理。嵌入式與識(shí)別算法的結(jié)合也是目前探索領(lǐng)域的大勢(shì)所趨。采用OpenCV的開源算法也使設(shè)計(jì)的工作量減少,高效地實(shí)現(xiàn)識(shí)別跟蹤。系統(tǒng)采用的嵌入式平臺(tái)能夠滿足實(shí)時(shí)性和小型化的要求??梢赃\(yùn)用于各種場(chǎng)合,如街口、商店等地。本系統(tǒng)的與日常使用的監(jiān)控設(shè)備相比較為突出的優(yōu)點(diǎn)是可以根據(jù)用戶的需求更改跟蹤目標(biāo)。
圖1 獲得坐標(biāo)文件outpos
圖2 舵機(jī)轉(zhuǎn)動(dòng)控制