将 mxarray 转换为 cv::mat 时程序崩溃
Program crashes when converting mxarray to cv::mat
我正在尝试编写一个 mex 函数来调用另一个函数 F。F 使用 opencv 库,因此我需要将 mxarray 转换为 cv::mat。我使用嵌套的 for 循环将每个像素值或值向量分配给创建的两个 cv::mat。代码贴在下面。
但是,程序在 运行 for 循环一段时间后崩溃了。我尝试使用 mexPrintf 打印出诸如 A(i, j, 2) 之类的值,并且这些值是正确的(unsigned char)。来自 Matlab 的输入是 uint8 类型的矩阵,这就是我在 cpp 代码中将东西转换为 unsigned char 的原因。
我不知道它为什么会崩溃。我也尝试使用 visual studio 的附加进程进行调试,但它似乎不起作用,每次我附加进程并在 Matlab 中调用 mex 函数时,我都会收到访问冲突消息。
void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])
{
#define A_IN prhs[0]
#define B_IN prhs[1]
#define Y_out plhs[0]
#define A(i,j,k) A[i+j*R+k*(R*C)]
#define B(i,j) B[i+j*R]
#define Y(i,j) Y[i+j*R]
const int *d_pr = mxGetDimensions(A_IN);
int C = d_pr[1];
int dims[2] = { R,C };
Y_out = mxCreateNumericArray(2, dims, mxUINT8_CLASS, mxREAL);
unsigned char *A, *B,*Y;
A = (unsigned char *)mxGetData(A_IN);
B = (unsigned char *)mxGetData(B_IN);
Y = (unsigned char *)mxGetData(Y_out);
cv::Mat image(R, C, CV_8UC3);
cv::Mat trimap(R, C, CV_8UC1);
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
image.at<cv::Vec3b>(j, i)[0] = A(i, j, 2);
image.at<cv::Vec3b>(j, i)[1] = A(i, j, 1);
image.at<cv::Vec3b>(j, i)[2] = A(i, j, 0);
trimap.at<unsigned char>(j,i) = B(i, j);
}
}
//some other stuff
}
更改 for 循环内的 4 行代码:
image.at<cv::Vec3b>(j, i)[0] = A(i, j, 2);
image.at<cv::Vec3b>(j, i)[1] = A(i, j, 1);
image.at<cv::Vec3b>(j, i)[2] = A(i, j, 0);
trimap.at<unsigned char>(j,i) = B(i, j);
进入:
image.row(i).col(j).data[0] = A(i, j, 2);
image.row(i).col(j).data[1] = A(i, j, 1);
image.row(i).col(j).data[2] = A(i, j, 0);
trimap.row(i).col(j).data[0] = B(i, j);
适合我。
我正在尝试编写一个 mex 函数来调用另一个函数 F。F 使用 opencv 库,因此我需要将 mxarray 转换为 cv::mat。我使用嵌套的 for 循环将每个像素值或值向量分配给创建的两个 cv::mat。代码贴在下面。
但是,程序在 运行 for 循环一段时间后崩溃了。我尝试使用 mexPrintf 打印出诸如 A(i, j, 2) 之类的值,并且这些值是正确的(unsigned char)。来自 Matlab 的输入是 uint8 类型的矩阵,这就是我在 cpp 代码中将东西转换为 unsigned char 的原因。
我不知道它为什么会崩溃。我也尝试使用 visual studio 的附加进程进行调试,但它似乎不起作用,每次我附加进程并在 Matlab 中调用 mex 函数时,我都会收到访问冲突消息。
void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])
{
#define A_IN prhs[0]
#define B_IN prhs[1]
#define Y_out plhs[0]
#define A(i,j,k) A[i+j*R+k*(R*C)]
#define B(i,j) B[i+j*R]
#define Y(i,j) Y[i+j*R]
const int *d_pr = mxGetDimensions(A_IN);
int C = d_pr[1];
int dims[2] = { R,C };
Y_out = mxCreateNumericArray(2, dims, mxUINT8_CLASS, mxREAL);
unsigned char *A, *B,*Y;
A = (unsigned char *)mxGetData(A_IN);
B = (unsigned char *)mxGetData(B_IN);
Y = (unsigned char *)mxGetData(Y_out);
cv::Mat image(R, C, CV_8UC3);
cv::Mat trimap(R, C, CV_8UC1);
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
image.at<cv::Vec3b>(j, i)[0] = A(i, j, 2);
image.at<cv::Vec3b>(j, i)[1] = A(i, j, 1);
image.at<cv::Vec3b>(j, i)[2] = A(i, j, 0);
trimap.at<unsigned char>(j,i) = B(i, j);
}
}
//some other stuff
}
更改 for 循环内的 4 行代码:
image.at<cv::Vec3b>(j, i)[0] = A(i, j, 2);
image.at<cv::Vec3b>(j, i)[1] = A(i, j, 1);
image.at<cv::Vec3b>(j, i)[2] = A(i, j, 0);
trimap.at<unsigned char>(j,i) = B(i, j);
进入:
image.row(i).col(j).data[0] = A(i, j, 2);
image.row(i).col(j).data[1] = A(i, j, 1);
image.row(i).col(j).data[2] = A(i, j, 0);
trimap.row(i).col(j).data[0] = B(i, j);
适合我。