Вызов функции MATLAB "imread" из MEX

Я пытаюсь использовать 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 ответа

Спасибо за указание на различное представление строк. Я использовал mxCreateString() для преобразования строки C в строку MATLAB, и она отлично работает.

mxChar - это особый тип mxArray, который хранит символы в виде 2-байтовых символов Юникода, поэтому мы можем использовать любой из двух.

Ниже приведен код, который работает.

#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 * также работает.

Вам необходимо отправить свои входные данные как 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. Я не знаю, как ваш код скомпилирован. Вы видели какие-либо предупреждения об этом несоответствии типов?

Вам нужно объявить строку и img как

mxArray *string, *img;

Как Мартин предложил использовать mxCreateString вместо того, чтобы вручную создавать массив символов и копировать его.

В Matlab MEX поведение строк отличается в разных версиях.

В текущих версиях я думаю, что строки представлены в виде 16-битных строк (UNICODE) вместо ASCII. Размер массива символов должен быть точно таким же, как длина строки, не содержащей завершающий NUL (это верно для всех версий MATLAB).

Чтобы избежать проблем, вы должны использовать специальную функцию C-string-to-mxArray (я думаю, что она называется mxCreateString или около того).

Кстати, "string" и "img" имеют тип "mxArray *", а не "mxChar *".

Второй аргумент mexCallMATLAB должен быть указателем на "img", а не на "img"!

Другие вопросы по тегам