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