forked from Smorodov/Multitarget-tracker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathKalman.cpp
More file actions
84 lines (70 loc) · 2.79 KB
/
Kalman.cpp
File metadata and controls
84 lines (70 loc) · 2.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "Kalman.h"
#include "opencv2/opencv.hpp"
#include <iostream>
#include <vector>
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
TKalmanFilter::TKalmanFilter(Point_t pt, track_t dt, track_t Accel_noise_mag)
{
//time increment (lower values makes target more "massive")
deltatime = dt; //0.2
// We don't know acceleration, so, assume it to process noise.
// But we can guess, the range of acceleration values thich can be achieved by tracked object.
// Process noise. (standard deviation of acceleration: m/s^2)
// shows, woh much target can accelerate.
//track_t Accel_noise_mag = 0.5;
//4 state variables, 2 measurements
kalman = new cv::KalmanFilter( 4, 2, 0 );
// Transition cv::Matrix
kalman->transitionMatrix = (cv::Mat_<track_t>(4, 4) << 1, 0, deltatime, 0, 0, 1, 0, deltatime, 0, 0, 1, 0, 0, 0, 0, 1);
// init...
LastResult = pt;
kalman->statePre.at<track_t>(0) = pt.x; // x
kalman->statePre.at<track_t>(1) = pt.y; // y
kalman->statePre.at<track_t>(2) = 0;
kalman->statePre.at<track_t>(3) = 0;
kalman->statePost.at<track_t>(0) = pt.x;
kalman->statePost.at<track_t>(1) = pt.y;
cv::setIdentity(kalman->measurementMatrix);
kalman->processNoiseCov = (cv::Mat_<track_t>(4, 4) <<
pow(deltatime,4.0)/4.0 ,0 ,pow(deltatime,3.0)/2.0 ,0,
0 ,pow(deltatime,4.0)/4.0 ,0 ,pow(deltatime,3.0)/2.0,
pow(deltatime,3.0)/2.0 ,0 ,pow(deltatime,2.0) ,0,
0 ,pow(deltatime,3.0)/2.0 ,0 ,pow(deltatime,2.0));
kalman->processNoiseCov*=Accel_noise_mag;
setIdentity(kalman->measurementNoiseCov, cv::Scalar::all(0.1));
setIdentity(kalman->errorCovPost, cv::Scalar::all(.1));
}
//---------------------------------------------------------------------------
TKalmanFilter::~TKalmanFilter()
{
delete kalman;
}
//---------------------------------------------------------------------------
Point_t TKalmanFilter::GetPrediction()
{
cv::Mat prediction = kalman->predict();
LastResult = Point_t(prediction.at<track_t>(0), prediction.at<track_t>(1));
return LastResult;
}
//---------------------------------------------------------------------------
Point_t TKalmanFilter::Update(Point_t p, bool DataCorrect)
{
cv::Mat measurement(2, 1, Mat_t(1));
if(!DataCorrect)
{
measurement.at<track_t>(0) = LastResult.x; //update using prediction
measurement.at<track_t>(1) = LastResult.y;
}
else
{
measurement.at<track_t>(0) = p.x; //update using measurements
measurement.at<track_t>(1) = p.y;
}
// Correction
cv::Mat estiMated = kalman->correct(measurement);
LastResult.x = estiMated.at<track_t>(0); //update using measurements
LastResult.y = estiMated.at<track_t>(1);
return LastResult;
}
//---------------------------------------------------------------------------