MATLAB与VC++混合编程(2)——利用MATLAB引擎

我最近遇到过这种情况。手头上已经有了一个东东,现在客户要求改进功能;对于改进我已经有好几个想法,但并不确定该用哪一个,因为效果是不好估计,我于是决定先试一个。这个算法需要进行图像分割,我手头有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下面。

速度肯定会有影响的,但对于我来说,这并不重要。我只是验证算法而已。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值