我最近遇到过这种情况。手头上已经有了一个东东,现在客户要求改进功能;对于改进我已经有好几个想法,但并不确定该用哪一个,因为效果是不好估计,我于是决定先试一个。这个算法需要进行图像分割,我手头有Sobel的代码,但是Sobel算法有其固有的缺点,比如一条直线,一个象素宽,Sobel会分割出两条出来,这不是我想要的。我在MATLAB下试了一下canny算子,效果非常符合我的需求,但要编写一个canny算子是需要时间的,上面催着结果,我还不能确定目前这个算法是否行得通,去编一个canny算子太冒险了。MATLAB下有现成的canny算子(edge函数),要是能在我的C程序里面调用它就好了,我现在不过是想看个结果。
跑西城广场新华书店蹲了2小时,大致知道了该使用MATLAB engine,于是上班的时候上MATHWORKS查(公司的MATLAB没有HTML的帮助文件:( )了一下,明白了,是个不错的东西,搞定。现在将这些经验贴出来,to share。
下面是我程序中用到的一段代码,将图像im用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
#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下面。
速度肯定会有影响的,但对于我来说,这并不重要。我只是验证算法而已。