如何解释传递给我的c ++ mexFunction的灰度级matlab图像

时间:2011-09-30 00:42:24

标签: image matlab mex

这是我的项目,我有一个加载图像的GUI,我需要将这个图像和几个信息传递给我用C ++编码的mexFunction,比如xSize,ySize,窗口大小进行处理。我无法解释matlabs给我的信息,我也不确定如何实际做到这一点。

3 个答案:

答案 0 :(得分:1)

当您将任何矩阵传递给MEX函数时,它将以列主要顺序存储为1D数组。因此,使用线性索引按顺序访问它是最快的。

对于图像,如果您愿意,可以将其作为2D矩阵访问,您只需要通过简单的计算将行/列索引映射到线性索引。

考虑这个例子:

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

请注意,为了简化示例,我跳过了输入检查。

所有内容都应在文档中进行说明,因此请先阅读users guide,然后在需要时参考API reference

您可以学习MATLAB中包含的一些示例:

>> winopen( fullfile(matlabroot,'extern','examples','mex') )
>> winopen( fullfile(matlabroot,'extern','examples','mx') )

答案 1 :(得分:1)

您是否检查了矩阵数据的类型? 我认为imread返回类型为uint8的大小为m * n * 3的矩阵。 尝试采用上面的示例并将input的定义更改为:

unsigned char *input;

(因为double占用内存的四倍uint8,当您将指针视为指向double的指针时,会出现内存异常。

答案 2 :(得分:0)

查看imread的MATLAB帮助。它非常详细。