您的位置:首页 > 编程语言 > MATLAB

基于VC与Matlab的混合编程实现图像的三维显示

2013-11-29 17:27 218 查看
摘 要 本文介绍了VC++与Matlab混合编程的一般实现方法,并实现对二维影像图的三维效果显示。

关键词 VC++ MATLAB M文件 三维显示

 

引言

通常我们看到的图像是二维状态下的,而在某些特殊领域需要根据三维影像才能做出更进一步的信息抽取,这就需要通过后处理的手段根据原始二维影像虚拟出其三维效果。

MATLAB既是一种直观、高效的计算机语言,同时又是一个科学计算平台。它为数据分析和数据可视化、算法和应用程序开发提供了最核心的数学和高级图形工具。根据它提供的500多个数学和工程函数,工程技术人员和科学工作者可以在它的集成环境中交互或编程以完成各自的计算。MATLA具有强大的矩阵运算、数据处理和图形显示功能,其输出结果可视化,编程效率极高,极少的代码即可实现复杂的运行.然而其边解释边执行,运算效率较低,实现相同功能的代码跟其他编程平台相比运行时间相对较长,且不适合作为通用的编程平台。因此,为系统整体效率考虑,采取具有很高编程效率的通用编程平台VC++与Matlab混合编程的方式,将更有助于发挥Matlab和VC的各自优势。

1 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之间不能交互,通用性差。

第三种方式是通过Mablab编译器将其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. 1 启动Matlab,运行"mex-setup",按照菜单提示选取MSVC。它将配置MEX使用VC为默认的编译器(创建C-MEX文件必需),并安装Matlab Add-in所需文件到VC目录。

1.2. 在Matlab环境下运行"mbuild-setup", 按提示选取MSVC。它将配置使用VC为默认的编译器(创建独立应用程序必需),并安装Matlab Add-in所需的Matlab Compiler和C/C++数学库文件到VC目录。

1.3. 在Matlab环境下运行"cd(prefdir)"和"mccsavepath"。它将保存当前Matlab路径到mccpath文件中,这是因为Matlab Add-in脱离Matlab运行,否则它无从知道Matlab路径。

1.4. 启动VC环境,从菜单"Tools -> Customize"选择"Add-ins and Macro Files"选项卡,选中"Matlab Add-in", 点击"Close"。VC工具栏出现Matlab Add-in图标,完成Matlab Add-in的配置,以后每次启动VC将自动加载Matlab Add-in。

1.5. 配置Windows系统。如果是Windows 95/98系统,找到config.sys, 添加一行:shell= c:\ command.com /e:32768 /p;如果是Windows ME则需设置Conagent.exe的属性Memory选项卡的Initial Environment值为4096。

2 三维显示程序的创建

三维显示处理的核心部分由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++文件。 编译运行后,将能够实现二维图像的三维显示。

3 在主程序中完成对三维显示程序的调用

由于上述三维显示程序只是整个系统中的一个部分,因此还需要在主程序中通过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);

 

4小结

混合编程是综合使用多种开发工具技术优势的一种常用手段,本文通过对VC++和Matlab的集成开发,以精练的代码和较高的运行效率实现了对二维遥感影像的三维效果显示。通过本文所述Matlab与VC++集成开发方法,读者可以自行对其他类似程序进行开发。当然,也可以根据实际需要,灵活选用除本文所用方法外的其他三种集成开发方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: