?? stext.txt
字號:
VC+Matlab實現衛星照片的三維顯示
本文介紹了VC++與Matlab混合編程的一般實現方法,并在此基礎之上實現了對遙感衛星獲取得到的二維大地影像的三維效果顯示。
隨著科技的進步,遙感衛星早已在眾多領域得到廣泛應用,如資源普查、災害預警和土地普查等。由于現有的遙感探測設備只有紅外行掃儀、多光譜CCD相機或 SAR雷達等幾大類,因此從衛星得到的原始圖象只可能是二維圖象,而在某些特殊領域需要根據三維影像才能做出更進一步的信息抽取,這就需要通過后處理的手段根據原始二維遙感影像虛擬出其三維效果。
具體的技術解決途徑有很多,比如在VC++下可以通過直接對OpenGL或 Direct3D進行編程實現,但由于此類應用需要大量的科學計算,使用具有強大的矩陣運算、數據處理和圖形顯示功能的Matlab進行開發比較合適,其輸出結果可視化,編程效率極高,極少的代碼即可實現復雜的運行,然而其邊解釋邊執行,運算效率較低,實現相同功能的代碼跟其他編程平臺相比運行時間相對較長,且不適合作為通用的編程平臺。因此,為系統整體效率考慮,采取具有很高編程效率的通用編程平臺VC++與Matlab混合編程的方式將更有助于發揮 Matlab和VC的各自優勢。
VC++與Matlab幾種常用的集成方法
Matlab與 VC++混合編程的具體方式有多種,根據Matlab是否運行可大致分為兩類:Matlab在后臺運行和可以脫離Matlab環境運行。Matlab 5.0以后版本均自帶C/C++編譯器,可將其程序文件(M文件)轉換為C-MEX或C/C++程序。
第一種方式是Matlab 引擎采用客戶機/服務器的計算方式,通過Windows的ActivcX通道和Matlab接口。在具體的應用中,VC的程序作為前端客戶機,通過調用 Matlab引擎在后臺與Matlab服務器建立連接,實現動態通信。這種方法實現較為簡單,不要求連接整個Matlab,只需要嵌入必要的Matlab 引擎庫,可大大地節省系統資源,但這種Matlab在后臺運行,運行效率低下。
第二種方式是使用Mathtools公司推出的 Matlab集成編譯開發平臺Mideva,它提供了對M文件的解釋執行和開發環境支持。經過簡單設置后Mideva可以將M源文件轉換為C/C++,然后添加到VC++工程中。 也可以先利用Mideva直接生成EXE文件(方法是啟動Mideva,在菜單"File->Compile to exe"中, 選出需要轉換的M文件),然后在VC++中通過shellexec()或winexec()等外部函數完成Shell調用。這種方法簡單方便,但運行時出現一個控制臺窗口,而且由于VC和Matlab之間不能交互,通用性差。
第三種方式是通過Mablat編譯器將其m文件轉換成為 C/C++代碼文件并生成必要的dll庫后再通過VC++編譯器生成可獨立執行的應用程序,這種方式可以直接調用其中的庫函數,生成并發布不必依賴 Matlab的可執行文件。在建立好函數m文件(不能是腳本m文件)后,用mcc命令將其轉換為C++代碼,命令行參數如下(假定m文件為 test.m):
mcc -t -L Cpp test.m
然后繼續生成動態鏈接庫函數:
mcc -t -W lib:test2 -T link:lib test.m
需要注意的是,"lib:"后跟生成的庫文件名不能和原m文件名相同(此處為test2)而且此處只能生成C語言方式的動態鏈接庫。該編譯命令共生成9個文件,其中test.lib和test.dll是可以在C/C++應用程序中調用的動態鏈接庫文件。
最后一種方式是通過Matlab Add-in實現Matlab與VC的混合編程,這是最方便的也是本文下面將要使用的集成方式。在Matlab 6.0以后版本對其編譯器作了較大的改進,其支持更多的數據類型,更強的優化功能,更為重要的是其Matlab Add-in提供了一個Matlab和VC直接集成的途徑。它具有一些新的特征:快速集成M文件到C++工程中,創建獨立的 C/C++應用程序或C MEX DLL;通過M文件創建共享庫或MEX文件;內含Visual Matrix Viewer,調試過程中可以查看矩陣變量的值;直接修改M源文件而不是修改生成的C/C++文件;方便快捷地打包應用程序等。
下面給出Matlab Add-in的具體安裝步驟:
1. 啟動Matlab,運行"mex-setup",按照菜單提示選取MSVC。它將配置MEX使用VC為默認的編譯器(創建C-MEX文件必需),并安裝Matlab Add-in所需文件到VC目錄。
2. 在Matlab環境下運行"mbuild-setup", 按提示選取MSVC。它將配置使用VC為默認的編譯器(創建獨立應用程序必需),并安裝Matlab Add-in所需的Matlab Compiler和C/C++數學庫文件到VC目錄。
3. 在Matlab環境下運行"cd(prefdir)"和"mccsavepath"。它將保存當前Matlab路徑到mccpath文件中,這是因為Matlab Add-in脫離Matlab運行,否則它無從知道Matlab路徑。
4. 啟動VC環境,從菜單"Tools -> Customize"選擇"Add-ins and Macro Files"選項卡,選中"Matlab Add-in", 點擊"Close"。VC工具欄出現Matlab Add-in圖標,完成Matlab Add-in的配置,以后每次啟動VC將自動加載Matlab Add-in。
5. 配置Windows系統。如果是Windows 95/98系統,找到config.sys, 添加一行:shell= c:\ command.com /e:32768 /p;如果是Windows ME則需設置Conagent.exe的屬性Memory選項卡的Initial Environment值為4096。
三維顯示程序的創建
三維顯示處理的核心部分由Matlab實現,首先通過imread ()與imfinfo()函數得到圖象點陣數據及其大小,在meshgrid()創建相應的網格后以圖象灰度值作為高度坐標值,并通過meshc()進行三維網格繪制,最后由surf()完成表面繪制。具體實現代碼如下:
% 讀取圖象數據到矩陣
[A, map] = imread('input.bmp');
% 得到圖象信息
info = imfinfo('input.bmp');
w = info.Width;
h = info.Height;
% 創建與圖象大小相對應的網格
[x,y] = meshgrid(1:w,1:h);
z = x - y + y - x;
i = 1;
j = 1;
% 用圖象灰度值填充高度值
while (i - 1) * w + j <= w * h
z(i,j) = A(i,j);
j = j + 1;
if j > w
j = 1;
i = i + 1;
end
end;
% 繪制三維圖象
meshc(x,y,z);
% 繪制表面
surf(x,y,z,'FaceColor','interp','EdgeColor','none','FaceLighting','phong')
此m文件創建完畢后,啟動VC++,創建一個"Matlab Project Wizard"工程,選擇所生成的應用程序的類型為Windows Console EXE、C++程序、Debug模式、生成Main函數、需要圖形支持。點擊"Finish"后在出現的對話框中將剛創建的M文件添加到工程,這時VC將調用MCC生成一個混合M文件和C++的工程。在"File View"選項卡中可以看到添加的M文件和自動生成的C++文件。編譯運行后,將能夠實現二維圖像的三維顯示。
在主程序中完成對三維顯示程序的調用
由于上述三維顯示程序只是整個系統中的一個部分,因此還需要在主程序中通過CreateProcess()完成對其進程的創建:
char cCommandLine[MAX_PATH];
PROCESS_INFORMATION pi;
STARTUPINFO si = {sizeof(si)};
// 啟動子進程
CString sCommandLine = GetCurPath() + "LandmineShower.exe";
::strcpy(cCommandLine, sCommandLine);
CreateProcess(NULL, cCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, pi);
三維顯示程序是一個控制臺程序。如果需要隱藏其界面,可以在其進程創建完畢之后通過FindWindow()函數找到其窗口句柄并進而通過向ShowWindow()指定該窗口句炳來實現:
Sleep(100);
// 關閉子進程的主線程句柄
CloseHandle(pi.hThread);
// 隱藏控制臺窗口
m_hwnd3DShower = ::FindWindow(NULL, sCommandLine);
if (m_hwnd3DShower != NULL)
::ShowWindow(m_hwnd3DShower, SW_HIDE);
圖一和圖二分別為遙感衛星探測得到的二維原始大地影象和通過本程序實現的其三維效果顯示圖。通過工具欄上的旋轉按鈕可以進行任意視點角度的觀察。
小結:混合編程是綜合使用多種開發工具技術優勢的一種常用手段,本文通過對VC++和Matlab的集成開發,以精練的代碼和較高的運行效率實現了對二維遙感影像的三維效果顯示。通過本文所述Matlab與VC++集成開發方法,讀者可以自行對其他類似程序進行開發。當然,也可以根據實際需要,靈活選用除本文所用方法外的其他三種集成開發方法。本文所述程序在Windows 2000 Professional下由Microsoft Visual C++ 6.0與Mathworks Matlab 6.1編譯、調試通過。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -