private void KinectManager_FrameArrived(object sender, KinectFrameArrivedEventArgs e) { UpdateBodies(_KinectManager.KinectSensor, e.Bodies, e.FrameNumber); }
private void KinectManager_FrameArrived(object sender, KinectFrameArrivedEventArgs e) { //Find body closest to centre of FoV double ClosestBodyDistance = 3 * 3; ulong ClosestBodyKey = ulong.MaxValue; bool EngagedBodyStillPresent = false; int i = 0; foreach (var body in _BodyManager) { if (body.Value.IsOnScreen) { // Ideal position is at X=0, Z=1.5 BodyDistance = body.Value.Joints[JointType.SpineShoulder].Position.X * body.Value.Joints[JointType.SpineShoulder].Position.X + (body.Value.Joints[JointType.SpineShoulder].Position.Z - 1.5) * (body.Value.Joints[JointType.SpineShoulder].Position.Z - 1.5); if (BodyDistance < ClosestBodyDistance) { ClosestBodyDistance = BodyDistance; ClosestBodyKey = body.Value.TrackingId; } } // This IF must always be tested!! if (body.Key == EngagedBodyKey) // Identifies the currently engaged body - to allow for it to be disengaged { EngagedBodyStillPresent = true; } i++; } if (!EngagedBodyStillPresent) { EngagedBodyKey = ulong.MaxValue; } if (ClosestBodyKey == ulong.MaxValue || ClosestBodyKey == EngagedBodyKey) { //If no bodies fall within the max range // OR //If the closest body is the previously engaged body FramesEngaged = 0; } else { //If the closest body is NOT the previously engaged body //Then check if closest body is engaged (hand over spinemid) and if previously engaged body is a certain distance further than closest body Joint handLeft = _BodyManager[ClosestBodyKey].Joints[JointType.HandLeft]; Joint handRight = _BodyManager[ClosestBodyKey].Joints[JointType.HandRight]; Joint spineMid = _BodyManager[ClosestBodyKey].Joints[JointType.SpineMid]; //Joint shoulderLeft = _BodyManager[ClosestBodyKey].Joints[JointType.ShoulderLeft]; //Joint shoulderRight = _BodyManager[ClosestBodyKey].Joints[JointType.ShoulderRight]; if (handLeft.IsTracked() && handRight.IsTracked() && spineMid.IsTracked())// && shoulderLeft.IsTracked() && shoulderRight.IsTracked()) { // If hand above hip and body facing sensor if ((handLeft.Position.Y > spineMid.Position.Y || handRight.Position.Y > spineMid.Position.Y) && _BodyManager[ClosestBodyKey].IsFacingScreen) { // If there is a currently engaged body, then compare distances. if (EngagedBodyKey < ulong.MaxValue) { if (_BodyManager[EngagedBodyKey].IsOnScreen) { BodyDistance = Math.Sqrt(_BodyManager[ClosestBodyKey].Joints[JointType.SpineShoulder].Position.X * _BodyManager[ClosestBodyKey].Joints[JointType.SpineShoulder].Position.X + _BodyManager[ClosestBodyKey].Joints[JointType.SpineShoulder].Position.Z * _BodyManager[ClosestBodyKey].Joints[JointType.SpineShoulder].Position.Z); EngagedBodyDistance = Math.Sqrt(_BodyManager[ClosestBodyKey].Joints[JointType.SpineShoulder].Position.X * _BodyManager[ClosestBodyKey].Joints[JointType.SpineShoulder].Position.X + _BodyManager[ClosestBodyKey].Joints[JointType.SpineShoulder].Position.Z * _BodyManager[ClosestBodyKey].Joints[JointType.SpineShoulder].Position.Z); if (EngagedBodyDistance - BodyDistance > MinPositionDifference) { FramesEngaged++; } else { FramesEngaged = 0; } } else { FramesEngaged++; } } else { FramesEngaged++; } if (FramesEngaged > MinFramesEngaged) { if (EngagedBodyKey < ulong.MaxValue) { RaiseDisengagedEventHandler(_BodyManager[EngagedBodyKey].TrackingId); } RaiseEngagedEventHandler(_BodyManager[ClosestBodyKey].TrackingId); EngagedBodyKey = _BodyManager[ClosestBodyKey].TrackingId; FramesEngaged = 0; } } } } }
private void KinectManager_FrameArrived(object sender, KinectFrameArrivedEventArgs e) { }