【问题标题】:how to read image from particular location using MEX?如何使用 MEX 从特定位置读取图像?
【发布时间】:2015-10-10 09:03:46
【问题描述】:

我有一个用 C 编写的函数来读取图像,如下所示:

Image *read_Image(char *filename, int showmessages)

现在我想通过在 MEX 中创建网关函数和包装函数在 MATLAB 中执行此函数。我从来没有写过 Matlab C/Mex 代码。经过 [http://cnx.org/contents/15601bc4-3cda-4964-a7e4-5e061c8aa8b7@2/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/15601bc4-3cda-4964-a7e4-5e061c8aa8b7@2/Writing-C-Functions-in-MATLAB-

【问题讨论】:

  • 为什么不使用imread 而不是自己滚动?
  • 我们有一个 CVIPTools 可以用于图像处理和计算机视觉应用。现在我们正在尝试将 CVIPTool 库移植到 MATLAB 中,该库可用于图像采集、图像处理和计算机视觉应用,而无需相互依赖。

标签: c matlab image-processing mex


【解决方案1】:

我不知道有一个名为 mxGetScaler 的函数。试试mxGetScalar。如果您的意思是mxGetScaler,它一定来自另一个库(您的CVIP 工具?)。您必须通过将 .lib 文件附加到 mex 命令来链接任何预编译的依赖项,或者通过将源文件附加到命令来编译它们的源代码和 mex 文件。

请注意,显示的代码还会出现其他几个编译问题。 const 正确性和指针转换错误比比皆是。

【讨论】:

    猜你喜欢
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2016-02-28
    • 1970-01-01
    • 2016-06-10
    • 2017-02-12
    相关资源
    最近更新 更多