卡尔曼滤波器在视频稳定中的平滑点特征轨迹

时间:2014-03-27 15:31:19

标签: c++ opencv kalman-filter opencv-stitching image-stabilization

现在,我正在研究视频稳定主题。 我选择了基于Kanade-Lucas-Tomasi(KLT)跟踪器作为点特征跟踪器进行跟踪的好点特征(PF)。在从第一图像提取N PF并跟踪下一图像中的PF之后,通过将跟踪的N PF连接到先前的PFT来更新点特征轨迹(PFT)。继续,

现在我有了一套PFT。我想平滑这组PFT以通过卡尔曼滤波器创建平滑点特征轨迹(SPFT)。但这个SPFT似乎就像PFT一样。 我不知道如何调整卡尔曼滤波器参数。请帮我看看。 提前谢谢。

//Declare Kalman Filter
KalmanFilter KF (4,2,0);
Mat_<float> state (4,1); 
Mat_<float> measurement (2,1);

void init_kalman(double x, double y)
{

KF.statePre.at<float>(0) = x;
KF.statePre.at<float>(1) = y;
KF.statePre.at<float>(2) = 0;
KF.statePre.at<float>(3) = 0;


KF.transitionMatrix = *(Mat_<float>(4,4) << 1,0,1,0,    0,1,0,1,     0,0,1,0,   0,0,0,1);
KF.processNoiseCov = *(Mat_<float>(4,4) << 0.2,0,0.2,0,  0,0.2,0,0.2,  0,0,0.3,0,  0,0,0,0.3);
setIdentity(KF.measurementMatrix);
setIdentity(KF.processNoiseCov,Scalar::all(1e-4));
setIdentity(KF.measurementNoiseCov,Scalar::all(1e-1));
setIdentity(KF.errorCovPost, Scalar::all(.1));  
 }


 Point2f kalman_predict_correct(double x, double y)
 {
Mat prediction = KF.predict();
Point2f predictPt (prediction.at<float>(0), prediction.at<float>(1));   
measurement(0) = x;
measurement(1) = y; 
Mat estimated = KF.correct(measurement);
Point2f statePt (estimated.at<float>(0), estimated.at<float>(1));
return statePt;
  }
// SMOOTH DATA
measurement.setTo(Scalar(0));
for(size_t m = 0; m < new_track_feature.size(); m++)
{
    for(size_t n = 0; n < new_track_feature[0].point_list.size(); n++)
    {
        init_kalman(new_track_feature[m].point_list[n].point.x, new_track_feature[m].point_list[n].point.y);
        Point2f smooth_feature = kalman_predict_correct(new_track_feature[m].point_list[n].point.x, new_track_feature[m].point_list[n].point.y);
        smooth_feature_point.push_back(PointFeature(n,smooth_feature,USE));
    }
    smooth_feature_track.push_back(TrackFeature(m,smooth_feature_point));
}

0 个答案:

没有答案