/// <summary> /// Get a rectangle containing a body's face based on the position of its neck and head /// </summary> /// <param name="body">The body of which we want the face rectangle</param> /// <param name="mapper">A coordinate mapper, used for mapping body's joints' positions to color space</param> /// <param name="faceRect">A <c>Rectangle</c> containing <c>body</c>'s face</param> /// <returns>True if succesful</returns> public static bool TryGetHeadRectangle(IBody body, ICoordinateMapper mapper, out Rectangle faceRect) { faceRect = Rectangle.Empty; if (!body.Joints.TryGetValue(JointType.Head, out var headJoint) || !body.Joints.TryGetValue(JointType.Neck, out var neckJoint)) { return(false); } if (!headJoint.IsTracked || !neckJoint.IsTracked) { return(false); } var headJointColorPos = mapper.MapCameraPointToColorSpace(headJoint.Position); var neckJointColorPos = mapper.MapCameraPointToColorSpace(neckJoint.Position); float headNeckDistance = headJointColorPos.DistanceFrom(neckJointColorPos); bool isFaceVertical = Math.Abs(headJointColorPos.Y - neckJointColorPos.Y) > Math.Abs(headJointColorPos.X - neckJointColorPos.X); float width = isFaceVertical ? headNeckDistance * FaceWidthMultiplier : headNeckDistance * FaceHeightMultiplier; float height = isFaceVertical ? headNeckDistance * FaceHeightMultiplier : headNeckDistance * FaceWidthMultiplier; faceRect = new Rectangle( (int)(headJointColorPos.X - width / 2), (int)(headJointColorPos.Y - height / 2), (int)width, (int)height); return(true); }
public static IDictionary <JointType, Vector2> MapJointsToColorSpace(IBody body, ICoordinateMapper mapper) { var ret = new Dictionary <JointType, Vector2>(); foreach (var joint in body.Joints) { var cameraPoint = joint.Value.Position; if (cameraPoint.Z < 0) { cameraPoint.Z = 0.1f; } var colorPoint = mapper.MapCameraPointToColorSpace(joint.Value.Position); ret.Add(joint.Key, colorPoint); } return(ret); }