다른 함수를 호출하는 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
}
충돌을 일으키는 코드 줄을 알기 위해 호출 스택을 보았습니까? –
@ VadaPoché Visual Studio의 첨부 프로세스를 사용하여 디버깅 할 수 없습니다. 통화 스택을 계속 확인할 수 있습니까? – user3928010
디버깅하려는 다른 프로세스에 대해 디버깅 정보 (pdb)를 생성합니까? 그렇다면 디버거가 디버거를 찾을 수 있는지 확인할 수 있습니까? –