【问题标题】:Program crashes when converting mxarray to cv::mat将 mxarray 转换为 cv::mat 时程序崩溃
【发布时间】:2017-07-12 00:00:01
【问题描述】:

我正在尝试编写一个mex 函数来调用另一个函数F。F 使用opencv 库,所以我需要将mxarray 转换为cv::mat。我使用嵌套的 for 循环将每个像素值或值向量分配给两个创建的 cv::mat。代码贴在下面。

但是,程序在运行 for 循环一段时间后崩溃。我尝试使用 mexPrintf 打印出诸如 A(i, j, 2) 之类的值,并且这些值是正确的(无符号字符)。 Matlab 的输入是 uint8 类型的矩阵,这就是我在 cpp 代码中将事物转换为 unsigned char 的原因。

我不知道它为什么会崩溃。我也试过用visual studio的attach进程调试,但是好像不行,而且每次我在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

}

【问题讨论】:

  • 您是否查看过调用堆栈以了解导致崩溃的代码行?
  • @VadaPoché 我无法使用 Visual Studio 的附加过程来调试它。我还能检查调用堆栈吗?
  • 您是否为要调试的其他进程生成了调试信息 (pdb)?如果是这样,您是否能够检查调试器是否能够找到它?
  • @VadaPoché 我明白了。我在编译 mex 文件时忘记打开启用调试。我现在可以使用 Visual Studio 附加流程和调试。
  • @VadaPoché 我运行了两次代码。这两次程序都在这一行中断:image.at<:vec3b>(j, i)[2] = A(i, j, 0);,但在不同的 (i,j)

标签: c++ matlab opencv mex


【解决方案1】:

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

为我工作。

【讨论】:

  • 但我不知道为什么。
猜你喜欢
  • 2012-02-08
  • 2012-06-09
  • 2018-12-26
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 2012-12-29
  • 2014-05-07
  • 2011-06-07
相关资源
最近更新 更多