• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
VC+Matlab实现卫星照片三维显示
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
VC+Matlab实现卫星照片三维显示
软件发布 VC+Matlab实现卫星照片三维显示
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 文章首页 >> 编程技术 >> VC教程 >> VC+Matlab实现卫星照片三维显示

VC+Matlab实现卫星照片三维显示

添加时间: 2006-2-11 0:32:23  作者: VC教程  阅读次数:662   来源: http://www.d9soft.com

       

  本文介绍了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编译、调试通过。

 

上下文章:

 

上一篇文章: VC实现录音,放音,保存,打开 下一篇文章: VC内嵌资源实现Flash动画播放

相关文章:

  • 飞速在线看视频 傲盾加速帮你实现速度感受
  • PS教程:看看如何用Photoshop把照片演变成水墨画
  • 教你动用Ps历史画笔美化一个青春美丽动人的MM照片
  • 艾瑞数据显示:暴风影音市场优势明显
  • 用端口碰撞技术实现服务器远程管理

相关软件:

  • Close Monitor(立即关闭显示器) 1.72
  • 三维数据成像3D Surfer 2.0
  • 多功能显示控件(LedShow.ocx) V2.0
  • STTV-视通卫星网络电视 2005 Build 1026 豪华版
  • 易事通标准证件照片处理工具 2.0
  • 数码照片伴侣 V1.01

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

编程技术分类导航

  • ASP & ASP.NET教程
  • PHP教程
  • JSP教程
  • C/C++教程
  • VB & VB.NET教程
  • VC教程
  • Delphi教程
  • BCB教程
  • VFP教程
  • PB教程
  • JAVA教程
  • XML教程
  • C#教程
  • CGI教程

本类经典文章推荐

  • VC++之Button控件
  • VC++之Static Box控件
  • VC++之Edit Box控件
  • VC++之Static Box控件
  • VC++之Edit Box控件
  • VC++之Scroll Bar
  • VC++之Scroll Bar
  • VC++之List Box/Check List Box控...
  • VC++ Combo Box/Combo Box Ex控件
  • VC++ List Ctrl控件

VC教程阅读排行

  • VC++之List Box/Check List Box控...
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • VC++之Button控件
  • VC++之Tab Ctrl控件
  • VC++之Edit Box控件
  • VC++之Edit Box控件
  • VC遍历整个目录树查找文件
  • VC++之Scroll Bar
  • 深入编程:控制面板知多少?

编程技术阅读总排行

  • VB入门教程之一
  • Java连接数据库实例
  • 第二章 PowerBuilder 入门之创建新...
  • VC++之List Box/Check List Box控...
  • 第一章 什么是PowerBuilder
  • VC++ List Ctrl控件
  • VC++ Combo Box/Combo Box Ex控件
  • 学C++不得不看的一篇文章
  • VB入门教程之二
  • VC++之Button控件

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有