我想读一些图像来运行C ++ MEX函数来处理这个图像。该图像最初存储为Matlab 3D矩阵,然后转换为2D矩阵,并且图像的每个切片存储为1D矢量。以下是一些示例代码。
首先:MEX功能:
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
unsigned int** ubuff;
size_t col_ubuff = mxGetN(prhs[0]);
size_t row_ubuff = mxGetM(prhs[0]);
ubuff = (unsigned int **)mxCalloc(col_ubuff, row_ubuff);
for(int x = 0; x < col_ubuff; x++) {
ubuff[x] = (unsigned int *) mxCalloc(row_ubuff, sizeof(unsigned int));
}
for (int col=0; col < col_ubuff; col++) {
for (int row=0; row < row_ubuff; row++) {
ubuff[col][row] = mxGetPr(prhs[0])[row+col*row_ubuff];
}
}
unsigned int the_pixel_i_want = ubuff[16][2*32 + 2];
printf ("Debug: %d\n\n", the_pixel_i_want);
return;
}
第二:程序可以编译;但是,运行程序的结果很奇怪;例如,我有一些测试代码和测试图像,所有像素都是188,
%% Test input image as 2D array
clc; clf; clear all; close all;
volImage = 188.*ones(32,32,32);
volImageVec = reshape(volImage, 32*32, 32)';
volImageVec = uint32(volImageVec);
TestInputImage(volImageVec');`
但输出有时为188,有时为0.我的代码中是否存在内存泄漏?非常感谢你的帮助。
编辑:
感谢您的编辑。我找到了其他人的方式。只是把它放在这里以满足其他人的兴趣。
1)行
ubuff = (unsigned int **)mxCalloc(col_ubuff, row_ubuff);
应该是
ubuff = (unsigned int **)mxCalloc(col_ubuff, sizeof(unsigned int *));
2)该行
ubuff[col][row] = mxGetPr(prhs[0])[row+col*row_ubuff];
应该是
ubuff[col][row] = ((unsigned int *)mxGetData(prhs[0]))[row+col*row_ubuff];