public void KeyInputIsSentAfterHandsInput_KeyInputIsNotIgnored() { var skinColorHandsDetectorMock = new Mock <ISkinColorHandsDetector>(); skinColorHandsDetectorMock.Setup(schd => schd.Tuned).Returns(true); var left = new NormalizedHand(0.15, 0.2, 0.18); var right = new NormalizedHand(0.85, 0.2, 0.18); var hands = new NormalizedHands(left, right); var handsDetectorResult = new HandsDetectorResult(hands, null); skinColorHandsDetectorMock.Setup(schd => schd.DetectHands(It.IsAny <BgrImage>())) .Returns(handsDetectorResult); var keyInputEvaluator = new GeneralDroneKeyInputEvaluator(); var handsInputEvaluator = new DroneControllerHandsInputEvaluator(); var neutralLeft = new NormalizedHand(0.15, 0.5, 0.18); var neutralRight = new NormalizedHand(0.85, 0.5, 0.18); var neutralHands = new NormalizedHands(neutralLeft, neutralRight); handsInputEvaluator.Tune(neutralHands); this.caduhdApp = new CaduhdApp(null, skinColorHandsDetectorMock.Object, this.tello, keyInputEvaluator, handsInputEvaluator); this.caduhdApp.Input(BgrImage.GetBlank(1, 1, Color.Black)); this.udpClient.Client.ReceiveTimeout = 1000; string response = string.Empty; bool handsInputIgnored = false; try { response = this.udpClient.Receive(ref this.anyEndPoint).AsString(); Assert.Equal($"rc 0 0 {this.tello.Speed} 0", response); } catch (SocketException) { } this.caduhdApp.Input(new KeyInfo(Key.D, KeyState.Down)); try { response = this.udpClient.Receive(ref this.anyEndPoint).AsString(); } catch (SocketException e) { if (e.SocketErrorCode == SocketError.TimedOut) { handsInputIgnored = true; } } this.tello.Dispose(); Assert.False(handsInputIgnored); Assert.Equal($"rc 0 0 0 {this.tello.Speed}", response); }
/// <summary> /// This is the entry point of the hands into the Caduhd App. /// </summary> /// <param name="image">The image, possibly containing hands.</param> public void Input(BgrImage image) { if (Interlocked.CompareExchange(ref this.isWebCameraFrameProcessorBusy, YES, NO) == NO) { if (this.handsAnalyzer != null) { this.uiConnector.SetHandsAnalyzerState(this.handsAnalyzer.State); } BgrImage frame = image; MoveCommand moveCommand = null; if (this.skinColorHandsDetector.Tuned) { HandsDetectorResult result = this.skinColorHandsDetector.DetectHands(frame); frame = result.Image; var hands = result.Hands; moveCommand = (this.handsDroneController.ProcessHandsInput(hands) as DroneControllerHandsInputProcessResult)?.Result; } else { if (this.handsAnalyzer.State == HandsAnalyzerState.ReadyToAnalyzeLeft || this.handsAnalyzer.State == HandsAnalyzerState.AnalyzingLeft) { if (this.handsAnalyzer.State == HandsAnalyzerState.AnalyzingLeft) { this.handsAnalyzer.AnalyzeLeft(frame, this.handsDroneController.HandsInputEvaluator.TunerHands["left"]["poi"]); this.handsAnalyzer.AdvanceState(); } frame.MarkPoints(this.handsDroneController.HandsInputEvaluator.TunerHands["left"]["outline"], Color.Yellow); } else if (this.handsAnalyzer.State == HandsAnalyzerState.ReadyToAnalyzeRight || this.handsAnalyzer.State == HandsAnalyzerState.AnalyzingRight) { if (this.handsAnalyzer.State == HandsAnalyzerState.AnalyzingRight) { this.handsAnalyzer.AnalyzeRight(frame, this.handsDroneController.HandsInputEvaluator.TunerHands["right"]["poi"]); this.handsAnalyzer.AdvanceState(); } frame.MarkPoints(this.handsDroneController.HandsInputEvaluator.TunerHands["right"]["outline"], Color.Yellow); } else if (this.handsAnalyzer.State == HandsAnalyzerState.Tuning) { HandsAnalyzerResult result = this.handsAnalyzer.Result; NormalizedHands neutralHands = this.skinColorHandsDetector.Tune(result); this.handsDroneController.HandsInputEvaluator.Tune(neutralHands); } } this.uiConnector?.SetComputerCameraImage(frame); this.uiConnector?.SetEvaluatedHandsInput(moveCommand); Interlocked.Exchange(ref this.isWebCameraFrameProcessorBusy, NO); } }
public void DifferentHandsInputsAfterEachOther_BothSent() { var skinColorHandsDetectorMock = new Mock <ISkinColorHandsDetector>(); skinColorHandsDetectorMock.Setup(schd => schd.Tuned).Returns(true); var firstLeft = new NormalizedHand(0.15, 0.2, 0.18); var firstRight = new NormalizedHand(0.85, 0.2, 0.18); var firstHands = new NormalizedHands(firstLeft, firstRight); var firstHandsDetectorResult = new HandsDetectorResult(firstHands, null); var secondLeft = new NormalizedHand(0.15, 0.8, 0.18); var secondRight = new NormalizedHand(0.85, 0.7, 0.18); var secondHands = new NormalizedHands(secondLeft, secondRight); var secondandsDetectorResult = new HandsDetectorResult(secondHands, null); skinColorHandsDetectorMock.SetupSequence(schd => schd.DetectHands(It.IsAny <BgrImage>())) .Returns(firstHandsDetectorResult) .Returns(secondandsDetectorResult); var keyInputEvaluator = new GeneralDroneKeyInputEvaluator(); var handsInputEvaluator = new DroneControllerHandsInputEvaluator(); var neutralLeft = new NormalizedHand(0.15, 0.5, 0.18); var neutralRight = new NormalizedHand(0.85, 0.5, 0.18); var neutralHands = new NormalizedHands(neutralLeft, neutralRight); handsInputEvaluator.Tune(neutralHands); this.caduhdApp = new CaduhdApp(null, skinColorHandsDetectorMock.Object, this.tello, keyInputEvaluator, handsInputEvaluator); this.caduhdApp.Input(BgrImage.GetBlank(1, 1, Color.Black)); this.caduhdApp.Input(BgrImage.GetBlank(1, 1, Color.Black)); this.udpClient.Client.ReceiveTimeout = 1000; int counter = 0; try { string response = this.udpClient.Receive(ref this.anyEndPoint).AsString(); Assert.Equal($"rc 0 0 {this.tello.Speed} 0", response); counter++; response = this.udpClient.Receive(ref this.anyEndPoint).AsString(); Assert.Equal($"rc 0 0 -{this.tello.Speed} 0", response); counter++; } catch (SocketException) { } this.tello.Dispose(); Assert.Equal(2, counter); }
public void HandsInputAnalyzerTuned_HandsInput_MoveDownwards_HandsInputEvaluated_CorrectMoveCommandSent() { var skinColorHandsDetectorMock = new Mock <ISkinColorHandsDetector>(); skinColorHandsDetectorMock.Setup(schd => schd.Tuned).Returns(true); var neutralLeft = new NormalizedHand(0.15, 0.5, 0.18); var neutralRight = new NormalizedHand(0.85, 0.5, 0.18); var neutralHands = new NormalizedHands(neutralLeft, neutralRight); var left = new NormalizedHand(0.15, 0.8, 0.18); var right = new NormalizedHand(0.85, 0.8, 0.18); var hands = new NormalizedHands(left, right); var handsDetectorResult = new HandsDetectorResult(hands, null); skinColorHandsDetectorMock.Setup(schd => schd.DetectHands(It.IsAny <BgrImage>())) .Returns(handsDetectorResult); var keyInputEvaluator = new GeneralDroneKeyInputEvaluator(); var handsInputEvaluator = new DroneControllerHandsInputEvaluator(); handsInputEvaluator.Tune(neutralHands); this.caduhdApp = new CaduhdApp(null, skinColorHandsDetectorMock.Object, this.tello, keyInputEvaluator, handsInputEvaluator); string response = string.Empty; this.caduhdApp.Input(BgrImage.GetBlank(1, 1, Color.Black)); try { response = this.udpClient.Receive(ref this.anyEndPoint).AsString(); } catch (SocketException) { } // it needs to be disposed of here this.tello.Dispose(); Assert.Equal($"rc 0 0 -{this.tello.Speed} 0", response); }
public HandsDetectorResultTests() { this.hands = new NormalizedHands(new NormalizedHand(), new NormalizedHand()); this.image = BgrImage.GetBlank(100, 100, Color.White); this.handsDetectorResult = new HandsDetectorResult(this.hands, this.image); }