陳之堯
摘要
OpenCV實為一種新型的開放源代碼函數(shù)庫,多用于計算機視覺與數(shù)字圖像處理。本文首先對OpenCV的概念、體系結(jié)構(gòu)進行了簡要分析,以無人機視頻預(yù)處理系統(tǒng)為例,提出了一種新型的預(yù)處理方法,在無人機拍攝視頻中應(yīng)用圖像處理的圖像增益數(shù)、高斯濾波算法、圖像融合操作及雙邊平滑算法等,有效解決了無人機視頻圖像經(jīng)常出現(xiàn)的清晰度低、抖動等問題,此外,還一定程度降低了噪聲、環(huán)境光線對其所造成的影響與干擾。
【關(guān)鍵詞】OpenCV 圖像預(yù)處理 無人機視頻
伴隨科學(xué)技術(shù)尤其是計算機技術(shù)的不斷發(fā)展與更新,數(shù)字圖像技術(shù)在諸如雷達、航空、生物、醫(yī)學(xué)及通信等領(lǐng)域得到了廣泛化應(yīng)用,有力推動著這些領(lǐng)域的發(fā)展與完善;而在計算機、電子及通信等技術(shù)大發(fā)展的時代背景下,帶動了無人機領(lǐng)域的前進與繁榮,但在無人機技術(shù)相多領(lǐng)域擴展應(yīng)用進程中,卻面臨著諸多問題與挑戰(zhàn)。比如無人機的拍攝功能,因無人機在拍攝過程中容易出現(xiàn)抖動情況,受抖動及環(huán)境因素影響,畫面會出現(xiàn)電磁波干擾、噪聲污染及模糊不清等情況與問題。
1 OpenCV概述
1.1 OpenCV的基本特點
OpenCV實際是經(jīng)開發(fā)而得到的C源碼,以Intel處理器指令集為基礎(chǔ)而專門開發(fā)的優(yōu)化代碼,不僅有統(tǒng)一的功能定義與結(jié)構(gòu),而且還有便捷且靈活的借口,超強的矩陣計算能力等,除此之外,諸如MacOS、linux、windows等平臺,其均支持。
(1)對外開放的源代碼,無論是商業(yè)開發(fā),還是個人開發(fā),均免費;
(2)對于大多C或C++編譯器均支持,在各個平臺間,其能夠順利、高質(zhì)量移植,比如C++Builder、VC.NET2005及VC++6.0等;
(3)有較好的跨平臺性,能夠移植,能在諸如MacOS、windows等平臺上運行;
(4)OpenCV全部的算法均以封裝在IPL的動態(tài)數(shù)據(jù)結(jié)構(gòu)為基礎(chǔ),擁有高靈活性,除此之外,超過50%的函數(shù)在進行匯編時,或者是在設(shè)計時,均能以Intel處理器指令集為對象,不斷優(yōu)化代碼;
(5)擁有強大的矩陣計算能力,在圖像處理能力方面也很突出,因而能夠大幅減少開發(fā)時間與精力投入,對于程序開發(fā)質(zhì)量與效率有提升作用;除此之外,還能提高整個程序運行的穩(wěn)定性與可靠性;
(6)接口方便、靈活,包含C/C++函數(shù)達300多個,有著比較高的代碼效率;對于高層API同樣可提供支持;能獨立使用。
1.2 OpenCV的模塊分析
針對OpenCV來講,其主要包含如下模塊
1.2.1 CV模塊
其在整個OpenCV體系架構(gòu)中,乃是最基本的OpenCV函數(shù),包含有諸多內(nèi)容,比如三維重建、模式識別、運動分析與對象跟蹤、圖像處理、相機標定及結(jié)構(gòu)分析等。
1.2.2 CVAUX模塊
其主要包含的函數(shù)有HMM、PCA及部分三維跟蹤等。
1.2.3 CXCORE模塊
此庫包含有全部OpenCV運行狀態(tài)下的部分最核心且最基本的數(shù)據(jù)結(jié)構(gòu)、數(shù)組的基本運算、矩陣等;除此之外,其還囊括有用于出錯處理的部分函數(shù)。
1.2.4 ML模塊
針對此模塊來講,其實為一個機器學(xué)習(xí)庫,包含部分用作回歸、分類與數(shù)據(jù)聚類的函數(shù)與類。
1.2.5 HIGHGUI模塊
對于此圖像界面函數(shù)而言,其主要包含系統(tǒng)調(diào)用函數(shù)、圖像視頻I/O及圖像用戶窗口GUI等。
2 OpenCV的體系結(jié)構(gòu)分析
2.1 數(shù)據(jù)結(jié)構(gòu)分析
OpenCV設(shè)計了許多比較常用、最基本的數(shù)據(jù)類型,如多維柱狀圖混合類CvHistogram、圖像類的Ipl Image,除此之外,還有可變集合類的CvSet、矩陣類的CvMat等。針對此些數(shù)據(jù)類型而言,其中比較常用的便是Ipl Image類,先對其展開深入分析與研究。
Ipl Image類的基本定義為:
typedef struct_Ipl Image
{
intnSize;/*Ipl Image大小*/
intID;/*圖像頭的版本*/
int nChannels;/*通道數(shù),依據(jù)各種顏色的位圖支持1,2,3或4個通道*/
int alpha Channel;/*被OpenCV忽略*/
char color Model;/*被OpenCV忽略*/
char channel Seq;/*同上*/
int data Order;/*0-對顏色通道進行交叉存取,1-處于分開狀態(tài)的顏色通道.只有cvCreate Image能創(chuàng)建交叉存取圖像*/
int align;/*圖像行排列(4or8).OpenCV忽略它,用width Step代替*/
int width;/*圖像寬像素數(shù)*/
int height;/*圖像高像素數(shù)*/
int Border Mode;/*邊際結(jié)束模式,被OpenCV忽略*/
int BorderConst;/*同上*/char*imageData Origin;/*指針指向一個圖像數(shù)據(jù)結(jié)構(gòu)(并非必須排列),主要是為了對圖像內(nèi)存分配做準備*/
}Ipl Image;
2.2 數(shù)據(jù)存取方式
針對OpenCV數(shù)據(jù)來講,其在具體的存取方式方面,主要可劃分為三種,其一為帶指針直接存取,其二是直接存取,其三為間接存取。針對間接存取而言,其有著比較慢的速度,而對于另外兩種來講,則有著比較快的速度,先以帶指針直接存取的方式為對象,對其進行深入剖析。
設(shè)定圖像的基本定義是Ipl Image*img,圖像元素的類型不同,則其主要有如下存取方式:(1)針對那些8位且單通道的圖像,其在具體的像素IN)存取上,主要可進行如下操作:
int step=img->width Step/sizeof(uchar);
uchar*data=(uchar*)img->image Data;
I(i,j)~data[i*step+j];
(2)針對8位且3通道的圖像,其像素I(i,j)存取上,主要可開展如下操作:
int step=img->width Step/sizeof(uchar);
int channels=img->n Channels;
I(i,j)R-data[i*step+j*channels+2];//RED分量
3 OpenCV圖像預(yù)處理技術(shù)在無人機視頻的應(yīng)用
3.1 無人機視頻預(yù)處理系統(tǒng)構(gòu)成
針對無人機視頻預(yù)處理系統(tǒng)而言,其由其部分構(gòu)成,分別為圖像融合操作、圖像平滑處理、幀圖像初始化、無人機視頻獲取、圖像增益處理、圖像濾波處理與程序讀入視頻文件。見圖1所示。
首先,系統(tǒng)會根據(jù)實際情況,對無人機實時采集到的視頻圖像實時初始化處理,其次,針對那些已經(jīng)完成初始化的幀圖像,則采用圖像融合算法、雙邊平滑算法、高斯濾波算法、5領(lǐng)域像素平均算法對圖像實施融合、增益、平滑及濾波等處理,因而所輸出的圖像序列有著比較高的質(zhì)量。
3.2 算法原理
3.2.1 高斯濾波算法
本文選用高斯濾波算法,獲得關(guān)于圖像的濾波功能,函數(shù)聲明:void Gaussian Blur (Input Array srcl,0utput Array dstl,Sizeksize,double sigma X,double sigma Y=0,int borderType=BOR-DER_DEFAULT)
在此聲明中,border Type所表示的是邊緣點插值類型;Ksize代表的是濾波器模板大小;srcl代表的是輸入圖像;sigmaX所代表的是橫向濾波系數(shù),而sigmaY所代表的是豎向濾波系數(shù);srcl表示的是輸入圖像。
所謂高斯濾波,從根本上來講,就是對原圖像的各像素實施濾波,而與之相對應(yīng)的像素濾波之后所得到的值,實為依據(jù)其相鄰像素,乘以1個濾波器模板,即僅需將高斯濾波器模板弄清楚便可。需要指出的是,因本文需要進行處理的是二維幀圖像,為了能夠做到最簡化,設(shè)定sigmaY等于sigmaX,然后所得到的模塊大小ksize,便可用如下公式進行表示:(1),其中,i所表示的是行,而j表示的是列;而針對ksize來講,其高與寬須為奇數(shù),而α與β相加之和需為1。
3.2.2 雙邊平滑算法
對于雙邊濾波而言,其實為一種邊緣平滑且簡單的非迭代方案,公式為:
與值域與域過濾相結(jié)合,便可以被表示為雙邊濾波,如果處于平滑區(qū)域中,那么即便是一個小的且處于鄰域狀態(tài)的像素值,也會是相似的;還需要指出的是,在實現(xiàn)雙邊濾波器過程中,實為一個比較典型且標準化的域濾波,也就是平均掉小、弱相關(guān)像素值見存在不同而引起的噪音。從根本上來講,其不僅可以運用雙邊平滑算法,而且還可根據(jù)實際情況,選擇高斯平滑等算法來進行圖像的平滑處理。
3.2.3 圖像融合操作
現(xiàn)階段,已經(jīng)出現(xiàn)了許多用于圖像融合的算法,而在現(xiàn)實應(yīng)用領(lǐng)域,可依據(jù)實際情況及需要,選擇最實用、恰當?shù)乃惴?。本文通過add Weighted函數(shù)的應(yīng)用,使增益處理與平滑處理后所得到的圖像融合在一起,并借助于給增益處理與平滑處理的圖像賦予的各種權(quán)值,最終獲得各種效果的圖像。
3.3 編程環(huán)境下算法的實現(xiàn)
本文借助于遍歷圖像像素點方式,對由無人機所采集到的實時圖像進行圖像濾波、平滑、融合等操作。為了最大程度提高圖像的處理速度,減少對相關(guān)硬件的過渡依賴與消耗;除此之外,還能儲存實時圖像序列,儲存格式為Mat,運用指針對圖像進行儲存,然后用5領(lǐng)域像素、雙邊平滑以及高斯濾波等算法來處理,算法的步驟為:
(1)構(gòu)建一個Video Capture結(jié)構(gòu),將無人機視頻導(dǎo)入;
(2)用capture.set對開始與結(jié)束幀進行設(shè)置為了能夠使整個視頻播放有著比較好的流暢性,在各幀間,需根據(jù)實際情況,適當?shù)脑黾訒r延,而時延值與幀率之間存在緊密關(guān)聯(lián);另外,針對幀率來講,可借助于函數(shù)capture.get()來得到;
(3)對Open CV高斯濾波函數(shù)GaussianBlur()進行調(diào)用,此外,還調(diào)用融合函數(shù)add Weighted()、雙邊平滑函數(shù)bilateral Filter()等;
(4)對named Window("")進行調(diào)用,構(gòu)建窗口,建立imshow()函數(shù),將幀圖像顯示出來,外加設(shè)置一定延時,便能獲得比較流暢的視頻圖像。
(5)對步驟(1)和(4)進行循環(huán),便能對無人機采集到的視頻信號進行連續(xù)處理。
3.4 實驗結(jié)果及分析
運用Microsoft Visual Studio2010編程軟件進行系統(tǒng)的整體開發(fā),然后與Open CV庫函數(shù)相搭配來實現(xiàn);針對OpenCV庫函數(shù)來講,其能夠為開發(fā)工作提供大量可以直接調(diào)用的函數(shù),因而能夠?qū)⒅匦路庋b函數(shù)花費的時間省去,此外,OpenCV還能提供以video文件、實時攝像機幀提取函數(shù)為基礎(chǔ)對象的圖像處理算法。因而能夠最大程度降低開發(fā)難度,縮短開發(fā)周期。本文經(jīng)過多次試驗得知,當權(quán)重值為0.4或者0.6時,能得到最好的圖像融合效果。
4 結(jié)語
綜上,本文以O(shè)penCV庫函數(shù)為基礎(chǔ),在無人機實時視頻處理當中,應(yīng)用了圖像增益技術(shù)、雙邊平滑算法及高斯濾波算法等,使得原本對視頻畫面造成影響的噪聲得以消除,還實現(xiàn)了像素增益與畫面的平滑,因而最終得到了比較美觀、清晰的視頻圖像。
參考文獻
[1]孫穎,丁慶生,陳靜.一種基于OpenCV的飛機跑道及地平線檢測算法[J].現(xiàn)代電子技術(shù),2009,32(03):190-191.
[2]張永利,徐超.基于OpenCV圖像對準技術(shù)在倒車定位系統(tǒng)中的應(yīng)用[J].信息技術(shù),2014(04):185-187.