示例#1
0
        /// <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);
        }
示例#2
0
        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);
        }