2017-02-22 1 views
0

다른 함수를 호출하는 mex 함수를 작성하려고합니다. F. opencv 라이브러리를 사용하므로 mxarray를 cv :: mat으로 변환해야합니다. 중첩 된 for 루프를 사용하여 각 픽셀 값 또는 벡터 값을 두 개의 cv :: mat에 할당합니다. 코드는 아래에 게시됩니다.mxarray를 cv :: mat으로 변환 할 때 프로그램이 충돌합니다.

그러나 for 루프를 잠시 실행하면 프로그램이 충돌합니다. 나는 A (i, j, 2)와 같은 값을 출력하기 위해 mexPrintf를 사용하려고 시도했고 그 값은 정확했다 (unsigned char). 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 

}

+0

충돌을 일으키는 코드 줄을 알기 위해 호출 스택을 보았습니까? –

+0

@ VadaPoché Visual Studio의 첨부 프로세스를 사용하여 디버깅 할 수 없습니다. 통화 스택을 계속 확인할 수 있습니까? – user3928010

+0

디버깅하려는 다른 프로세스에 대해 디버깅 정보 (pdb)를 생성합니까? 그렇다면 디버거가 디버거를 찾을 수 있는지 확인할 수 있습니까? –

답변

0

내부 코드의 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); 

작품.

+0

하지만 왜 그런지 모르겠습니다. – user3928010

관련 문제