matlab--mex編譯slicmex.c(超像素分割)

編譯時出現的問題:

錯誤使用 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文件就可以編譯成功啦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章