Ich versuche eine mex-Funktion zu schreiben, um eine andere Funktion aufzurufen F. F benutzt die opencv-Bibliothek, also muss ich das mxarray in ein cv :: mat umwandeln. Ich verwende eine verschachtelte for-Schleife, um jeden Pixelwert oder Vektor von Werten den zwei erstellten cv :: mat zuzuweisen. Der Code ist unten veröffentlicht.Programm stürzt ab, wenn ich mxarray in cv :: mat umwandle
Allerdings stürzt das Programm nach dem Ausführen der for-Schleife für eine Weile ab. Ich habe versucht, mit mexPrintf Werte wie A (i, j, 2) auszugeben und die Werte sind korrekt (vorzeichenloses Zeichen). Die Eingaben von Matlab sind Matrizen vom Typ uint8, und das ist der Grund, warum ich Dinge in den cpp-Code in Zeichen ohne Vorzeichen umwandle.
Ich habe keine Ahnung, warum es stürzt. Ich habe auch versucht, den attach-Prozess von Visual Studio zu verwenden, um zu debuggen, aber es scheint nicht zu funktionieren, und jedes Mal, wenn ich den Prozess anschloss und die mex-Funktion in Matlab anrief, bekam ich gerade eine Zugriffsverletzungsnachricht.
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
}
Haben Sie sich die Anrufliste angesehen, um die Codezeile zu erfahren, die den Absturz verursacht hat? –
@ VadaPoché Ich bin nicht in der Lage, Visual Studio Attach-Prozess zu verwenden, um es zu debuggen. Kann ich den Call-Stack noch überprüfen? – user3928010
Haben Sie Informationen zur Fehlersuche (pdb) für diesen anderen Prozess, den Sie debuggen möchten? Wenn ja, können Sie überprüfen, ob der Debugger es finden kann? –