KalmanFilter.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Emgu.CV;
  7. using Emgu.CV.Structure;
  8. namespace bbiwarg.Utility
  9. {
  10. class KalmanFilter
  11. {
  12. public KalmanFilter()
  13. {
  14. Kalman kalman = new Kalman(4, 2, 0);
  15. // initial state
  16. Matrix<float> initialState = new Matrix<float>(new float[] { 0.0f, 0.0f, 0.0f, 0.0f});
  17. kalman.CorrectedState = initialState;
  18. // transition matrix
  19. Matrix<float> transitionMatrix = new Matrix<float>(new float[,]
  20. { {1.0f, 0.0f, 1.0f, 0.0f},
  21. {0.0f, 1.0f, 0.0f, 1.0f},
  22. {0.0f, 0.0f, 1.0f, 0.0f},
  23. {0.0f, 0.0f, 0.0f, 1.0f}});
  24. kalman.TransitionMatrix = transitionMatrix;
  25. // measurement matrix
  26. Matrix<float> measurementMatrix = new Matrix<float>(new float[,]
  27. { {1.0f, 0.0f, 0.0f, 0.0f},
  28. {0.0f, 1.0f, 0.0f, 0.0f}
  29. });
  30. kalman.MeasurementMatrix = measurementMatrix;
  31. // measurement noise covariance matrix
  32. Matrix<float> measurementNoiseCovarianceMatrix = new Matrix<float>(2, 2);
  33. measurementNoiseCovarianceMatrix.SetIdentity(new MCvScalar(1.0e-1));
  34. kalman.MeasurementNoiseCovariance = measurementNoiseCovarianceMatrix;
  35. // process noise covariance matrix
  36. Matrix<float> processNoiseCovarianceMatrix = new Matrix<float>(4, 4);
  37. processNoiseCovarianceMatrix.SetIdentity(new MCvScalar(1.0e-4));
  38. kalman.ProcessNoiseCovariance = processNoiseCovarianceMatrix;
  39. // error covariance post matrix (initial value)
  40. Matrix<float> errorCovariancePostMatrix = new Matrix<float>(4, 4);
  41. errorCovariancePostMatrix.SetIdentity();
  42. kalman.ErrorCovariancePost = errorCovariancePostMatrix;
  43. Random random = new Random();
  44. int[] randomData = new int[70];
  45. for (int i = 0; i < 70; ++i)
  46. {
  47. int y = random.Next() % 21 - 10;
  48. randomData[i] = y;
  49. }
  50. int[] filteredData = new int[70];
  51. for (int i = 0; i < 70; ++i)
  52. {
  53. // random data (could be touch position)
  54. Matrix<float> data = new Matrix<float>(new float[,]
  55. { {0.0f},
  56. {randomData[i]}});
  57. // prediction according to model
  58. Matrix<float> prediction = kalman.Predict();
  59. // estimated point
  60. Matrix<float> estimate = kalman.Correct(data);
  61. filteredData[i] = (int) estimate[1, 0];
  62. }
  63. Console.WriteLine("unfiltered: ");
  64. for (int i = 0; i < 21; ++i)
  65. {
  66. int val = 10 - i;
  67. for (int j = 0; j < 70; ++j)
  68. {
  69. if (randomData[j] >= val)
  70. Console.Write("#");
  71. else
  72. Console.Write(' ');
  73. }
  74. Console.WriteLine();
  75. }
  76. Console.WriteLine("filtered: ");
  77. for (int i = 0; i < 21; ++i)
  78. {
  79. int val = 10 - i;
  80. for (int j = 0; j < 70; ++j)
  81. {
  82. if (filteredData[j] >= val)
  83. Console.Write("#");
  84. else
  85. Console.Write(' ');
  86. }
  87. Console.WriteLine();
  88. }
  89. Console.Read();
  90. }
  91. }
  92. }