OpenCV 2.2에서 3D 추적 용 칼만 필터를 구현하려고합니다. 상태 변수는 좌표 x, y, z 다음에 속도 Vx, Vy 및 Vz가 있으며 x, y 및 z 만 측정 할 수 있습니다.OpenCV Kalman 필터 스택 오버플로
O'reilly의 OpenCV 학습에서 시작한 예제를 사용했지만 문제를 해결하기 위해 예제를 적용 할 때 다소 혼란 스러웠습니다.
이것은 구현 된 것입니다. 코드를 관련 부분 만 줄이려고 노력했으며, 읽기 쉽게하기 위해 많이 주석을 달았습니다.
CvKalman* kalman = cvCreateKalman(6, 3, 0);
// Setting the initial state estimates to [0,0,0,0,0,0].
CvMat* x_k = cvCreateMat(6, 1, CV_32FC1);
cvZero(x_k);
// Setting the a posteriori estimate to zero.
cvZero(kalman->state_post);
// Creating the process noise vector.
CvMat* w_k = cvCreateMat(2, 1, CV_32FC1);
// Creating the measurement vector.
CvMat* z_k = cvCreateMat(6, 1, CV_32FC1);
cvZero(z_k);
// Initializing the state transition matrix.
float F_kalman[] = { 1,0,0,0.05,0,0, 0,1,0,0,0.05,0, 0,0,1,0,0,0.05, 0,0,0,1,0,0, 0,0,0,0,0,1 };
memcpy(kalman->transition_matrix->data.fl, F_kalman, sizeof(F_kalman));
// Initializing the other necessary parameters for the filter.
cvSetIdentity(kalman->measurement_matrix);
cvSetIdentity(kalman->process_noise_cov, cvRealScalar(1e-2));
cvSetIdentity(kalman->measurement_noise_cov, cvRealScalar(1e-1));
cvSetIdentity(kalman->error_cov_post, cvRealScalar(1));
// Updates the measurement vector with my sensor values, wich were in the variable xyz (an array of CvScalar).
cvSetReal1D(z_k,0,xyz[i].val[0]);
cvSetReal1D(z_k,1,xyz[i].val[1]);
cvSetReal1D(z_k,2,xyz[i].val[2]);
cvKalmanPredict(kalman,0);
cvKalmanCorrect(kalman,z_k);
문제는 그 코드를 실행할 때 내가 얻을 수있다 "TEST.EXE에 0x55a3e757에서 처리되지 않은 예외 : 0xC00000FD라는 :. 스택 오버 플로우를" cvKalmanCorrect 라인에서.
아마 예상 한 크기의 행렬 중 하나를 초기화했는데이를 확인하는 방법이 정말 잘못되었습니다.
의견이 있으십니까?
죄송하지만이 대답은 다소 혼란 스럽습니다. 다시 작성해 주시겠습니까? 감사합니다 – JLagana
opencv에 대한 디버그 정보를 포함하면 cvKalmanCorrect에서 오류가 발생한 위치를 확인할 수 있습니다. 이제 우리는 cvKalmanCorrect 어딘가에서 일어난다. – Mailerdaimon