matlab--mex编译slicmex.c(超像素分割)

来源:互联网 发布:网络语茶叶蛋什么意思 编辑:程序博客网 时间:2024/06/05 00:40

编译时出现的问题:

错误使用 mex

slicmex.c
C:\Users\Administrator\Desktop\(代码)SuperPixelMerge-Multi-Res-Seg(2kx2kPixels)\SLIC_mex\slicmex.c(108)
: warning C4244: “=”: 从“double”转换到“int”,可能丢失数据
......................
: error C2275: “mwSize”: 将此类型用作表达式非法
        d:\program
        files\matlab\r2014a\extern\include\tmwtypes.h(802)
        : 参见“mwSize”的声明
C:\Users\Administrator\Desktop\(代码)SuperPixelMerge-Multi-Res-Seg(2kx2kPixels)\SLIC_mex\slicmex.c(387)
: error C2146: 语法错误: 缺少“;”(在标识符“numdims”的前面)

: error C2065: “numdims”: 未声明的标识符

出现的问题主要为:

1.从double转到int,可能数据丢失。这个问题的原因是数据类型转换格式出错,需要将double类型的数据转换为int型

2.mwSize和numdims,变量声明的问题,在代码中,第387行代码为mwSize numdims=mxGetNumberOfDimensions(prhs[0]) ; 这个地方的mwSize numdims 需要在之前定义再使用。

解决方法:

问题1.

可以强制转换为int型,在语句前添加(int)转义符,例如

xstrips = (int)(0.5+(double)(width)/(double)(STEP));ystrips = (int)(0.5+(double)(height)/(double)(STEP));



或者在声明变量时,使用double类型

double xstrips, ystrips;



问题2.

在变量声明时,添加mwSize numdims,而不是直接调用mwSize numdims=mxGetNumberOfDimensions(prhs[0]) ,部分代码如下:

void mexFunction(int nlhs, mxArray *plhs[],                 int nrhs, const mxArray *prhs[]){    int width;    int height;    int sz;    int i, ii;    int x, y;    int* rin; int* gin; int* bin;    int* klabels;    int* clabels;    double* lvec; double* avec; double* bvec;    int step;    int* seedIndices;    int numseeds;    double* kseedsx;double* kseedsy;    double* kseedsl;double* kseedsa;double* kseedsb;    int k;    const mwSize* dims;//int* dims;    int* outputNumSuperpixels;    int* outlabels;    int finalNumberOfLabels;    unsigned char* imgbytes;    int numelements;    int numSuperpixels = 200;//default value    double compactness = 10;//default value    mwSize numdims;//----在调用之前添加mwSize numdims!!!    if (nrhs < 1) {        mexErrMsgTxt("At least one argument is required.") ;    } else if(nrhs > 3) {        mexErrMsgTxt("Too many input arguments.");    }    if(nlhs!=2) {        mexErrMsgIdAndTxt("SLIC:nlhs","Two outputs required, a labels and the number of labels, i.e superpixels.");    }    //---------------------------    numelements   = mxGetNumberOfElements(prhs[0]) ;    numdims = mxGetNumberOfDimensions(prhs[0]) ;//------在这里只需要使用numdims = mxGetNumberOfDimensions(prhs[0]),而不是mwSize numdims=mxGetNumberOfDimensions(prhs[0]) ;    dims  = mxGetDimensions(prhs[0]) ;    imgbytes  = (unsigned char*)mxGetData(prhs[0]) ;//mxGetData returns a void pointer, so cast it    width = dims[1]; height = dims[0];//Note: first dimension provided is height and second is width    sz = width*height; 




运行结果:


详细代码可参考:http://download.csdn.net/download/qwerasdf_1_2/10141815 

替换掉原来的slicmex.c文件就可以编译成功啦

原创粉丝点击