基于C++語言與OpenCV的分布式孔徑成像系統設計
引 言
基于數字全息探測的分布式孔徑綜合成像技術是一種先 進的主動成像技術 [1],能夠在低照度、復雜背景條件下獲取 遠距離景物的高分辨率三維圖像 [2,3],具有模塊化、可靠性 高等優(yōu)點。該成像體制采用多個子孔徑對目標進行全息探測, 然后將各子孔徑上的目標光復振幅根據其空間位置綜合起來, 從而獲得較大的數值孔徑 [4,5]。
在分布式孔徑各孔徑間記錄時會因為 CCD 記錄的位置、 角度、焦點等不同造成子孔徑間全息圖間存在位移、縮放、旋 轉等誤差。根據參考文獻 [6] 知,全息圖間放大率誤差等于 各自重構出的物體圖像間尺度誤差的倒數。而重構圖像間的 旋轉、尺度誤差可通過圖像配準的方式得到 [6]。重構圖像間 的誤差可以利用圖像處理技術來標定。SURF[7](Speeded Up Robust Features,SURF)算法是一種基于特征點匹配的圖像 拼接算法。可以處理兩幅圖像間的位移、縮放、旋轉等變化 情況下的特征匹配問題,具有匹配性能穩(wěn)定、速度快等優(yōu)點 [8]。
由于國內大多數分布式孔徑數字全息系統還停留在實驗 室階段,尚未有成型的產品。而當前的軟件產品源代碼保密性 高,調用的函數庫較多,消耗了大量系統資源,且設備驅動繁瑣, 導致在實際應用中結合本系統特點進行二次開發(fā)和應用的難 度較大,限制環(huán)節(jié)較多。所以,自主開發(fā)具有校裝配誤差的 數字全息系統十分必要。C++ 語言具有高效、支持繼承和重 用等特點 [9],所以本系統可通過 MFC(Microsoft Foundation Classes,MFC)與 C++ 編程進行人機界面的展示。
1 分布式孔徑數字全息
分布式孔徑綜合成像系統示意圖如圖 1 所示。激光器發(fā) 射出的相干光束被分為兩束,一束光作為物光射向目標物體, 再由物體反射回光電探測器 ;另一束光作為參考光再次分束 直接照向各子孔徑光電探測器。子孔徑內的光電探測器分別 記錄參考光與物光的干涉信號 [10]。在數字信號處理器中,首 先利用傅立葉變換等方法從干涉信號中分別復原出子孔徑探測 器上的目標,返回光復振幅,然后利用菲涅耳衍射公式計算出 各子孔徑入瞳面上的目標光復振幅 Ui(x,y),最后按照子孔徑 空間位置對 Ui(x,y)進行綜合,并通過菲涅耳衍射公式計算 出目標平面上的光復振幅。
在實際系統中,由于裝配誤差會影響孔徑綜合的效果, 所以本系統對孔徑綜合算法進行了誤差校正,程序流程如圖 2 所示。
在重建像中選取一幅作為參考圖像,分別與其他重建像 進行 SURF 算法縮放、位移誤差計算。目標光復振幅旋轉誤差對應重建像相應的旋轉,目標光復振幅縮放誤差對應重建 像縮放誤差的倒數。對目標光復振幅矩陣做相應旋轉、縮放 的坐標變換進行校正。最后,將各子孔徑校正后的目標光復 振幅進行疊加、重建,即得到高分辨率的三孔徑成像。
2 分布式孔徑數字全息處理系統
2.1 分布式孔徑系統數據采集系統
建立圖 3 所示的模擬分布式孔徑系統數據采集系統。激 光器的出射光束經過準直和擴束后由分束鏡分為兩路,一路照 向目標光作為物光,另外一路作為本地參考光。CCD 記錄目 標散射光和參考光形成的離軸全息圖。激光器波長為 635 nm, CCD 像素數為 1 300×1 024,每個像素大小為 4.65 μm,目標 與 CCD 的距離約為 1.03 m,目標是一枚直徑為 0.25 m 的金屬 幣。通過多次數據采集模擬多個孔徑,并人為地將 CCD 分別 旋轉至-15°、0°、+15°來模擬 3 個孔徑的裝配誤差,如圖 4 所示。
2.2 基于 C++ 語言與 OpenCV 的軟件設計
C++不僅擁有計算機高效運行的實用性特征,同時還能 提高大規(guī)模程序的編程質量與程序設計語言的問題描述能力。 OpenCV 是一個集成好的機器視覺函數庫,由 C++ 語言編寫, 其主要接口也采用 C++ 語言編寫。因此,三孔徑數字全息系 統軟件由 C++ 語言編寫,并利用 OpenCV 函數庫進行 SURF 算法編程,對各孔徑間縮放、旋轉誤差進行校正。軟件主要 包括數據重建、誤差配準、目標光復振幅校正、孔徑綜合等 模塊。
(1)數據重建模塊是對各目標光復振幅根據式(1)進行 的圖像重建 ;
(2)誤差配準模塊通過 SURF 算法對兩幅重建圖像進行 誤差配準 ;
(3)目標光復振幅校正模塊用配準得到的誤差對目標光 復振幅進行誤差校正;
(4)孔徑綜合模塊是對各孔徑校正后的目標光復振幅進 行疊加,并重建。
其中,用于誤差配準的 SURF 算法和目標光重建模塊的坐標 變換利用 OpenCV 函數庫進行。
2.3 基于 MFC 平臺的人機界面搭建
MFC 是微軟基礎類庫的簡稱,是微軟公司實現的一個 C++ 類庫,封裝了大部分 Windows API 函數。VC++ 是微軟 公司開發(fā)的 C/C++ 集成開發(fā)環(huán)境,靈活性較大。所以本系統 采用圖 5 所示的基于 MFC 的人機界面。
圖 5 中,左側三個 rebulid 按鈕分別調用數據重建模塊 來對各子孔徑進行圖像重建,并顯示在按鈕上的圖像控件上。 中間兩個按鈕用來調用誤差配準模塊,以中間再現像為標準圖 像,分別對上側再現像和下側再現像進行 SURF 算法圖像校正, 并將校正后的圖像顯示在按鈕上的圖像控件中,分別將角度 誤差、橫向縮放誤差、縱向縮放誤差顯示在按鈕下方的 edit 控件中。最右側按鈕則通過目標光伏振幅模塊將各孔徑目標光 復振幅進行校正,之后利用孔徑綜合模塊進行孔徑綜合并再 現綜合成像,將成像結果顯示在按鈕上的圖像控件上。
3 結 語
文中自主設計了基于 C++ 語言的分布式孔徑數字成像系 統,利用 OpenCV 函數庫對各孔徑間的誤差進行配準并矯正, 同時還編寫了基于 MFC 的人機界面。運行結果說明,本系統 可以很好地矯正孔徑間的誤差,提高綜合成像質量,并進行直 觀展示。