123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- 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);
- // initial state
- Matrix<float> initialState = new Matrix<float>(new float[] { 0.0f, 0.0f, 0.0f, 0.0f});
- kalman.CorrectedState = initialState;
- // transition matrix
- 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;
- // measurement matrix
- 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;
- // measurement noise covariance matrix
- Matrix<float> measurementNoiseCovarianceMatrix = new Matrix<float>(2, 2);
- measurementNoiseCovarianceMatrix.SetIdentity(new MCvScalar(1.0e-1));
- kalman.MeasurementNoiseCovariance = measurementNoiseCovarianceMatrix;
- // process noise covariance matrix
- Matrix<float> processNoiseCovarianceMatrix = new Matrix<float>(4, 4);
- processNoiseCovarianceMatrix.SetIdentity(new MCvScalar(1.0e-4));
- kalman.ProcessNoiseCovariance = processNoiseCovarianceMatrix;
- // error covariance post matrix (initial value)
- 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)
- {
- // random data (could be touch position)
- Matrix<float> data = new Matrix<float>(new float[,]
- { {0.0f},
- {randomData[i]}});
- // prediction according to model
- Matrix<float> prediction = kalman.Predict();
-
- // estimated point
- 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();
- }
- }
- }
|