引言
計算機視覺技術是通過對常見的圖像、視頻進行操作來提取其中信息的一種技術。OpenCV是Intel公司開發(fā)的一款開源圖像視頻處理庫,使用OpenCV中封裝好的庫函數(shù),可以很方便地對視頻中的圖像進行提取、保存、變換等形態(tài)學操作,這種技術在很大程度上簡化了開發(fā)的進程孔
由于OpenCV只提供相關處理的算法,而程序操作界面略顯不足,所開發(fā)的程序進行參數(shù)設置不方便,因此,在實際應用層面,開發(fā)者通常將OpenCV函數(shù)庫與MFC(MicrosoftFoundationClasses是微軟基礎類庫,可提供Windows編程的框架)相結(jié)合進行開發(fā)叫這種使用MFC構建Win32程序框架,并使用OpenCV構建算法的各取所長方法,對于軟件的實用性和可操作性具有重大意義。
本文總結(jié)出了一套將OpenCV算法應用于Win32對話框程序中的標準方法,該方法可以通過定義C++類創(chuàng)建對象,來輕松實現(xiàn)對公路交通視頻中交通參數(shù)的提取。
1視頻車輛檢測器的基本功能
本程序以MFC+OpenCV的方式進行開發(fā),并以實用為準則,通過可視化的界面和按鈕的方式來實現(xiàn)原始視頻的播放,視頻信息分析,自定義觀測點和車流量計數(shù)周期,交通參數(shù)的測量,統(tǒng)計結(jié)果的存儲和重現(xiàn)等功能。其軟件各個功能的關系如圖1所示。
圖1交通視頻檢測系統(tǒng)功能架構圖
2視頻車輛檢測器的技術實現(xiàn)
要實現(xiàn)上述系統(tǒng),主要有兩方面問題:一是如何構建視頻對象,并通過操作視頻對象來對視頻信息進行提取;二是如何對視頻進行操作來實現(xiàn)上述的各個功能。
2.1創(chuàng)建視頻對象
使用創(chuàng)建對象的方式操作視頻時,首先要定義視頻的類。在視頻處理中,通常先提取出一幀一幀的圖像,然后對所提取的圖像進行處理,再將其保存或者播放至應用程序的控件中。跟據(jù)此原理,可定義一個視頻的類,類中包含上述過程所涉及的屬性和操作方法,其代碼及注釋如下(代碼中視頻類的名稱為CVideo):
classCVideo{
public:
CVideo();//構造函數(shù)
virtual?CVideo();//析構函數(shù)
//以下為數(shù)據(jù)成員
CvCapture*pCapture;
//OpenCV用來讀取視頻的結(jié)構體,存儲待讀取的視頻
Ipllmage*pFrame;
//OpenCV用來存儲圖像的結(jié)構體,存儲當前視頻幀的圖像
Ipllmage*cFrame;//存儲當前幀處理后的圖像
HDChDC1;
//定義設備上下文的句柄,用來播放原始視頻(可選)
CRectrect1;
//定義一個矩形區(qū)域,用來設定原始視頻的ROI區(qū)域
HDChDC2;
//定義設備上下文的句柄,用來播放處理后的視頻
CRectrect2;
//定義一個矩形區(qū)域,用來設定處理后視頻的ROI區(qū)域CStringm_file;//字符串,存儲視頻的路徑和名稱
intm_fps;
//存儲視頻中每秒的幀數(shù),便于進行播放速度的控制
/*以下為成員函數(shù)(限于篇幅,本文未提供成員函數(shù)的所有代碼,讀者可以根據(jù)注釋參考OpenCV文檔自行編寫)*/
voidPlay(intpos);
//播放pos位置的幀,將此幀的圖像放入pframe中,將pframe顯示在hDC1中
voidConvertedplay();
//直接將當前幀處理后的圖像cframe顯示在hDC2中
voidClosefile();
//關閉文件,釋放當前視頻所占的內(nèi)存
boolOpenfile(CStringfile);
/*根據(jù)儲存在數(shù)據(jù)成員file中的路徑打開視頻文件,同時獲取視頻的幀總數(shù)和fps,將其存儲在該類的數(shù)據(jù)成員中*/};
定義好視頻的類之后,便可以通過此類所定義的對象中的各個數(shù)據(jù)和方法對視頻進行常見的操作。
2.2視頻對象的處理
在可視化的界面中通??赏ㄟ^按鈕觸發(fā)事件。假設現(xiàn)在定義了一個myvide。的對象,那么,就可以用以下方法按下相應按鈕來執(zhí)行所需功能。
打開視頻。將對話框中播放原始視頻的設備的ID和播放處理后的視頻設備ID分別讀入myvideo相應的成員中;通過MFC中的CFileDialog類讀取文件,將文件的路徑存儲在myvideo.m_file中,調(diào)用myviedo.Openfile()方法打開視頻。初始化當前播放位置,并初始化對話框。此時,該視頻將處于待播放和待轉(zhuǎn)換的狀態(tài)。
播放和分析視頻。播放和分析的過程可以通過定時器來實現(xiàn)。當點擊播放后,設置并啟動定時器。定時器每隔一定時間中斷一次,其中斷頻率通過視頻對象中的myvideo.m_fps調(diào)節(jié)。定時器在一個中斷中,首先使用myvideo.play()函數(shù)將當前幀推送至原始視頻播放設備中播放,并將當前幀(即myvideo.pframe)放入自己定義的圖像分析處理函數(shù)中進行處理,同時將處理結(jié)果放至myvideo.cframe中,然后使用myvideo.Convertedplay()函數(shù)將處理后的幀推送到處理后的視頻播放設備中播放,最后幀位置加1。至此,一個中斷執(zhí)行完畢。其流程圖如圖2所示。
圖2—個定時器中斷中播放和處理視頻流程圖
停止播放。當點擊停止播放按鈕時,調(diào)用myvideo.Closefile()函數(shù)關閉文件,釋放內(nèi)存。同時還要銷毀定時器,清理相關中間變量。
定義觀測線和計數(shù)周期。為了實現(xiàn)車輛數(shù)量的測量,必須首先定義車輛的觀測線。觀測線的設定可用在背景圖像上點擊的方式來實現(xiàn)。記錄點擊下的觀測線兩端的坐標,即可確定觀測線的位置,當有車輛越過觀測線時,對車輛數(shù)加1。每一個計數(shù)周期過后,輸出本周期內(nèi)車流量的檢測結(jié)果。
檢測結(jié)果的顯示。檢測的車流量統(tǒng)計結(jié)果可以通過VC++中的一個list控件呈現(xiàn)出來[71。每隔所設定的計數(shù)周期時間,則將本時間段檢測的結(jié)果條目加入list控件之中,以通過表格的方式將結(jié)果展現(xiàn)出來。
檢測結(jié)果的導出。通過按鍵操作程序可以將車輛檢測結(jié)果導出為txt格式的文本文件或者excel表格保存,以方便統(tǒng)計
3視頻處理算法
在檢測系統(tǒng)中必須要設計良好的識別算法來提取交通信息,以下將對本系統(tǒng)所使用的視頻處理算法進行簡要介紹。當提取出一幀原始圖像之后,首先使用高斯背景建模,得到背景圖像[8],再用當前圖像減去背景圖像并進行如圖3所示的變換,再提取出運動車輛的二值圖像,只要識別出車輛的輪廓就可以實現(xiàn)對車輛的跟蹤,最后將跟蹤結(jié)果放入處理后的圖像中[9],這一系列的處理可放在定時器中斷的圖像處理函數(shù)中。在此處理過程中,每一步的處理方法和參數(shù)都必須經(jīng)過反復的試驗和測試,才能達到最好的效果。其算法流程如圖3所示。
圖3視頻圖像處理算法流程圖
4實驗結(jié)果
此程序通過構建C++的視頻類并定義視頻對象,可完成交通視頻的處理工作。同時,利用此框架,可以快速搭建交通視頻處理的Win32應用程序。在此框架上進行合理的擴展,可以勝任當前大部分交通視頻的參數(shù)提取工作。圖4所示是基于MFC+OpenCV框架的交通流量檢測系統(tǒng)軟件界面圖。
圖4基于MFC+OpenCV框架的交通流量檢測系統(tǒng)
圖4中,左上角的播放控件播放原始視頻,右上角用來播放處理后的視頻,下方為輸出結(jié)果的控件。原始視頻和處理后的視頻播放同步進行,當車輛接近所設定的計數(shù)線時,程序使用矩形框?qū)⑵淙Τ?;越過計數(shù)線后,計數(shù)器加1并將數(shù)字在旁邊顯示出來。
5結(jié)語
本文介紹了一種基于MFC和OpenCV的交通視頻處理程序。實驗結(jié)果表明,此設計方法具有較高的穩(wěn)定性,可以達到預期的效果。但是,本系統(tǒng)在架構和算法方面,仍然具有需要更進一步完善的地方,具體如下:
(1)當視頻上有其他因素影響時(如車輛陰影、攝像機微小抖動等),由于軟件中并沒有加入相關消除的算法,檢測結(jié)果會受到影響,因此,在進一步處理中,應當加入去陰影、消抖等算法。
(2)公路車輛擁堵時,不能很好識別出背景,干擾較大。
(3)在夜晚時,由于光照、車燈等條件的影響,檢測算法不能對車輛進行很好識別。在進一步改進中,應該加入相關的處理算法,也可以通過檢測車燈來檢測車輛數(shù)。
(4)車輛重疊時,有可能將兩輛車識別成為一輛。
(5)識別準確率有待提高,計數(shù)方法也有待改進。
20210917_61443242eb7b4__基于0penCV的交通視頻感知處理程序框架