高浩然,童偉,梁馨月,毛遠(yuǎn)韜,張曉青
(北京信息科技大學(xué)光電測試技術(shù)北京市重點(diǎn)實(shí)驗(yàn)室,北京 100101)
當(dāng)前光纖對接行業(yè)還停留于通過人眼觀測兩根光纖的差值進(jìn)行調(diào)整對接的,不僅費(fèi)時(shí)費(fèi)力,而且準(zhǔn)確度也不夠高。針對于這個(gè)問題,打算設(shè)計(jì)一套自動化的系統(tǒng)可實(shí)時(shí)的觀測兩根光纖的參數(shù),并實(shí)現(xiàn)自動對接工作。
目前市面上光纖熔接機(jī)[11]可直接實(shí)現(xiàn)兩根光纖的對接,光纖熔接機(jī)其功能就是利用精密機(jī)械傳動系統(tǒng)將兩根光纖在空間上準(zhǔn)直,然后通過高溫電弧使石英融化,把兩根光纖對接起來。這種方法對接的準(zhǔn)確性較高,但是考慮到實(shí)際的生產(chǎn)需求,這種方式實(shí)現(xiàn)光纖對接的生產(chǎn)效率較低,不能滿足客戶的需求,因此需要一種自動化的裝置,可實(shí)時(shí)并且快速地實(shí)現(xiàn)光纖對接工作。
考慮到系統(tǒng)可實(shí)時(shí)的監(jiān)控兩根光纖的參數(shù)變化,提出了兩種方案,第一種方案是利用VS2012+OpenCV進(jìn)行圖像處理,并在MFC[9]界面上進(jìn)行顯示處理后的圖像及參數(shù),第二種方案是圖像處理部分選擇在VS+OpenCV進(jìn)行圖像處理,生成DLL文件,在LabVIEW軟件中進(jìn)行圖像的顯示。選擇了第二種方案,因?yàn)榈谝环N方案在VC中實(shí)現(xiàn)實(shí)時(shí)的圖像處理較為困難、復(fù)雜且周期性較長。而第二種方案不存在多線程的問題,大幅降低了系統(tǒng)難度和開發(fā)周期,同時(shí)提高了該系統(tǒng)的實(shí)時(shí)性??蓸O大地減輕開發(fā)人員的精力,使開發(fā)人員專注于自己項(xiàng)目的開發(fā)。
基于LabVIEW編程平臺的光纖對中系統(tǒng)的框架結(jié)構(gòu)如圖1所示,視覺檢測系統(tǒng)一般分為硬件結(jié)構(gòu)和軟件結(jié)構(gòu),此系統(tǒng)的硬件結(jié)構(gòu)包括光源、相機(jī)。軟件結(jié)構(gòu)包括圖像采集、圖像處理、圖像顯示、數(shù)據(jù)顯示。利用LabVIEW中的生產(chǎn)者-消費(fèi)者結(jié)構(gòu),在生產(chǎn)者結(jié)構(gòu)中實(shí)現(xiàn)系統(tǒng)輸入圖像和圖像讀取的數(shù)據(jù)傳輸,在消費(fèi)者結(jié)構(gòu)中,調(diào)用OpenCV圖像處理算子,對輸入圖像進(jìn)行處理,獲得需要的幾何參數(shù)。
圖1 光纖對中系統(tǒng)框架結(jié)構(gòu)圖
在LabVIEW中可采用生產(chǎn)者-消費(fèi)者結(jié)構(gòu)來實(shí)現(xiàn)多線程同時(shí)處理。生產(chǎn)者主要負(fù)責(zé)數(shù)據(jù)的生產(chǎn),即將系統(tǒng)中圖像信息存入隊(duì)列中,消費(fèi)者主要負(fù)責(zé)數(shù)據(jù)處理,在本系統(tǒng)中不斷地從隊(duì)列中讀取圖像信息。這種循環(huán)結(jié)構(gòu)可實(shí)現(xiàn)多個(gè)程序之間能夠?qū)崟r(shí)通過隊(duì)列實(shí)現(xiàn)數(shù)據(jù)傳輸,提高了程序運(yùn)行的效率和設(shè)計(jì)的靈活性。
OpenCV提供的視覺處理算法非常豐富,并且它部分以C語言編寫,加上其開源的特性,處理得當(dāng),不需要添加新的外部支持也可以完整的編譯鏈接生成執(zhí)行程序,所以在本次系統(tǒng)中我們采用OpenCV庫進(jìn)行的圖像處理部分功能的實(shí)現(xiàn)。
在LabVIEW平臺上利用生產(chǎn)者-消費(fèi)者關(guān)系[8],調(diào)用相機(jī)獲得圖像[1],將圖像灰度化,調(diào)用函數(shù)將X和Y的分辨率從圖片中解析出來,將X和Y的分辨率作為參數(shù)輸入OpenCV圖像處理算子(即DLL文件),在DLL文件中實(shí)現(xiàn)對灰度圖像的一系列處理,最后輸出處理后的圖像及需要的幾何參數(shù)。并在LabVIEW的前面板上顯示。
此系統(tǒng)實(shí)現(xiàn)的結(jié)構(gòu)是實(shí)時(shí)地處理圖像并顯示結(jié)果,首先,需要利用LabVIEW采集相機(jī)的數(shù)據(jù),如圖2所示,通過調(diào)用獲取相機(jī)的函數(shù)獲取相機(jī),并將獲取的數(shù)據(jù)存儲在緩沖區(qū)。最后關(guān)閉獲取相機(jī)的函數(shù)。
圖2 相機(jī)獲取圖像流程圖
在獲取圖像后,下一步的工作是進(jìn)行圖像處理,由于在OpenCV中進(jìn)行圖像處理大多基于灰度圖像(單通道、易處理),所以在此之前將圖像進(jìn)行灰度化處理,并通過IMAQGetImageSize函數(shù)將X和Y的分辨率解析出來。將X和Y的分辨率以參數(shù)的形式輸入到動態(tài)鏈接庫中,在動態(tài)鏈接庫中實(shí)現(xiàn)對圖像的處理。這樣就可以充分利用VC++的編程能力以及LabVIEW的圖像化優(yōu)勢和LabVIEW中實(shí)現(xiàn)多線程的便捷性。
在進(jìn)行圖像處理前,要給LabVIEW提供一個(gè)動態(tài)鏈接庫(DLL文件)。本系統(tǒng)采用VS2012編程軟件,首先將OpenCV與VS2012配置好,建立一個(gè)動態(tài)鏈接庫,在此對采集到的圖像進(jìn)行處理,此部分是整個(gè)系統(tǒng)的難點(diǎn)與重點(diǎn)。
圖像處理流程如圖3所示:
圖3 圖像處理流程圖
對圖像進(jìn)行灰度化的處理后,此時(shí)應(yīng)將該DLL文件導(dǎo)入LabVIEW軟件平臺下,在調(diào)用庫函數(shù)時(shí),要進(jìn)行相應(yīng)的參數(shù)配置,該參數(shù)配置應(yīng)符合在VC下定義的變量格式。
(1)圖像去噪
在圖像獲取過程中,圖像會受到外界和本身的干擾,這給后續(xù)的圖像分析處理帶來困難。由于噪聲源眾多,噪聲種類復(fù)雜,所以平滑的方法也很多,平滑在空間域進(jìn)行也可以在頻率域進(jìn)行??臻g域常用的方法有:均值濾波、中值濾波和高斯濾波。如圖5所示,原圖在三種濾波方式下的顯示圖。
圖4 三種濾波結(jié)果對比
采用鄰域平均法的均值濾波器能有效地抑制噪聲,但是在求均值的計(jì)算過程中,圖像的邊緣點(diǎn)也進(jìn)行了均值處理,這樣就是的圖像清晰度降低,畫面變得模糊。中值濾波是一種非線性濾波技術(shù),中值濾波器的優(yōu)點(diǎn)是運(yùn)算簡單而且速度較好,中值濾波可以克服一定條件下均值濾波帶來的圖像細(xì)節(jié)模糊,但是對于一些細(xì)節(jié)多,特別是點(diǎn)、線和尖頂多的圖像不適合采用中值濾波。高斯濾波是一種線性的平滑濾波,適用于消除高斯噪聲。高斯濾波的具體操作是:用一個(gè)模板掃描圖像中的每一個(gè)像素,用模板確定的鄰域內(nèi)的像素的加權(quán)平均灰度值去替代模板中心像素點(diǎn)的值。比較以上的各種濾波效果,對于本次課題來說高斯濾波優(yōu)于其他兩種濾波方式。
(2)邊緣檢測[10]
在邊緣檢測中我們使用Canny算子,Canny算子提供兩個(gè)閾值,這兩個(gè)閾值可在進(jìn)行閾值化操作時(shí),更加方便靈活。當(dāng)閾值2取值為200,閾值1分別為50和20時(shí),如圖5所示。
圖5 Canny算子閾值1分別為50和20
當(dāng)閾值2取值為250,閾值1分別為20和10時(shí),如圖6所示。
圖6 Canny算子閾值1分別為20和10
當(dāng)閾值1分別為20時(shí),閾值2分別為250和200時(shí),如圖7所示。
由以上分析可得,當(dāng)使用Canny算子時(shí),閾值1的作用是濾除掉小于閾值1的像素,閾值2的作用是濾掉閾值2以上的像素。故得到的結(jié)果是介于閾值1和閾值2之間的圖像。選擇合適的閾值對于本次圖像處理具有非常重要的意義。
圖7 Canny算子閾值2分別為250和200
(3)形態(tài)學(xué)操作[6]
在光纖數(shù)字化過程中,不可避免地會給光纖圖像帶來各種偽信息。例如,可能會造成原本連接的條線出現(xiàn)斷裂,利用形態(tài)學(xué)的知識,主要是為了補(bǔ)償數(shù)字化過程中因?yàn)槟撤N原因引起的有用信息的丟失。形態(tài)學(xué)操作的高級形態(tài)主要有開運(yùn)算和閉運(yùn)算,其都是建立在腐蝕和膨脹這兩個(gè)基本操作之上的,開運(yùn)算就是先腐蝕后膨脹的過程,閉運(yùn)算是先膨脹后腐蝕的過程。開運(yùn)算可以用來消除小物體,在纖細(xì)點(diǎn)處分離物體,平滑較大物體的邊界同時(shí)并不明顯改變其面積。閉運(yùn)算可以排除小型空洞。
此文在形態(tài)學(xué)這個(gè)處理中為例實(shí)現(xiàn)將光纖中的孔洞填充的目的,因此采用閉運(yùn)算的操作。
(4)查找矩形
光纖在經(jīng)過閉運(yùn)算后,在圖像中會以細(xì)長條的形式呈現(xiàn),在此文中將光纖提取的辦法是用旋轉(zhuǎn)矩形查找圖像中的矩形區(qū)域,并畫出矩形。
(5)顯示光纖中心線
在畫出光纖的矩形框之后,此時(shí)應(yīng)當(dāng)尋找光纖的中心線,由于此文采用旋轉(zhuǎn)矩形框選矩形,就存在光纖頂點(diǎn)位置的不確定,頂點(diǎn)位置不確定就沒有辦法找到光纖的中心線,在這里采取的方法是利用旋轉(zhuǎn)矩形的角度,從而限定了頂點(diǎn)位置,這樣就可以找到光纖的中心線。
(6)計(jì)算幾何參數(shù)
利用兩根光纖中心線的參數(shù),根據(jù)斜率與角度的關(guān)系,即可計(jì)算出光纖的幾何參數(shù)。
此系統(tǒng)實(shí)現(xiàn)的功能有以下4個(gè)方面:
(1)檢測左側(cè)光纖與水平面的夾角
(2)檢測右側(cè)光纖與水平面的夾角
(3)計(jì)算兩根光纖的角度差
(4)檢測出兩根光纖的水平距離
在進(jìn)行圖像處理時(shí),給定圖像處理函數(shù)提供對應(yīng)的實(shí)參,圖像處理函數(shù)一次只能返回一個(gè)結(jié)果,所以在定義形參時(shí),考慮到這一點(diǎn),在這里定義了兩個(gè)形參變量。
_declspec(dllexport)int PreviousImage1(int rows,int cols,unsigned__int8*data,int flag,int flag1)。
(1)當(dāng)flag=0:代表計(jì)算光纖的角度問題。
將flag1置為0,則result值為左側(cè)光纖與水平面的夾角。
將flag1置為1,則result值為右側(cè)光纖與水平面的夾角。
flag1取其他值時(shí),result值為兩個(gè)光纖的差值。
(2)當(dāng)flag取任意其他值時(shí),代表兩根光纖之間的距離。
當(dāng)分別滿足flag和flag1條件時(shí),就可返回不同值。如圖8為圖像處理結(jié)果及參數(shù)顯示。該圖像表示右側(cè)光纖與水平面的夾角是4度,即光纖順時(shí)針旋轉(zhuǎn)4度即可使光纖位于水平狀態(tài)。
圖8 圖像處理結(jié)果及參數(shù)顯示
圖9為在VS2012中進(jìn)行的圖像處理[9],與在Lab?VIEW中圖像處理相比,VS2012中的數(shù)據(jù)更為準(zhǔn)確,但是界面的友好性不夠,LabVIEW與VS2012相比,右側(cè)光纖角度誤差在一個(gè)像素以內(nèi),此誤差可以接受,而且此次的光纖對中工作要求實(shí)時(shí)檢測,在LabVIEW中更容易實(shí)現(xiàn)此項(xiàng)功能。故選擇了LabVIEW軟件實(shí)現(xiàn)此次的光纖對中工作。
圖9 在VS2012中實(shí)現(xiàn)光纖對中
本文以LabVIEW軟件為平臺,通過調(diào)用VC++與OpenCV的動態(tài)鏈接庫,實(shí)現(xiàn)了圖像的采集、處理以及結(jié)果的顯示,它將機(jī)器視覺技術(shù)應(yīng)用在光纖對中的檢測中,能夠快速準(zhǔn)確地提取需要的幾何參數(shù),對于提高工作效率,實(shí)現(xiàn)自動化光纖對中具有很強(qiáng)的優(yōu)勢。