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