三维显示程序的创建
三维显示处理的核心部分由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++(www.cppentry.com),创建一个"Matlab Project Wizard"工程,选择所生成的应用程序的类型为Windows Console EXE、C++(www.cppentry.com)程序、Debug模式、生成Main函数、需要图形支持。点击"Finish"后在出现的对话框中将刚创建的M文件添加到工程,这时VC将调用MCC生成一个混合M文件和C++(www.cppentry.com)的工程。在"File View"选项卡中可以看到添加的M文件和自动生成的C++(www.cppentry.com)文件。 编译运行后,将能够实现二维图像的三维显示。
在主程序中完成对三维显示程序的调用
由于上述三维显示程序只是整个系统中的一个部分,因此还需要在主程序中通过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); |
图一和图二分别为遥感卫星探测得到的二维原始大地影象和通过本程序实现的其三维效果显示图。通过工具栏上的旋转按钮可以进行任意视点角度的观察。
小结
混合编程(www.cppentry.com)是综合使用多种开发工具技术优势的一种常用手段,本文通过对VC++(www.cppentry.com)和Matlab的集成开发,以精练的代码和较高的运行效率实现了对二维遥感影像的三维效果显示。通过本文所述Matlab与VC++(www.cppentry.com)集成开发方法,读者可以自行对其他类似程序进行开发。当然,也可以根据实际需要,灵活选用除本文所用方法外的其他三种集成开发方法。本文所述程序在Windows 2000 Professional下由Microsoft Visual C++(www.cppentry.com) 6.0与Mathworks Matlab 6.1编译、调试通过。 |