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