VC调用matlab工具箱函数进行图像处理编程_第1页
VC调用matlab工具箱函数进行图像处理编程_第2页
VC调用matlab工具箱函数进行图像处理编程_第3页
VC调用matlab工具箱函数进行图像处理编程_第4页
VC调用matlab工具箱函数进行图像处理编程_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、VC 调用matlab 工具箱函数进行图像处理编程作者: bugzhao E-MAIL:导言: Matlab 是一款强大的科学计算、仿真、数据可视化软件,其内置有丰富的数学函数和众多实用的工具箱函数都是极为宝贵的资源。VC 则是研发人员编程开发常用的集成IDE 平台之一。笔者进行计算机视觉开发时,往往使用OpenCV 来作为视觉函数库。OpenCV 虽然功能强大,但数据结构较为复杂,且仅看mannual 就要花去开发人员大量时间。Matlab7.0的推出,则为在VC 中调用matlab 函数提供了更便捷的方式。如何在VC 环境中快捷、方便的调用matlab 的工具箱函数呢?在本文中,我将讲的是

2、如何将大家所熟悉的matlab 语句直接用于VC 编程环境。直接给大家做出一个实例,即用VC 写出图像处理编程框架,而调用matlab 工具箱函数进行canny 边缘检测、直方图均衡和给图像加噪声这三个常用的图像处理过程。跟着文中步骤一步步来做,肯定会成功的。先简要介绍一下。Matlab Engine 采用Client/Server的方式,通过ActivcX 通道和Matlab 接口来实现在VC 编程环境中直接调用matlab 中的指令,其中最频繁调用的函数是:engEvalSting 。后面将讲到此函数的使用方法。下面我来用step-by-step 的方式来讲解一下这个过程。大家跟着做,注意

3、每一个细节,肯定就会成功。希望这个例子能把大家带入VC 、Matlab 联合编程之门。首先是环境的设置。环境的设置只需一次,设置好后以后的编程开发则可跳过此步骤。在Matlab7.0环境中,我们先来安装MCR ,MCR 的路径在:C:Matlab7toolboxcompilerdeploywin32MCRInstaller.exe 双击这个文件,如上图所示自动安装好Matlab 组件支持环境。接下来要在VC 中进行设置。这里假设我已经做好了一个图像打开平台(关于这个平台的建立请参考)。我们要设置下面两个路径: 接下来在Project->Settings里面设置一下link 选项: 如上图

4、所示,在Object/libray modules中输入:mclmcr.lib libmat.lib libmex.lib libmx.lib libeng.lib接下来我们就可以编写实际的程序了。怎么样,不是很麻烦吧,matlab7比6的版本设置起来已经简单了不少了:首先来看一下我以前写的这个图像处理平台imagedemo : 该平台也实现图像的打开、显示和存储等基本功能。首先我们在StdAfx.h 的头部加入include 信息:#include "mclmcr.h"#include "matrix.h"#include "mat.h&qu

5、ot;#include "engine.h" 然后将matlab engine开启、关闭触发信息写到构造/析构函数中:CImgDemoView:CImgDemoView(/打开matlab 引擎ep=engOpen(NULL;CImgDemoView:CImgDemoView(/关闭引擎engClose(ep;接下来在ImageDemoView.cpp 中编写菜单响应代码。下面代码以调用matlab7.0中image processing toolbox的canny 边缘检测函数为例讲解一下:/调用matlab 图像处理工具箱的canny 边缘检测void CImgDemo

6、View:Oncalliptoolboxcanny(int i,j;unsigned char *lpSrc;CImgDemoDoc* pDoc = GetDocument(;ASSERT_VALID(pDoc;if(pDoc->m_hDIB = NULLreturn ;LPSTR lpDIB = (LPSTR :GlobalLock(HGLOBAL pDoc->m_hDIB;LPSTR lpDIBBits=:FindDIBBits (lpDIB;/读取图像宽高int cxDIB = (int :DIBWidth(lpDIB; / Size of DIB - xint cyDIB

7、= (int :DIBHeight(lpDIB; / Size of DIB - ylong lLineBytes = WIDTHBYTES(cxDIB * 8; / 计算图像每行的字节数/分配一临时存储空间unsigned char * temp=new unsigned charcxDIB*cyDIB*sizeof(unsigned char;/先将图像读入临时缓冲区temp 以便于后期送入matlab 引擎进行处理/每行for(i = 0; i < cyDIB; i+/ 每列for(j = 0; j < cxDIB; j+/ 指向DIB 第i 行,第j 个象素的指针lpSrc

8、 = (unsigned char*lpDIBBits + lLineBytes * (cyDIB - 1 - i + j;tempj*cyDIB+i=(*lpSrc;mclInitializeApplication(NULL,0;/定义matlab 可以识别的矩阵作为输入和输出mxArray * input=NULL,* output=NULL;/为其分配内存空间input=mxCreateNumericMatrix(cyDIB,cxDIB,mxUINT8_CLASS,mxREAL;output=mxCreateNumericMatrix(cyDIB,cxDIB,mxUINT8_CLASS,

9、mxREAL;/将temp 区数据赋给matlab 可以识别的矩阵形式memcpy(unsigned char *mxGetPr(input,(unsigned char *temp,cxDIB*cyDIB* sizeof(unsigned char;/将输入input 和输出output 与matlab 中变量关联engPutVariable(ep,"input",input;/调用matlab 工具箱函数进行canny 边缘检测/注意要使用im2uint8将二值边缘图像转换为uint8格式engEvalString(ep,"output=edge(input,

10、'canny'output=im2uint8(output;"output=engGetVariable(ep,"output"/提取变量/将边缘检测的结果传回临时缓存区tempmemcpy(unsigned char *temp,(unsigned char *mxGetPr(output,cxDIB*cyDIB* sizeof(unsigned char;/将临时缓冲区temp 数据写入图像/每行for(i = 0; i < cyDIB; i+/ 每列for(j = 0; j < cxDIB; j+/ 指向DIB 第i 行,第j 个

11、象素的指针lpSrc = (unsigned char*lpDIBBits + lLineBytes * (cyDIB - 1 - i + j;(*lpSrc=tempj*cyDIB+i;/释放内存mxDestroyArray(input; input=0;mxDestroyArray(output; output=0;mclTerminateApplication(;/刷新客户区:GlobalUnlock(HGLOBAL pDoc->m_hDIB;Invalidate(TRUE;我想大家通过看上面这段代码的注释就已经对这个过程有了一个基本认识了。我再总结一下该类代码的编写思路:首先获取当前文档以得到图像的指针和宽、高等信息;然后将图像像素数据赋值到一个缓冲区存放,并把此缓冲区内的数据传递给mxArray 格式的内存空间;接下来打开engine ,把mxArray 格式的数据跟engine 工作区中的变量相联合。到此为止,我们就可以利用engEvalString 来调用matlab 的各种函数来进

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论