首页 文章

将mxarray转换为cv :: mat时程序崩溃

提问于
浏览
0

我正在尝试编写一个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

}

1 回答

  • 0

    更改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);
    

    适合我 .

相关问题