MATLAB与VC++混合编程(2)——利用MATLAB引擎
2007-06-27 14:04
489 查看
我最近遇到过这种情况。手头上已经有了一个东东,现在客户要求改进功能;对于改进我已经有好几个想法,但并不确定该用哪一个,因为效果是不好估计,我于是决定先试一个。这个算法需要进行图像分割,我手头有Sobel的代码,但是Sobel算法有其固有的缺点,比如一条直线,一个象素宽,Sobel会分割出两条出来,这不是我想要的。我在MATLAB下试了一下canny算子,效果非常符合我的需求,但要编写一个canny算子是需要时间的,上面催着结果,我还不能确定目前这个算法是否行得通,去编一个canny算子太冒险了。MATLAB下有现成的canny算子(edge函数),要是能在我的C程序里面调用它就好了,我现在不过是想看个结果。
跑西城广场新华书店蹲了2小时,大致知道了该使用MATLAB engine,于是上班的时候上MATHWORKS查(公司的MATLAB没有HTML的帮助文件:( )了一下,明白了,是个不错的东西,搞定。现在将这些经验贴出来,to share。
下面是我程序中用到的一段代码,将图像im用canny算子进行分割。
#ifdef MATLAB_CANNY
#include "engine.h"
...
BYTE* im, *eim; //abbr. image, edged image
int wim,him; //abbr. width and height of image
Engine* eg=NULL; // MATLAB engine
mxArray* mxim=NULL,*mxeim; // image and edged image in MATLAB
...
eg = engOpen(NULL);
if ( NULL == eg ) return -1;
mxim = mxCreateNumericMatrix(wim,him,mxUINT8_CLASS,mxREAL);
mxSetName(mxim,"mxim");
memcpy((BYTE*)mxGetData(mxim),im,him*wim*sizeof(BYTE)); // copy image data into MATLAB space
engPutArray(eg,mxim);
engEvalString(eg, "eim = edge(mxim,''canny'');");
mxeim = engGetArray(eg,"eim");
eim = (BYTE*) mxGetData(mxeim);
engClose(eg);
mxDestroyArray(mxim);
#else//!MATLAB_CANNY
engine.h是在/extern/include下面。程序直接在VC下编译就行了,当然头文件路径得设一下,还有LIB的名字和路径也得告诉VC,LIB的名字是libeng.lib,在/extern/lib/win32/microsoft/msvc60下面。
速度肯定会有影响的,但对于我来说,这并不重要。我只是验证算法而已。
跑西城广场新华书店蹲了2小时,大致知道了该使用MATLAB engine,于是上班的时候上MATHWORKS查(公司的MATLAB没有HTML的帮助文件:( )了一下,明白了,是个不错的东西,搞定。现在将这些经验贴出来,to share。
下面是我程序中用到的一段代码,将图像im用canny算子进行分割。
#ifdef MATLAB_CANNY
#include "engine.h"
...
BYTE* im, *eim; //abbr. image, edged image
int wim,him; //abbr. width and height of image
Engine* eg=NULL; // MATLAB engine
mxArray* mxim=NULL,*mxeim; // image and edged image in MATLAB
...
eg = engOpen(NULL);
if ( NULL == eg ) return -1;
mxim = mxCreateNumericMatrix(wim,him,mxUINT8_CLASS,mxREAL);
mxSetName(mxim,"mxim");
memcpy((BYTE*)mxGetData(mxim),im,him*wim*sizeof(BYTE)); // copy image data into MATLAB space
engPutArray(eg,mxim);
engEvalString(eg, "eim = edge(mxim,''canny'');");
mxeim = engGetArray(eg,"eim");
eim = (BYTE*) mxGetData(mxeim);
engClose(eg);
mxDestroyArray(mxim);
#else//!MATLAB_CANNY
engine.h是在/extern/include下面。程序直接在VC下编译就行了,当然头文件路径得设一下,还有LIB的名字和路径也得告诉VC,LIB的名字是libeng.lib,在/extern/lib/win32/microsoft/msvc60下面。
速度肯定会有影响的,但对于我来说,这并不重要。我只是验证算法而已。
相关文章推荐
- 利用Matlab引擎实现VC和Matlab的混合编程
- MATLAB引擎方式实现VC与MATLAB混合编程
- 基于引擎的matlab+vc混合编程的配置
- VC与Matlab混合编程(VC中使用Matlab引擎)
- 基于引擎的matlab+vc混合编程的配置
- VC++与MATLAB混合编程及其应用 通过引擎(Engine),采用客户机服务器的计算模式
- vc调用matlab的m文件混合编程(引擎方式)
- MATLAB引擎方式实现VC与MATLAB混合编程
- 独立于matlab的VC++和matlab的混合编程——利用matlabC++数学函数库
- VC与Matlab混合编程(在VC中调用DLL)
- VC++与Matlab混合编程之引擎操作详解(6)数据类型mxArray的操作
- VC++与MATLAB混合编程(转)
- VC++与Matlab混合编程之引擎操作详解(2)引擎API详解
- matlab混合编程向导(vc,vb,.net...)
- Matlab与VC混合编程
- MATLAB与VC++混合编程(1)——在MATLAB下调试C/C++程序
- VC与Matlab混合编程的快速实现(3-1)
- [The Beginning] [MATLAB VC2010 混合编程] 在WIN7 64系统下的环境配置
- VC++与Matlab混合编程的快速实现
- VC调用matlab dll方式混合编程(c风格--例2)<二>