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

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下面。

速度肯定会有影响的,但对于我来说,这并不重要。我只是验证算法而已。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: