2013-08-23 68 views
0

我正試圖在OpenCV 2.2中實現一個用於3D跟蹤的卡爾曼濾波器。狀態變量是座標x,y,z,後面是速度Vx,Vy和Vz,我只能測量x,y和z。OpenCV卡爾曼濾波器堆棧溢出

我使用了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,1)而不是(6,1),因爲它只是測量的3個標量,實際上它是測量值陣列。