现在,我正在研究视频稳定这个主题。我根据 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));
}