2015-07-21 75 views
2

我有C語言編寫的一個功能來讀取圖像如下:如何使用MEX從特定位置讀取圖像?

圖片* read_Image(字符*文件名,詮釋showmessages)

現在我想執行的MATLAB此功能通過創建網關功能和包裝功能在MEX。我從來沒有寫過Matlab C/Mex代碼。經過[http://cnx.org/contents/[email protected]/Writing-C-Functions-in-MATLAB-][1]並寫下以下代碼後,我嘗試了我的運氣。我仍然需要做很多事情,我中途停滯不前。任何人都可以引導我?

以下是我寫的代碼:

#include "mex.h" 
#include "CVIPtools.h" 
#include "CVIPimage.h" 
#include "CVIPdef.h" 
#include "CVIPmap.h" 
#include "limits.h" 
#include "threshold.h" 
#include <float.h> 
#include "CVIPmatrix.h" 


//Here I will write a wrapper function. 



/* main gateway function*/ 

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{ 
    mxArray *fnameData; 
    int fnameLength; 
    char *str; 
    //mxArray *smData; 
    int sm; 
    double *outArray; 
    int r,c,bands,n; 
    const mwSize *dim_array; 


    fnameData = prhs[0]; 
    //smData = prhs[1]; 

    fnameLength = mxGetN(fnameData)+1; 
    str = mxCalloc(fnameLength, sizeof(char)); 
    mxGetString(fnameData, str, fnameLength); 
    // sm = (int)(mxGetScaler(smData)); 
    sm = mxGetScaler(prhs[1]); 


    if (nrhs != 2) { 
     mexErrMsgIdAndTxt("MATLAB:mxisfinite:invalidNumInputs", 
       "Two input arguments required.");} 
    if (nlhs != 1) { 
     mexErrMsgIdAndTxt("MATLAB:mxisfinite:invalidNumInputs", 
       "One output argument required.");} 

    n = mxGetNumberOfElements(plhs[0]); 
    dim_array = mxGetDimensions(plhs[0]); 
    r = dim_array[0]; 
    c = dim_array[1]; 
    bands = dim_array[2]; 

    if(bands==3){ 

     plhs[0] = mxCreateNumericArray(3, dim_array, mxDOUBLE_CLASS, mxREAL); 

    } 
    else 
    { plhs[0] = mxCreateDoubleMatrix(r,c,mxREAL); 
     bands=1; 
     } 

    outArray = mxGetData(plhs[0]); 

    // Here I will call wrapper function. 

} 

我只是嘗試使用編譯MEX FILENAME.C這個代碼,我有以下錯誤。

mex image_readCVIP.c 
    Creating library D:\Users\Deepen\AppData\Local\Temp\mex_sedh1H\templib.x and object D:\Users\Deepen\AppData\Local\Temp\mex_sedh1H\templib.exp 
image_readCVIP.obj : error LNK2019: unresolved external symbol mxGetScaler referenced in function mexFunction 
image_readCVIP.mexw64 : fatal error LNK1120: 1 unresolved externals 

    D:\PROGRA~1\MATLAB\R2012A\BIN\MEX.PL: Error: Link of 'image_readCVIP.mexw64' failed 
    [1]: http://cnx.org/contents/[email protected]/Writing-C-Functions-in-MATLAB- 
+0

爲什麼不使用'imread'而不是滾動自己的? – Dima

+0

我們有一個可用於圖像處理和計算機視覺應用的CVIPTools。現在我們試圖在MATLAB中移植CVIPTool庫,它可以用於圖像採集,圖像處理和計算機視覺應用程序,而不會相互依賴。 –

回答

3

我不知道叫做mxGetScaler的函數。試試mxGetScalar。如果你的意思是mxGetScaler,它必須來自另一個庫(你的CVIP工具?)。您必須通過將.lib文件附加到mex命令來鏈接任何預編譯的依賴關係,或者通過將源文件附加到命令來編譯它們的源代碼以及mex文件。

請注意,您將在顯示的代碼中出現其他幾個編譯問題。 const正確性和指針鑄造錯誤比比皆是。