【问题标题】:Calling MATLAB function "imread" from MEX从 MEX 调用 MATLAB 函数“imread”
【发布时间】:2013-09-02 06:44:09
【问题描述】:

我正在尝试使用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 函数时发生了什么。

【问题讨论】:

    标签: c matlab mex


    【解决方案1】:

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

    在当前版本中,我认为字符串表示为 16 位字符串 (UNICODE) 而不是 ASCII。字符数组的大小必须与不包含终止 NUL 的字符串的长度完全相同(这适用于所有 MATLAB 版本)。

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

    顺便说一句:“string”和“img”属于“mxArray *”类型,而不是“mxChar *”类型。

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

    【讨论】:

      【解决方案2】:

      您需要将输入作为 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 数组并复制它。

      【讨论】:

        【解决方案3】:

        感谢您指出字符串的不同表示。我使用 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 * 也可以。

        【讨论】:

        • mxArray 是 MATLAB 数组的容器。 mxChar 是 2 字节字符类型。他们完全不同!您的代码有效,因为 string 既设置为又用作 mxArray 指针。我希望编译器对此发出警告,但 mex() 在没有错误时会抑制编译警告。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多