2017-02-22 185 views
0

我試圖寫一個MEX函數調用另一個函數的F.F使用OpenCV庫,所以我需要的mxarray轉換爲CV ::墊。我使用嵌套for循環來將每個像素值或向量的值分配給兩個創建的cv :: mat。該代碼發佈如下。程序崩潰::墊

但是,程序運行for循環一段時間後崩潰。我試圖使用mexPrintf打印出如A(i,j,2)的值,並且值是正確的(無符號字符)。來自Matlab的輸入是uint8類型的矩陣,這就是我在cpp代碼中將東西轉換爲無符號字符的原因。

我不知道爲何導致崩潰。我也試着使用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 

}

+0

你看着調用棧知道的代碼導致崩潰行? –

+0

@VadaPoché我無法使用visual studio的附加過程進行調試。我仍然能夠檢查調用堆棧嗎? – user3928010

+0

您是否有調試信息(pdb)爲您要調試的其他進程生成?如果是這樣,你是否能夠檢查調試器是否能夠找到它? –

回答

0

的4行代碼更改內部的for循環:

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

爲我工作。

+0

但我不知道爲什麼。 – user3928010