这是我的项目,我有一个加载图像的GUI,我需要将这个图像和几个信息传递给我用C ++编码的mexFunction,比如xSize,ySize,窗口大小进行处理。我无法解释matlabs给我的信息,我也不确定如何实际做到这一点。
答案 0 :(得分:1)
当您将任何矩阵传递给MEX函数时,它将以列主要顺序存储为1D数组。因此,使用线性索引按顺序访问它是最快的。
对于图像,如果您愿意,可以将其作为2D矩阵访问,您只需要通过简单的计算将行/列索引映射到线性索引。
考虑这个例子:
#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帮助。它非常详细。