隨著信息技術(shù)的飛速發(fā)展,利用日趨強大的信息化手段對交通系統(tǒng)進行管理也成為了一種發(fā)展趨勢,上世紀(jì)八十年代開始,智能交通系統(tǒng)(Intelligent Trans-portation System,簡稱 ITS)得到了快速的發(fā)展。面對現(xiàn)代化交通對信息需求的日益增長,ITS 不但可以在交通管理層面利用計算機強大的計算能力進行更加科學(xué)高效的交通規(guī)劃和管理,并可以通過先進的自動化設(shè)備獲得更豐富的交通信息。
本文實現(xiàn)了一個基于視頻的交通檢測系統(tǒng),研究的范圍包括視頻幀的獲取,圖像處理,車輛的檢測與跟蹤,以及交通宏觀信息的獲取。詳細(xì)探討了車輛的檢測與跟蹤的技術(shù)方法,主要工作體現(xiàn)在如下幾個方面:
(1) 采用 Directshow 技術(shù)對視頻圖像幀進行獲取。
(2) 采用 OpenCV 庫進行相關(guān)的圖像處理并對感興趣區(qū)域進行提取。
(3) 分析和探討了基于連續(xù)圖像幀之間的運動物體檢測技術(shù),比較和權(quán)衡了各種算法,在已經(jīng)取得的研究成果的基礎(chǔ)上,提出了基于檢測線的車輛發(fā)現(xiàn)方法。
2 開發(fā)環(huán)境介紹
視頻處理一般是基于視頻中一幀一幀的數(shù)據(jù),所以首要的任務(wù)就是將視頻中一幀一幀的圖像獲得到。在這個過程中我們采用了基于COM 組件技術(shù)的DirectShow 開發(fā)包。DirectShow 通過對過濾器的拼接來完成視頻播放和處理任務(wù),使得開發(fā)者不必關(guān)注視頻的解碼方式,從而將更多的精力放在圖像處理的部分。
而在圖像處理過程中,我們需要一套強大而高效的 API,使我們不需要關(guān)注最底層的圖像處理過程,從而將精力都放在上層的算法的研究中。而在這里我們選擇了 Intel 公司的 OpenCV 圖像處理函數(shù)庫,下面就針對 OpenCV 和 DirectShow 開發(fā)包進行介紹。
2.1 OpenCV 的介紹
OpenCV 是 Intel 公司的一個開源的圖像處理函數(shù)庫。它包括 300 多個 C/C++函數(shù)的跨平臺的中、高層API,它不依賴于其它的外部庫。
OpenCV 包含了計算機視覺和圖像處理方面的許多通用算法,它包括以下功能:對圖像數(shù)據(jù)的操作、對圖像和視頻的輸入和輸出、對矩陣和向量的操作、具有線性代數(shù)的算法程序、對各種動態(tài)數(shù)據(jù)結(jié)構(gòu)進行操作、基本的數(shù)字圖像處理能力、對各種結(jié)構(gòu)進行分析、對攝像機定標(biāo)、對運動進行分析、對目標(biāo)進行識別,另外 OpenCV 還具有具有基本的 GUI 功能,還可對圖像進行標(biāo)注等。
在 OpenCV 庫中,最常用也是最基本的一個數(shù)據(jù)結(jié)構(gòu)是 Ip1Image,它在 OpenCV 中用來存儲位圖的數(shù)據(jù)結(jié)構(gòu),使用頻率是非常高的,所以在這里有必要介紹一下它。Ip1Image 在 OpenCV 中的定義如程序1所示:
Typedef struct_Ip1Image{
int nSize; int ID; int nChannels; int depth; int dataOrder; int origin; int width; int height; struct _Ip1Image *maskROI;
struct _Ip1ROI *roi; void *imageId; struct_Ip1TileInfo *tileInfo;
int imageSize; char *imageData;
int widthStep; char *imageDataOrigin; }Ip1Image; (程序 1) Ip1Image 結(jié)構(gòu)是來源于 Intel Image Precssiong
Libray,使用函數(shù) cvCreateImage 來初始化 Ip1Image結(jié)構(gòu),函數(shù)的定義如程序 2 所示,這個函數(shù)只是單純分配一塊沒有存放內(nèi)容的內(nèi)存。當(dāng)為其中的參數(shù) depth 賦值為 IPL_DEPTH_8U 時,初始化的是一個單通道無符號整形圖像,而賦值為 IPL_DEPTH_32F 時,初始化的是一個三通道浮點圖像。
Ip1Image*cvCreateImage(CvSize size, int depth, int channels); (程序 2)
有關(guān)OpenCV 實現(xiàn)其它功能的函數(shù),文章中會貫穿的介紹。
2.2 DirectShow 的介紹
DirectShow 是微軟在 Active Movie 和 Video for Windows 的基礎(chǔ)上,推出的新一代的基于 COM 組件
技術(shù)的流媒體處理的開發(fā)工具包。它為需要自定義解決方案的應(yīng)用程序提供了對底層流控制結(jié)構(gòu)的訪問。從網(wǎng)絡(luò)應(yīng)用的角度看,DirectShow 可用于視頻點播、視頻會議和視頻監(jiān)控等領(lǐng)域。
當(dāng)播放媒體文件時,F(xiàn)ilter Graph Manager 首先建立一個 Filter Graph。在 Filter Graph 中,源過濾器負(fù)責(zé)讀取原始的媒體數(shù)據(jù)流,變換過濾器完成對這些數(shù)據(jù)流的解碼,最后由提交過濾器將解碼的結(jié)果顯示出來。此時的媒體數(shù)據(jù)已經(jīng)轉(zhuǎn)換為一幀一幀的圖像,就可以方便的將它們一張張的捕捉下來了。
3車輛檢測模塊的設(shè)計和實現(xiàn)
3.1 車輛檢測模塊的算法流程
使用 DirectShow,我們可以從交通視頻中取得一幀一幀連續(xù)的圖像,車輛的檢測和發(fā)現(xiàn)操作就是
基于對這些連續(xù)圖像幀的處理和分析的。按照一般的運動檢測方法和目標(biāo)跟蹤手段,我們將取到的原始真彩色圖像幀首先做灰度化處理,然后進行平滑操作,并基于背景差分法和幀間差分法進行感興趣區(qū)域的提取,最后得到二值化的感興趣區(qū)域圖像。根據(jù)連續(xù)幀的二值圖像檢測出新進入畫面的車輛,之后進行基于自適應(yīng)邊框的精確車輛定位,從而完成車輛的檢測。本章的后面部分將對其中各個步驟進行詳細(xì)的介紹。
3.2 視頻圖像幀的預(yù)處理
3.2.1 圖像灰度化處理
一般的圖像處理運算都是在灰度圖像上面進行的,灰度圖是只保留了圖像的亮度信息的圖像,因為灰度圖像可以在保留足夠的內(nèi)容信息的同時,有效的降低運算量。所以,我們首先要將原始的視頻幀圖像進行灰度化處理,即將真彩色圖像中的每個像素點都轉(zhuǎn)換成 8bit 長度的亮度值,使所有像素的灰度值都在[0,255]范圍之內(nèi)。
程序 3 是 OpenCV 中對圖像進行顏色模型轉(zhuǎn)換的函數(shù),而圖像的灰度化也屬于一種顏色模型的轉(zhuǎn)換:
void cvCvtColor(const CvArr* src, CvArr*dst, int code); (程序 3)
此函數(shù)將 RGB 顏色空間表示的真彩色圖像進行灰度化的內(nèi)部算法如公式(1)所示:
Y=0.212671*R+0.715160*G+0.072169*B(1)
我們平時比較常用的將 RGB 真彩色圖像灰度化的算法如公式(2)所示:
Y=0.299*R+0.587*G+0.114*B(2)
這兩個公式都是依據(jù)在 R、G、B 三個顏色通道中亮度值的貢獻比例而得到的。
3.2.2 圖像平滑處理
視頻圖像在采集的過程中會不可避免的引入噪聲,噪聲的來源主要有電磁轉(zhuǎn)換和光電轉(zhuǎn)換引入的噪聲、獲取圖像時存在的不確定因素以及自然起伏性的噪聲。
為了去除視頻圖像中的噪聲,從而使圖像中的有用信息更加清晰,我們就需要對已經(jīng)進行了灰度化的圖像進行平滑操作。運算要求能夠有效的減少各種類型的噪聲的同時,也要能夠很好的保留原圖像中的輪廓信息。
void cvSmooth(const CvArr* src, CvArr* dst,
int smoothtype=CV_GAUSSIAN, int param1=3,
int param2=0, double param3=0,
double param4=0); (程序 4) OpenCV 中提供的圖像的平滑處理的函數(shù)為
cvSmooth,它的聲明如程序 4 所示,這個函數(shù)提供了很多種平滑算法供選擇,包括簡單不帶尺度變換的模糊、簡單濾波、高斯濾波、中值濾波和雙向濾波等。在這里,我們采用了中值濾波來對經(jīng)過了灰度化的圖像進行濾波。
中值濾波的計算原理為:對于一幅圖像,選取 N*N 像素大小的窗口,其中 N 為奇數(shù),對于圖像中的每一個能夠放置這個窗口的位置,取出這個窗口中的所有像素點,將所有像素點的灰度值排序。由于 N 為奇數(shù),那么在所有的 N*N 個像素點中必有一個中值,然后用此中值代替原窗口中心像素點的像素值。
3.3 背景差分法和幀間差分法的結(jié)合
在交通檢測系統(tǒng)中,由于車輛顏色各異,有一些
車輛的灰度范圍與道路背景的灰度范圍比較接近,在這種情況下,使用背景差分法往往很難得到清晰完整的車輛運動區(qū)域,往往會出現(xiàn)區(qū)域不聯(lián)通和邊界不清
const CvArr* src2,
CvArr* dst); (程序 5)
在 OpenCV 中實現(xiàn)兩幀差分運算的函數(shù)為cvAbsDiff,如程序 5 所示,它的功能就是將兩幅灰度圖像做差再取絕對值,它得到的結(jié)果也是灰度圖像。
圖 1 展現(xiàn)的是交通視頻中的某一幀圖像經(jīng)過一系列處理而得到的灰度圖與此時動態(tài)生成的虛擬背景做差分之后的二值化圖像。此時,車輛和行人已經(jīng)能夠分辨出來了。
類似的方法,通過函數(shù) cvAbsDiff 將當(dāng)前幀的灰度圖像與上一幀的灰度圖像做差分,車輛的邊緣信息得到了比較好的保留,但幀間差分法也導(dǎo)致了車輛區(qū)域內(nèi)部形成了一定程度的空洞,這是由于車輛內(nèi)部的顏色比較一致而導(dǎo)致的。而這個缺點就可以通過融合背景差分法而得到彌補。
背景差分法與幀間差分法相結(jié)合,就是先分別通過這兩種方法所得到灰度圖像,并分別對它們進行二值化處理,最后對這兩幅二值圖像進行按對應(yīng)像素或運算而得到的。在 OpenCV 中,兩幅圖像的對應(yīng)像素進行或運算的函數(shù)如程序6 所示,其中參數(shù)src1 和src2 是兩幅輸入圖像的指針,而參數(shù)dst 是存放結(jié)果的圖像指針,mask 參數(shù)仍然表示一個蒙板,只有當(dāng)mask 中與輸入圖像對應(yīng)像素的元素值為1 時,才對輸入圖像中的對應(yīng)像素進行運算,從而使兩幅圖片的或運算能夠更加靈活的實現(xiàn)。而在本系統(tǒng)所使用的方法中,兩幅圖像直接無蒙板做或運算即可。圖3顯示了圖2與圖1進行或運算之后得到的結(jié)果。可以看出,相比圖1和2,圖3的車輛內(nèi)部更加飽滿,邊緣也更加清晰,每一輛車的白色塊相對更加的完整,用肉眼也可以比較容易分辨出一輛一輛的車,這樣能夠為后續(xù)的車輛的識別運算提供保障。
void cvOr(const CvArr* src1, const CvArr* src2, CvArr* dst,
const CvArr* mask=NULL); (程序 6)
3.4 車輛的發(fā)現(xiàn)
在得到二值化的感興趣區(qū)域之后,我們就開始使用得到的二值圖像進行車輛的發(fā)現(xiàn),本系統(tǒng)采用了一種基于檢測線的方法進行車輛的發(fā)現(xiàn)。該方法的基本流程如下:
1)通過視頻與真實世界的空間透視關(guān)系,能夠估計出車輛的長寬的大致范圍。在車輛可能進入的垂直方向設(shè)置檢測線,檢測線的寬度大概在估計出的車輛長度的一半。如圖4 所示,車輛可能進入的位就在視頻圖像的下部與上部兩個地方,于是我們就設(shè)置兩條寬度不同的檢測線。
2) 將檢測線縱向切割成寬度為兩個像素的小矩形條。根據(jù)每個小矩形中的感興趣區(qū)域的多少來決定 它是否是一個合格的區(qū)域,計算方法如公式(3)所示:
其中,F(xiàn)(rec)表示參數(shù)rec合格的區(qū)域,WRITE(rec)表示該小矩形內(nèi)感興趣像素點的個數(shù),而SUM(rec)表示該小矩形內(nèi)像素點的總數(shù),P表示一個閾值,在本系統(tǒng)中取P=0.7。
3) 算法從檢測線上左邊第一個小矩形開始判斷,遇到第一個F(rec)的結(jié)果為TRUE 的小矩形,記錄它的位置,然后維續(xù)向右判斷,直到遇到第一個F(rec) 結(jié)果為FALSE 的小矩形時,就結(jié)束這個感興趣區(qū)塊的擴TRUE的充。此時,從記錄的第一個F(rec)的結(jié)果為小矩形到最后一個F(rec)的結(jié)果為TRUE 的小矩形就產(chǎn)生了一塊連續(xù)的“合格”小矩形區(qū)間。
4) 判斷這個區(qū)間的寬度是不是大于預(yù)設(shè)的一個閾值W,如果大于W,那么認(rèn)為從第一個“合格”小矩形到最后一個“合格”小矩形所構(gòu)成的大矩形就是一個候選的新的車輛位置,否則就認(rèn)為它是噪聲。
5) 重復(fù)步驟3-4,直到判斷到檢測線中最后的一個小矩形為止。
6) 對于新產(chǎn)生的候選車輛位置,進行重復(fù)性判斷,如果這個矩形與任何標(biāo)示現(xiàn)存車輛的矩形的重合度小于一個閾值P,那么就認(rèn)為這個候選區(qū)域是一個新發(fā)現(xiàn)的車輛,建立這個車輛的對象,否則,則認(rèn)為它是現(xiàn)有車輛的一部分。其中。P=D(AB) D(A)+D(B).D(AB 表示區(qū)域A與區(qū)域B重合的區(qū)域的大小,而D(A)與D(B)分別表示區(qū)域A與區(qū)域B的面積。
評論