|
@@ -0,0 +1,110 @@
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.Linq;
|
|
|
+using System.Text;
|
|
|
+using System.Threading.Tasks;
|
|
|
+
|
|
|
+using Emgu.CV;
|
|
|
+using Emgu.CV.Structure;
|
|
|
+
|
|
|
+namespace bbiwarg.Utility
|
|
|
+{
|
|
|
+ class KalmanFilter
|
|
|
+ {
|
|
|
+ public KalmanFilter()
|
|
|
+ {
|
|
|
+ Kalman kalman = new Kalman(4, 2, 0);
|
|
|
+
|
|
|
+
|
|
|
+ Matrix<float> initialState = new Matrix<float>(new float[] { 0.0f, 0.0f, 0.0f, 0.0f});
|
|
|
+ kalman.CorrectedState = initialState;
|
|
|
+
|
|
|
+
|
|
|
+ Matrix<float> transitionMatrix = new Matrix<float>(new float[,]
|
|
|
+ { {1.0f, 0.0f, 1.0f, 0.0f},
|
|
|
+ {0.0f, 1.0f, 0.0f, 1.0f},
|
|
|
+ {0.0f, 0.0f, 1.0f, 0.0f},
|
|
|
+ {0.0f, 0.0f, 0.0f, 1.0f}});
|
|
|
+ kalman.TransitionMatrix = transitionMatrix;
|
|
|
+
|
|
|
+
|
|
|
+ Matrix<float> measurementMatrix = new Matrix<float>(new float[,]
|
|
|
+ { {1.0f, 0.0f, 0.0f, 0.0f},
|
|
|
+ {0.0f, 1.0f, 0.0f, 0.0f}
|
|
|
+ });
|
|
|
+ kalman.MeasurementMatrix = measurementMatrix;
|
|
|
+
|
|
|
+
|
|
|
+ Matrix<float> measurementNoiseCovarianceMatrix = new Matrix<float>(2, 2);
|
|
|
+ measurementNoiseCovarianceMatrix.SetIdentity(new MCvScalar(1.0e-1));
|
|
|
+ kalman.MeasurementNoiseCovariance = measurementNoiseCovarianceMatrix;
|
|
|
+
|
|
|
+
|
|
|
+ Matrix<float> processNoiseCovarianceMatrix = new Matrix<float>(4, 4);
|
|
|
+ processNoiseCovarianceMatrix.SetIdentity(new MCvScalar(1.0e-4));
|
|
|
+ kalman.ProcessNoiseCovariance = processNoiseCovarianceMatrix;
|
|
|
+
|
|
|
+
|
|
|
+ Matrix<float> errorCovariancePostMatrix = new Matrix<float>(4, 4);
|
|
|
+ errorCovariancePostMatrix.SetIdentity();
|
|
|
+ kalman.ErrorCovariancePost = errorCovariancePostMatrix;
|
|
|
+
|
|
|
+
|
|
|
+ Random random = new Random();
|
|
|
+ int[] randomData = new int[70];
|
|
|
+
|
|
|
+ for (int i = 0; i < 70; ++i)
|
|
|
+ {
|
|
|
+ int y = random.Next() % 21 - 10;
|
|
|
+ randomData[i] = y;
|
|
|
+ }
|
|
|
+
|
|
|
+ int[] filteredData = new int[70];
|
|
|
+ for (int i = 0; i < 70; ++i)
|
|
|
+ {
|
|
|
+
|
|
|
+ Matrix<float> data = new Matrix<float>(new float[,]
|
|
|
+ { {0.0f},
|
|
|
+ {randomData[i]}});
|
|
|
+
|
|
|
+
|
|
|
+ Matrix<float> prediction = kalman.Predict();
|
|
|
+
|
|
|
+
|
|
|
+ Matrix<float> estimate = kalman.Correct(data);
|
|
|
+ filteredData[i] = (int) estimate[1, 0];
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ Console.WriteLine("unfiltered: ");
|
|
|
+ for (int i = 0; i < 21; ++i)
|
|
|
+ {
|
|
|
+ int val = 10 - i;
|
|
|
+ for (int j = 0; j < 70; ++j)
|
|
|
+ {
|
|
|
+ if (randomData[j] >= val)
|
|
|
+ Console.Write("#");
|
|
|
+ else
|
|
|
+ Console.Write(' ');
|
|
|
+ }
|
|
|
+ Console.WriteLine();
|
|
|
+ }
|
|
|
+
|
|
|
+ Console.WriteLine("filtered: ");
|
|
|
+ for (int i = 0; i < 21; ++i)
|
|
|
+ {
|
|
|
+ int val = 10 - i;
|
|
|
+ for (int j = 0; j < 70; ++j)
|
|
|
+ {
|
|
|
+ if (filteredData[j] >= val)
|
|
|
+ Console.Write("#");
|
|
|
+ else
|
|
|
+ Console.Write(' ');
|
|
|
+ }
|
|
|
+ Console.WriteLine();
|
|
|
+ }
|
|
|
+
|
|
|
+ Console.Read();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|