TrackedPalm.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using bbiwarg.Recognition.Tracking;
  7. using bbiwarg.Recognition.HandRecognition;
  8. using bbiwarg.Utility;
  9. namespace bbiwarg.Recognition.PalmRecognition
  10. {
  11. class TrackedPalm : TrackedObject<Palm>
  12. {
  13. private Kalman2DPositionFilter wristUpperKalman;
  14. private Kalman2DPositionFilter wristLowerKalman;
  15. private Kalman2DPositionFilter fingersUpperKalman;
  16. private Kalman2DPositionFilter fingersLowerKalman;
  17. public Vector2D WristUpperPrediction { get { return wristUpperKalman.getPrediction(); } }
  18. public Vector2D WristLowerPrediction { get { return wristLowerKalman.getPrediction(); } }
  19. public Vector2D FingersUpperPrediction { get { return fingersUpperKalman.getPrediction(); } }
  20. public Vector2D FingersLowerPrediction { get { return fingersLowerKalman.getPrediction(); } }
  21. public Palm OptimizedPalm { get; private set; }
  22. public TrackedPalm(int id, Palm detectedPalm, int numFramesDetectedUntilTracked, int numFramesLostUntilDeleted)
  23. : base(id, detectedPalm, numFramesDetectedUntilTracked, numFramesLostUntilDeleted)
  24. {
  25. wristUpperKalman = new Kalman2DPositionFilter(Parameters.PalmmXX, Parameters.PalmmXY, Parameters.PalmmYY);
  26. wristLowerKalman = new Kalman2DPositionFilter(Parameters.PalmmXX, Parameters.PalmmXY, Parameters.PalmmYY);
  27. fingersUpperKalman = new Kalman2DPositionFilter(Parameters.PalmmXX, Parameters.PalmmXY, Parameters.PalmmYY);
  28. fingersLowerKalman = new Kalman2DPositionFilter(Parameters.PalmmXX, Parameters.PalmmXY, Parameters.PalmmYY);
  29. wristUpperKalman.setInitialPosition(detectedPalm.WristUpper);
  30. wristLowerKalman.setInitialPosition(detectedPalm.WristLower);
  31. fingersUpperKalman.setInitialPosition(detectedPalm.FingersUpper);
  32. fingersLowerKalman.setInitialPosition(detectedPalm.FingersLower);
  33. updateOptimizedPalm();
  34. logStateChange();
  35. }
  36. public override void updateFrame(Palm detectedPalm)
  37. {
  38. base.updateFrame(detectedPalm);
  39. if (NumFramesInCurrentState == 1)
  40. logStateChange();
  41. if (detectedPalm != null)
  42. {
  43. wristUpperKalman.getCorrectedPosition(detectedPalm.WristUpper);
  44. wristLowerKalman.getCorrectedPosition(detectedPalm.WristLower);
  45. fingersUpperKalman.getCorrectedPosition(detectedPalm.FingersUpper);
  46. fingersLowerKalman.getCorrectedPosition(detectedPalm.FingersLower);
  47. updateOptimizedPalm();
  48. }
  49. }
  50. private void updateOptimizedPalm() {
  51. OptimizedPalm = new Palm(LastObject.Hand, WristUpperPrediction, WristLowerPrediction, FingersLowerPrediction, FingersUpperPrediction);
  52. }
  53. public override float calculateSimilarity(Palm detectedPalm)
  54. {
  55. //hand
  56. float handSimilarity = (detectedPalm.Hand.TrackID == LastObject.Hand.TrackID) ? 1 : 0;
  57. //wristUpper
  58. float wristUpperDistance = WristUpperPrediction.getDistanceTo(detectedPalm.WristUpper);
  59. float wristUpperSimilarity = Math.Max(0, 1 - wristUpperDistance / Parameters.ImageDiagonalLength);
  60. //wristLower
  61. float wristLowerDistance = WristLowerPrediction.getDistanceTo(detectedPalm.WristLower);
  62. float wristLowerSimilarity = Math.Max(0, 1 - wristLowerDistance / Parameters.ImageDiagonalLength);
  63. //fingersUpper
  64. float fingersUpperDistance = FingersUpperPrediction.getDistanceTo(detectedPalm.FingersUpper);
  65. float fingersUpperSimilarity = Math.Max(0, 1 - fingersUpperDistance / Parameters.ImageDiagonalLength);
  66. //fingersLower
  67. float fingersLowerDistance = FingersLowerPrediction.getDistanceTo(detectedPalm.FingersLower);
  68. float fingersLowerSimilarity = Math.Max(0, 1 - fingersLowerDistance / Parameters.ImageDiagonalLength);
  69. float similarity = handSimilarity * wristUpperSimilarity * wristLowerSimilarity * fingersUpperSimilarity * fingersLowerSimilarity;
  70. return similarity;
  71. }
  72. private void logStateChange()
  73. {
  74. String stateAsString = CurrentState.ToString().ToLower();
  75. Logger.log(String.Format("Palm #{0} {1}", this.ID, stateAsString), LogSubject.PalmTracker);
  76. }
  77. }
  78. }