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