首页 文章

从MEX调用MATLAB函数“imread”

提问于
浏览
1

我正在尝试使用 mexCallMATLAB() 来读取图像 . 以下是代码:

#include "mex.h"
#include <matrix.h>
#include <string.h>
#include <stdio.h>

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    mxChar *string, *img;

    int dims[2] = {1, 100};
    char *str = "D:\\Acads\\NUS\\CBIS\\TEST\\SampleImages\\set1139R0stack1000Color0St0.tiff.tif"; // Path of the image file

    string = mxCreateCharArray(2, (const int *)dims);
    memcpy(mxGetPr(string), str, sizeof(char) * (strlen(str) + 1));

    mexCallMATLAB(1, img, 1, &string, "imread");
}

代码编译没有错误但在执行时抛出以下错误消息:

??? Error using ==> imread at 315
    File "%^&*$#@! (Some special character string)" does not exist.

当我打印变量 string 的值时,我得到了正确的路径,但我不明白在调用MATLAB函数时发生了什么 .

3 回答

  • 0

    在Matlab MEX中,字符串的行为在不同版本中有所不同 .

    在当前版本中,我认为字符串表示为16位字符串(UNICODE)而不是ASCII . 字符数组的大小必须与不包含终止NUL的字符串的长度完全一样(对于所有MATLAB版本都是如此) .

    为避免出现问题,您应该使用特殊的C-string-to-mxArray函数(我认为它名为mxCreateString) .

    顺便说一下:“string”和“img”的类型为“mxArray *”,而不是“mxChar *”类型 .

    mexCallMATLAB的第二个参数必须是指向“img”的指针,而不是“img”本身!

  • 0

    您需要将输入作为mxArrays发送到mexCallMATLAB . 根据http://www.mathworks.com/help/matlab/apiref/mexcallmatlab.html的文档,语法是

    int mexCallMATLAB(int nlhs, mxArray *plhs[], int nrhs,
      mxArray *prhs[], const char *functionName);
    

    mxChar不是mxArray . 我不知道你的代码是如何编译的 . 您是否看到有关此类型不匹配的警告?

    你需要将string和img声明为

    mxArray *string, *img;
    

    正如Martin建议使用mxCreateString而不是手动创建char数组并复制它 .

  • 0

    感谢您指出字符串的不同表示 . 我使用mxCreateString()将C字符串转换为MATLAB字符串,它工作正常 .

    mxChar是一种特殊类型的mxArray,它将字符存储为2字节的Unicode字符,因此我们可以使用这两种字符中的任意一种 .

    以下是有效的代码 .

    #include "mex.h"
    
    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
    {   
        mxChar *string;
        mxArray *img[1];
    
        string = mxCreateString("D:\\Acads\\NUS\\CBIS\\TEST\\SampleImages\\set1139R0stack1000Color0St0.tiff.tif");
        mexCallMATLAB(1, img, 1, &string, "imread");
    }
    

    请注意,将字符串声明为mxArray *也可以 .

相关问题