李 亞
(西安翔迅科技有限責(zé)任公司,陜西 西安 710068)
某型增雨機(jī)配置全面的催化劑裝載設(shè)備和先進(jìn)的探測設(shè)備,在氣象防災(zāi)減災(zāi)、活動(dòng)保障中發(fā)揮重要作用。增雨機(jī)任務(wù)系統(tǒng)是增雨機(jī)的重要子系統(tǒng),其主要功能包括完成大氣溫度、濕度、云中液態(tài)水含量、冰晶離子濃度、云離子大小及濃度、云宏觀、雷達(dá)氣象等大氣環(huán)境探測[1],并根據(jù)大氣云粒子探測系統(tǒng)和作業(yè)監(jiān)控設(shè)備探測的大氣條件,計(jì)算催化潛力指數(shù)[2],形成催化方案,以便實(shí)施人工增雨、消云和減雨作業(yè)[3-4]。增雨機(jī)任務(wù)系統(tǒng)由顯示控制子系統(tǒng)、氣象探測子系統(tǒng)兩部分組成。顯示控制子系統(tǒng)具備人性化操作顯示界面,可以發(fā)送作業(yè)人員的控制指令,并接收子系統(tǒng)上傳的數(shù)據(jù)和指令,方便作業(yè)人員完成各項(xiàng)任務(wù)。氣象探測子系統(tǒng)采集氣象探頭、機(jī)載大氣、航姿、氣象雷達(dá)與GPS數(shù)據(jù)[5]。大氣環(huán)境探測依靠各種氣象探頭完成,其中云中的水滴以及冰晶粒子的大小、形狀和含量的探測是由3V-CPI探頭實(shí)現(xiàn)的。3V-CPI探頭可對(duì)粒子進(jìn)行高分辨率的影像探測。目前此種設(shè)備技術(shù)仍被國外公司壟斷,技術(shù)資料非常匱乏,為了實(shí)現(xiàn)增雨機(jī)任務(wù)系統(tǒng)對(duì)所有氣象數(shù)據(jù)的獲取,需要自主設(shè)計(jì)針對(duì)此探頭的數(shù)據(jù)處理軟件,實(shí)現(xiàn)對(duì)探頭的采集控制、圖像獲取,并進(jìn)行圖像處理、計(jì)算探測粒子數(shù)據(jù)、存儲(chǔ)數(shù)據(jù)和轉(zhuǎn)發(fā)至顯示控制計(jì)算機(jī)。軟件不需要設(shè)計(jì)顯示界面,但需保證數(shù)據(jù)處理速度和傳輸速度。目前數(shù)字圖像處理技術(shù)已蓬勃發(fā)展多年,隨著計(jì)算機(jī)技術(shù)、物聯(lián)網(wǎng)技術(shù)、集成電路技術(shù)的發(fā)展,圖像處理技術(shù)越來越多地應(yīng)用到了人工智能、生物科技、空間探測、氣象信息等領(lǐng)域[6]。3V-CPI探頭的數(shù)據(jù)采集就需要借助數(shù)字圖像處理技術(shù),通過圖像濾波、背景減除、輪廓提取等操作,獲取粒子的圖像,計(jì)算粒子數(shù)據(jù)。氣象數(shù)據(jù)處理軟件選擇在Visual Studio 2010環(huán)境下開發(fā),方便配置各種工具庫,易用性好。并引入計(jì)算機(jī)視覺庫(OpenCV),完成圖像處理算法,代碼精煉簡約,資源占用少,減少編程復(fù)雜度,圖像處理算法實(shí)現(xiàn)更為容易[7]。氣象數(shù)據(jù)處理軟件是增雨機(jī)數(shù)據(jù)采集的重要一環(huán),是影響項(xiàng)目完成的重要技術(shù)風(fēng)險(xiǎn)點(diǎn)。順利開發(fā)氣象數(shù)據(jù)處理軟件才能保證某型增雨機(jī)的人工增雨需求。
探測信息處理機(jī)位于增雨機(jī)任務(wù)系統(tǒng)的氣象探測子系統(tǒng)內(nèi),包含一個(gè)3V-CPI氣象探頭、高速視頻采集卡、加固計(jì)算機(jī),是氣象探測子系統(tǒng)的重要組成部分。3V-CPI探頭的數(shù)據(jù)量非常大,數(shù)據(jù)提取以及存儲(chǔ)的數(shù)據(jù)量也很大。所以需要單獨(dú)占用一個(gè)加固計(jì)算機(jī)來處理數(shù)據(jù)。增雨機(jī)在飛行過程中,空氣穿過設(shè)備體,探頭可以采集粒子圖像。高速視頻采集卡通過Camera Link視頻接口與氣象探頭相連。視頻采集卡安裝在加固計(jì)算機(jī)上。探測信息處理機(jī)連接示意圖如圖1所示。探測信息處理機(jī)需完成水滴以及冰晶粒子探測,對(duì)數(shù)據(jù)進(jìn)行采集、處理、存儲(chǔ)和轉(zhuǎn)發(fā),數(shù)據(jù)通過機(jī)載千兆以太網(wǎng)交換機(jī)發(fā)送到顯控計(jì)算機(jī)。
圖1 探測信息處理機(jī)連接示意圖
氣象數(shù)據(jù)處理軟件開發(fā)環(huán)境為Visual Studio 2010,采用C++語言以面向?qū)ο蟮脑O(shè)計(jì)方法編寫代碼,代碼耦合性低、擴(kuò)展性強(qiáng)、靈活易維護(hù)。為了保證軟件運(yùn)行的實(shí)時(shí)性與可靠性,氣象數(shù)據(jù)處理軟件采用多線程架構(gòu),設(shè)計(jì)時(shí)確保線程之間沒有資源沖突,不設(shè)計(jì)交叉控制,各個(gè)線程之間通過數(shù)據(jù)隊(duì)列或全局變量緩沖區(qū)進(jìn)行數(shù)據(jù)交互,確保系統(tǒng)運(yùn)行的可靠性。
氣象數(shù)據(jù)處理軟件需與顯控計(jì)算機(jī)通信獲取工作命令;基于Sapera LT++開發(fā)包對(duì)采集卡進(jìn)行控制操作,獲取探頭數(shù)據(jù);利用OpenCV對(duì)探頭數(shù)據(jù)進(jìn)行處理,得到粒子感興趣區(qū)域(Region of Interest,ROI)數(shù)據(jù)信息,利用多媒體處理庫FFmpeg庫對(duì)圖像進(jìn)行編碼,形成視頻流;采用共享內(nèi)存技術(shù)共享目標(biāo)數(shù)據(jù),通過以太網(wǎng)轉(zhuǎn)發(fā)視頻流數(shù)據(jù)。按照軟件需求可以將程序劃分為命令輸入、采集卡操作、數(shù)據(jù)處理、數(shù)據(jù)輸出四大功能模塊,模塊劃分框圖如圖2所示。軟件架構(gòu)清晰明了,便于后期維護(hù)和升級(jí)。軟件執(zhí)行的流程如圖3所示,用戶打開軟件后,軟件首先執(zhí)行采集卡配置、初始化等工作;然后等待用戶設(shè)置模式或背景命令。如果是圖像模式,在設(shè)置背景后單次采集背景圖并保存,之后連續(xù)采集圖像,進(jìn)行處理,獲取粒子ROI信息,存入共享內(nèi)存。如果是視頻模式,將視頻流通過以太網(wǎng)轉(zhuǎn)發(fā)至目標(biāo)地址。軟件只輸出結(jié)果數(shù)據(jù)和視頻數(shù)據(jù),不做界面顯示,但為了敘述清晰,后續(xù)會(huì)用實(shí)驗(yàn)圖例進(jìn)行說明。
圖2 軟件模塊劃分框圖
圖3 軟件流程圖
氣象數(shù)據(jù)處理軟件的開發(fā)難點(diǎn)在于圖像處理,要能準(zhǔn)確穩(wěn)定地識(shí)別出粒子,需要借助多種圖像處理算法,并不斷測試調(diào)優(yōu)。后續(xù)會(huì)在2.3小節(jié)詳細(xì)敘述。
氣象數(shù)據(jù)處理軟件的命令輸入功能的作用是與顯控計(jì)算機(jī)進(jìn)行交互,接收顯控計(jì)算機(jī)軟件發(fā)送的設(shè)置模式命令和設(shè)置背景命令,根據(jù)不同命令進(jìn)行不同功能的操作與處理。
設(shè)置模式命令分為設(shè)置為圖像模式和設(shè)置為視頻模式。圖像模式下需要得到粒子信息,所以軟件對(duì)采集的圖像進(jìn)行處理,計(jì)算出粒子ROI信息;視頻模式直接編碼成視頻流轉(zhuǎn)發(fā)給顯控計(jì)算機(jī)。軟件接收到設(shè)置背景命令后獲取一幀圖像定義為背景,為后續(xù)粒子提取做背景減除操作的參照,且背景后續(xù)也需要輸出給顯控計(jì)算機(jī)。通常情況下,背景設(shè)置命令在圖像模式下有效。以上命令皆通過以太網(wǎng)傳輸。
在進(jìn)行采集卡編程控制之前,需要配置好探頭,保存采集卡的配置文件。探頭可以通過MC Control Tool設(shè)置圖像大小、Tap模式、快門等,保存設(shè)置之后探頭配置成功。
在軟件中,Sapera LT++庫為開發(fā)者提供訪問采集卡的接口類。SapAcquisition類可以獲取采集卡資源; SapBuffer類實(shí)現(xiàn)操作數(shù)據(jù)緩沖區(qū)的功能;SapTransfer類實(shí)現(xiàn)管理通用傳輸過程的功能,即連接SapAcquisition類和SapBuffer類,可注冊回調(diào)函數(shù),在數(shù)據(jù)傳輸事件發(fā)生時(shí)調(diào)用回調(diào)函數(shù),回調(diào)函數(shù)中可獲取圖像數(shù)據(jù);SapTransfer類還提供開始采集、停止采集、單次采集等方法供開發(fā)人員實(shí)現(xiàn)圖像的采集控制;SapView類可以實(shí)現(xiàn)圖像顯示。
氣象數(shù)據(jù)處理軟件通過合理調(diào)用Sapera LT++庫,實(shí)現(xiàn)對(duì)采集卡的控制,獲取氣象圖像,為后續(xù)圖像處理或視頻流轉(zhuǎn)發(fā)奠定基礎(chǔ)。
OpenCV為一個(gè)開放源碼的計(jì)算機(jī)視覺庫,采用C/C++語言編寫,可以運(yùn)行在Linux/Windows/Mac 等操作系統(tǒng)上。OpenCV 還提供了Python、Ruby、MATLAB以及其他語言的接口,可移植性好。它包含的函數(shù)有500多個(gè),覆蓋了計(jì)算機(jī)視覺的許多應(yīng)用領(lǐng)域,獨(dú)立性好。源代碼開源,可以自主開發(fā)、添加新的類庫。OpenCV 使用優(yōu)化了的C 和C++代碼實(shí)現(xiàn),極大地提升了計(jì)算機(jī)的運(yùn)行速度[8-9]。
氣象數(shù)據(jù)處理軟件運(yùn)用OpenCV中的函數(shù)實(shí)現(xiàn)了圖像處理過程中的一些基本算法。在采樣模式設(shè)定為圖像模式下,對(duì)采集到的圖像進(jìn)行濾波、背景減除、形態(tài)學(xué)處理、輪廓提取、圖像截取等操作來獲取粒子ROI[10]。
圖像處理的基本思路如下。
① 圖像濾波,去除噪聲;
② 背景減除,得到目標(biāo)的二值化圖像;
③ 形態(tài)學(xué)處理,改善圖像質(zhì)量;
④ 輪廓提取,截取ROI圖像。
2.3.1 圖像濾波
得到曝光合適的待處理圖像后進(jìn)行圖像濾波。圖像濾波,即在盡量保留圖像細(xì)節(jié)特征的條件下對(duì)目標(biāo)圖像的噪聲進(jìn)行抑制,是圖像預(yù)處理中不可缺少的操作,其處理效果的好壞將直接影響到后續(xù)圖像處理和分析的有效性和可靠性。常用的濾波方式有高斯濾波、中值濾波、均值濾波等。根據(jù)圖像的特點(diǎn),選取高斯濾波對(duì)背景圖像和待處理圖像進(jìn)行處理,去除高斯噪聲。
2.3.2 背景減除
在ROI的提取中,待處理圖像與背景圖像作差是重要步驟。背景減除是通過使用靜態(tài)攝像機(jī)來生成前景掩碼的常用的、廣泛使用的技術(shù),是背景雜波抑制和圖像增強(qiáng)的重要方法[7]。首先計(jì)算兩幅圖像的差的絕對(duì)值,然后對(duì)得到的差值圖通過合適閾值的選取來生成前景掩碼,背景減除算法處理示意圖如圖4所示。
圖4 背景減除算法處理示意圖
兩幅圖像相減很好理解,算法的關(guān)鍵是通過合適閾值的選取來生成前景圖像。由于實(shí)際應(yīng)用中背景的明暗或有變化,如果只給定固定閾值,得到的前景圖像較大可能會(huì)丟失粒子目標(biāo)或者分割出多余錯(cuò)誤粒子目標(biāo)。軟件需要自動(dòng)運(yùn)行,不能人工干預(yù)去更改參數(shù),所以軟件需要采用自適應(yīng)的方法去選取合適的閾值進(jìn)行二值化。選取一個(gè)局部性的閾值,通過規(guī)定一個(gè)指定大小的區(qū)域,比較這個(gè)點(diǎn)與區(qū)域內(nèi)像素點(diǎn)的平均值(或其他算法)的大小來對(duì)這個(gè)點(diǎn)二值化,這樣能保證像素閾值隨著周圍鄰域塊變化。算法采用自適應(yīng)閾值函數(shù)AdaptiveThreshold來實(shí)現(xiàn),經(jīng)反復(fù)實(shí)驗(yàn)驗(yàn)證像素點(diǎn)為中心的鄰域塊大小設(shè)置為65,局部閾值采用鄰域塊的平均算子ADAPTIVE_THRESH_MEAN_C效果較好。通過此方法得到二值化圖像[11-13],其結(jié)果如圖4(d)所示。
2.3.3 形態(tài)學(xué)處理
前景圖像中可能存在一些噪點(diǎn),屬于椒鹽噪聲,采用中值濾波予以濾除。結(jié)合實(shí)驗(yàn)中的實(shí)際情況,當(dāng)ROI面積較大時(shí),受噪聲影響,背景減除后得到的ROI有中空現(xiàn)象,針對(duì)此種情況采用形態(tài)學(xué)處理方法中的閉操作予以改善。
形態(tài)學(xué)基本處理方法為腐蝕和膨脹。腐蝕的算法:用3×3的結(jié)構(gòu)元素,掃描圖像的每一個(gè)像素,并用結(jié)構(gòu)元素與其覆蓋的二值圖像做“與”操作,如果都為1,結(jié)果圖像的該像素為1,否則為0。結(jié)果使二值圖像減小一圈。膨脹的算法:用3×3的結(jié)構(gòu)元素,掃描圖像的每一個(gè)像素,用結(jié)構(gòu)元素與其覆蓋的二值圖像做“與”操作,如果都為0,結(jié)果圖像的該像素為0,否則為1。結(jié)果使二值圖像擴(kuò)大一圈。
開操作和閉操作[14]都是基于膨脹和腐蝕操作組合形成的。先腐蝕再膨脹就是開操作,先膨脹再腐蝕就是閉操作。閉操作可以用來填充前景物體中的小洞,或者前景物體上的小黑點(diǎn)。由此便得到了只含有ROI的二值圖像。對(duì)圖4的二值圖進(jìn)行閉操作后得到非中空的分割圖如圖5所示。
圖5 閉操作后得到的圖
2.3.4 輪廓提取
從物體圖像中得到目標(biāo)物體的外形輪廓稱為輪廓提取[15],輪廓提取是獲取ROI的關(guān)鍵一步,針對(duì)二值圖像,邊緣隱含在正負(fù)區(qū)域的交界處。二值圖像輪廓提取的原理就是掏空內(nèi)部點(diǎn),如果圖像中有一點(diǎn)為黑,且它的8個(gè)鄰域像素點(diǎn)都是黑色時(shí),則判斷該點(diǎn)是內(nèi)部點(diǎn),并將該點(diǎn)刪除[16]。輪廓跟蹤是通過順序查找邊緣點(diǎn)來跟蹤出邊界,其基本原理為:首先在圖像中按照從左到右、從上到下的順序搜索圖像的所有像素點(diǎn);其次,找到目標(biāo)左上方的邊界點(diǎn),它的下、左下、右、右下4個(gè)鄰點(diǎn)中至少有一個(gè)是邊界點(diǎn),記為B;從B開始找起,按右、右下、下、左下、左、左上、上、右上的順序找相鄰點(diǎn)中的邊界點(diǎn)C;如果C是A點(diǎn),則表示邊界查找已經(jīng)循環(huán)一次,查找結(jié)束,否則從C點(diǎn)繼續(xù)找,直到找到A或找不到點(diǎn)為止[17]。
應(yīng)用OpenCV的findContours函數(shù)可以查找圖像輪廓。使用findContours函數(shù),得到邊緣數(shù)組,遍歷邊緣數(shù)組,進(jìn)行多邊形曲線擬合、計(jì)算輪廓的垂直邊界最小矩形,在原圖中截取矩形,即可得到粒子ROI的數(shù)據(jù)。為了做展示,粒子檢測結(jié)果示意圖如圖6所示,黑框圈出的就是粒子圖,根據(jù)黑框的位置大小等信息可以計(jì)算最終的粒子數(shù)據(jù)。軟件不需要做界面顯示,僅需要保存數(shù)據(jù)、輸出數(shù)據(jù)給顯控計(jì)算機(jī)即可。
圖6 粒子檢測結(jié)果示意圖
圖像處理整個(gè)過程中不需要提前設(shè)置參數(shù),算法可對(duì)不同粒子圖像進(jìn)行自適應(yīng)處理,算法速度滿足設(shè)備要求。
氣象數(shù)據(jù)處理軟件的最終目的是輸出數(shù)據(jù)給顯控計(jì)算機(jī)。氣象數(shù)據(jù)處理軟件在不同命令狀態(tài)下都需要進(jìn)行數(shù)據(jù)的持續(xù)輸出。數(shù)據(jù)輸出包括3個(gè)方面的內(nèi)容:背景圖像輸出、粒子ROI信息輸出、視頻流輸出。在圖像模式下,需要輸出背景圖像和粒子ROI信息。兩者通過共享內(nèi)存的方式,將緩存區(qū)數(shù)據(jù)存入用戶指令的內(nèi)存地址,顯控計(jì)算機(jī)將通過共享內(nèi)存名稱獲取背景圖像和粒子ROI信息。粒子ROI信息包括ROI圖像的中心點(diǎn)(x,y)坐標(biāo)、ROI圖像的寬度和高度、此幀圖像中包含的ROI數(shù)量、當(dāng)前ROI的序號(hào)、ROI圖像數(shù)組、時(shí)間信息等。在視頻模式下,需要將獲取的圖像借助FFmpeg庫實(shí)現(xiàn)視頻流編碼,按H.264標(biāo)準(zhǔn)編碼轉(zhuǎn)換為AVPacket類型的數(shù)據(jù),轉(zhuǎn)換好的視頻流直接根據(jù)TCP/IP協(xié)議通過以太網(wǎng)轉(zhuǎn)發(fā)至顯控計(jì)算機(jī)。
2.5.1 采集卡操作編程實(shí)現(xiàn)
氣象數(shù)據(jù)處理軟件中,主要利用Sapera LT++庫提供的接口類實(shí)現(xiàn)采集卡的相關(guān)操作。
SapManager為一個(gè)管理類,通過此類獲取采集卡名稱、數(shù)量,設(shè)備號(hào)等信息。
serverCount = SapManager::GetServerCount();//獲取采集卡數(shù)量
SapManager::GetServerName(serverIndex,acqServerName,
CORSERVER_MAX_STRLEN);//遍歷獲取采集卡名稱
resourceCount=SapManager::GetResourceCount(acqServerName,SapManager::ResourceAcq);//獲取設(shè)備數(shù)量
SapManager::GetResourceName(acqServerName,SapManager::ResourceAcq,resourceIndex,resourceName);//獲取設(shè)備名稱
聲明SapAcquisition采集類、SapBuffer 緩沖區(qū)類、SapTransfer轉(zhuǎn)換類、SapView顯示類的成員變量:
SapAcquisition *m_Acq;
SapBuffer *m_Buffers;
SapTransfer *m_Xfer;
SapView *m_View;
通過SapTransfer對(duì)象實(shí)現(xiàn)圖像采集:
開始采集:
m_Xfer->Grab();
停止采集:
m_Xfer->Freeze();
單次采集:
m_Xfer->Snap();
2.5.2 圖像處理編程實(shí)現(xiàn)
圖像處理工作數(shù)據(jù)量大、速度快,為此采用多線程技術(shù),單獨(dú)占用一個(gè)線程進(jìn)行氣象圖像處理。
探測信息處理設(shè)備軟件在采樣模式設(shè)定為圖像模式下,對(duì)背景圖像和待處理圖像進(jìn)行濾波、背景減除、形態(tài)學(xué)處理、輪廓提取、圖像截取等操作來獲取粒子ROI。
① 對(duì)背景圖像和待處理圖像分別進(jìn)行高斯濾波。
GaussianBlur( BK,BK_dst,Size( i,i ),0,0 );//背景圖像
GaussianBlur( source,dst,Size( i,i ),0,0 );//待處理圖像
② 背景減除。
absdiff(source,BK,absFrameDifferece);//減法函數(shù)
minMaxIdx(absFrameDifferece,min,max);//取減除后圖像的灰度最大值、最小值
adaptiveThreshold(absFrameDifferece,segmentation,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,25,0);//自適應(yīng)閾值算法
③ 輪廓提取。
findContours(segmentation,contours,hierarchy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,Point(0,0));//獲取邊界
vector< vector
contours_poly(contours.size());//輸出多邊形點(diǎn)集
approxPolyDP(Mat(contours[index]),contours_poly[index],3,true);//多邊形曲線擬合
介紹了一種增雨機(jī)中氣象數(shù)據(jù)處理軟件的設(shè)計(jì)和實(shí)現(xiàn)方法?;谔綔y信息機(jī)的組成和結(jié)構(gòu),對(duì)氣象數(shù)據(jù)處理軟件的設(shè)計(jì)和實(shí)現(xiàn)進(jìn)行了詳細(xì)描述。軟件結(jié)構(gòu)清晰,圖像處理部分算法合理,無需設(shè)定參數(shù),自適應(yīng)進(jìn)行,圖像處理速度滿足要求。氣象數(shù)據(jù)處理軟件已成功應(yīng)用于某型增雨機(jī)中。