2013-09-02 5 views
1

Я пытаюсь использовать mexCallMATLAB(), чтобы прочитать изображение. Ниже приводится код:Вызов функции MATLAB «imread» из MEX

#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.

ответ

0

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

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

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

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

Вы должны объявить строку и IMG, как

mxArray *string, *img; 

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

0

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

mxChar - это особый тип mxArray, который хранит символы как двухбайтовые символы 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 * также работает.

+0

'mxArray' - это контейнер для массивов MATLAB. 'mxChar' - 2-байтовый символ. Они совершенно разные! Ваш код работает, потому что 'string' установлен и используется как указатель' mxArray'. Я ожидаю, что компилятор предупредил об этом, но mex() подавляет предупреждения компиляции, когда ошибок нет. – user664303

Смежные вопросы