2013-08-23 2 views
0

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 라인에서.

아마 예상 한 크기의 행렬 중 하나를 초기화했는데이를 확인하는 방법이 정말 잘못되었습니다.

의견이 있으십니까?

답변

0

현재 작업 폴더에 opencv로 컴파일 된 pdbs 및 dll을 사용하여 정확한 문제를 식별하십시오. 시스템에서 사용할 수있는 소스 코드가 있으면 충돌이 발생하는 위치가 표시되어 일부 아이디어를 얻을 수 있습니다.

+0

죄송하지만이 대답은 다소 혼란 스럽습니다. 다시 작성해 주시겠습니까? 감사합니다 – JLagana

+0

opencv에 대한 디버그 정보를 포함하면 cvKalmanCorrect에서 오류가 발생한 위치를 확인할 수 있습니다. 이제 우리는 cvKalmanCorrect 어딘가에서 일어난다. – Mailerdaimon

0

오차가 z_k의 크기에 있다고 생각합니다. 측정의 3 스칼라이기 때문에 (3,1)이 아니라 (6,1)이되어야합니다. 실제로는 측정입니다 정렬.