Как мне интерпретировать изображение Matlab в градациях серого, переданное в мою c ++ mexFunction - PullRequest
1 голос
/ 30 сентября 2011

Вот мой проект, у меня есть графический интерфейс, который загружает изображения, и мне нужно передать это изображение и некоторую информацию в мою mexFunction, кодированную в C ++, например xSize, ySize, размер окна для обработки.У меня проблемы с интерпретацией информации, которую дает мне Matlabs, и я не уверен, как на самом деле это сделать.

Ответы [ 3 ]

1 голос
/ 02 октября 2011

Когда вы передаете какую-либо матрицу в функцию MEX, она сохраняется в виде 1D-массива в главном порядке столбцов.Таким образом, наиболее быстрый последовательный доступ к нему осуществляется с помощью линейных индексов.

В случае изображения вы можете получить к нему доступ в виде двумерной матрицы, если хотите, вам просто нужно сопоставить индексы строк / столбцов с линейными индексами с помощьюпростой расчет.

Рассмотрим этот пример:

matrixExample.c

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
    mwSize r,c, i,j, n;
    double *input;

    /* get size of the matrix */
    r = mxGetM(prhs[0]);
    c = mxGetN(prhs[0]);

    /* get pointer to data */
    input = mxGetPr(prhs[0]);

    /* access matrix using row/column indices */
    for (i=0; i<r; i++) {
        for (j=0; j<c; j++) {
            mexPrintf("%lf ", input[j*r+i]);
        }
        mexPrintf("\n");
    }

    /* access matrix using linear indices (column-major) */
    n = mxGetNumberOfElements(prhs[0]);
    for (i=0; i<n; i++) {
        mexPrintf("%lf\n", input[i]);
    }
}

Скомпилируйте эту функцию MEX:

>> mex -largeArrayDims matrixExample.c

Затем вы можете использоватьэто на примере матрицы:

>> matrixExample( rand(2,3) )

0.646204 0.592287 0.464080 
0.668417 0.740318 0.143579 

0.646204
0.668417
0.592287
0.740318
0.464080
0.143579

Обратите внимание, что я пропустил проверку входных данных только для простоты примера.

Все должно быть объяснено в документации, поэтому начните с чтения руководство пользователя и, при необходимости, ссылки на API .

Также имеется ряд примеров, включенных в MATLAB, которые вы можете изучить:

>> winopen( fullfile(matlabroot,'extern','examples','mex') )
>> winopen( fullfile(matlabroot,'extern','examples','mx') )
1 голос
/ 11 октября 2011

Вы проверяли тип данных вашей матрицы?Я думаю, что imread возвращает матрицу размера m * n * 3 типа uint8.попробуйте взять приведенный выше пример и измените определение input на:

unsigned char *input;

(поскольку double занимает четыре раза больше памяти, чем uint8, вы получаете исключения памяти, когда вы обрабатываете указатель как указательdouble).

0 голосов
/ 30 сентября 2011

Посмотрите на справку MATLAB для imread .Это довольно подробно.

...