public HandTrackingValue(ClassificationList classificationList, NormalizedLandmarkList landmarkList, NormalizedRect rect, List <Detection> detections)
 {
     Handedness       = classificationList;
     HandLandmarkList = landmarkList;
     HandRect         = rect;
     PalmDetections   = detections;
 }
Esempio n. 2
0
 public void CorrectAndPredict(NormalizedLandmarkList normalizedLandmarkList)
 {
     if (landmarkFilters == null)
     {
         setupFilters(normalizedLandmarkList);
         correctAndPredict(normalizedLandmarkList);
     }
     else
     {
         var oldPosition  = landmarkFilters[0].GetPosition();
         var newLandmark  = normalizedLandmarkList.Landmark[0];
         var newPosition  = new Vector3(newLandmark.X, newLandmark.Y, newLandmark.Z);
         var displacement = Vector3.Distance(oldPosition, newPosition);
         //Debug.Log(displacement);
         if (displacement > displacementLimit)
         {
             if (warmup < 20)
             {
                 warmup++;
                 correctAndPredict(normalizedLandmarkList);
             }
             else
             {
                 Debug.Log("Filtered error landmark data(d): " + displacement);
             }
         }
         else
         {
             correctAndPredict(normalizedLandmarkList);
         }
     }
 }
Esempio n. 3
0
 public PoseTrackingValue(Detection poseDetection, NormalizedLandmarkList poseLandmarks, LandmarkList poseWorldLandmarks, NormalizedRect roiFromLandmarks)
 {
     this.poseDetection      = poseDetection;
     this.poseLandmarks      = poseLandmarks;
     this.poseWorldLandmarks = poseWorldLandmarks;
     this.roiFromLandmarks   = roiFromLandmarks;
 }
Esempio n. 4
0
 public void Draw(NormalizedLandmarkList faceLandmarks, NormalizedLandmarkList poseLandmarks,
                  NormalizedLandmarkList leftHandLandmarks, NormalizedLandmarkList rightHandLandmarks,
                  NormalizedLandmarkList leftIrisLandmarks, NormalizedLandmarkList rightIrisLandmarks, bool visualizeZ = false, int circleVertices = 128)
 {
     Draw(
         faceLandmarks?.Landmark, poseLandmarks?.Landmark, leftHandLandmarks?.Landmark, rightHandLandmarks?.Landmark, leftIrisLandmarks?.Landmark, rightIrisLandmarks?.Landmark, visualizeZ
         );
 }
Esempio n. 5
0
 private void correctAndPredict(NormalizedLandmarkList normalizedLandmarkList)
 {
     for (int i = 0; i < count; i++)
     {
         landmarkFilters[i].Correct(normalizedLandmarkList.Landmark[i]);
         landmarkFilters[i].Predict();
     }
 }
Esempio n. 6
0
 public void Draw(Transform screenTransform, ClassificationList handedness, NormalizedLandmarkList handLandmarkList,
                  NormalizedRect handRect, List <Detection> palmDetections, bool isFlipped = false)
 {
     handednessAnnotation.GetComponent <ClassificationAnnotationController>().Draw(screenTransform, handedness);
     handLandmarkListAnnotation.GetComponent <HandLandmarkListAnnotationController>().Draw(screenTransform, handLandmarkList, isFlipped);
     handRectAnnotation.GetComponent <RectAnnotationController>().Draw(screenTransform, handRect, isFlipped);
     palmDetectionsAnnotation.GetComponent <DetectionListAnnotationController>().Draw(screenTransform, palmDetections, isFlipped);
 }
Esempio n. 7
0
 private void setupFilters(NormalizedLandmarkList normalizedLandmarkList)
 {
     landmarkFilters = new List <LandmarkFilter>();
     this.count      = normalizedLandmarkList.Landmark.Count;
     for (int i = 0; i < count; i++)
     {
         landmarkFilters.Add(new LandmarkFilter(timeInterval, noise));
     }
 }
 public HolisticValue(NormalizedLandmarkList PoseLandmarks, NormalizedRect PoseRoi, Detection PoseDetection,
                      NormalizedLandmarkList FaceLandmarks, NormalizedLandmarkList LeftHandLandmarks, NormalizedLandmarkList RightHandLandmarks)
 {
     this.PoseLandmarks      = PoseLandmarks;
     this.PoseRoi            = PoseRoi;
     this.PoseDetection      = PoseDetection;
     this.FaceLandmarks      = FaceLandmarks;
     this.LeftHandLandmarks  = LeftHandLandmarks;
     this.RightHandLandmarks = RightHandLandmarks;
 }
 public void DrawNow(NormalizedLandmarkList faceLandmarkList, NormalizedLandmarkList poseLandmarkList,
                     NormalizedLandmarkList leftHandLandmarkList, NormalizedLandmarkList rightHandLandmarkList)
 {
     DrawNow(
         faceLandmarkList?.Landmark,
         poseLandmarkList?.Landmark,
         leftHandLandmarkList?.Landmark,
         rightHandLandmarkList?.Landmark
         );
     SyncNow();
 }
Esempio n. 10
0
        public static List <Vector3> ToList(this NormalizedLandmarkList input)
        {
            List <Vector3> output    = new List <Vector3>();
            var            landmarks = input.Landmark;

            for (int i = 0; i < landmarks.Count; i++)
            {
                var v = new Vector3(landmarks[i].X, landmarks[i].Y, landmarks[i].Z);
                output.Add(v);
            }
            return(output);
        }
    private IList <NormalizedLandmark> GetIrisLandmarks(NormalizedLandmarkList landmarkList, Side side)
    {
        var irisLandmarks = new List <NormalizedLandmark>(5);
        var offset        = 468 + (side == Side.Left ? 0 : 5);

        for (var i = 0; i < 5; i++)
        {
            irisLandmarks.Add(landmarkList.Landmark[offset + i]);
        }

        return(irisLandmarks);
    }
Esempio n. 12
0
 public HolisticTrackingValue(Detection poseDetection, NormalizedLandmarkList poseLandmarks,
                              NormalizedLandmarkList faceLandmarks, NormalizedLandmarkList leftHandLandmarks, NormalizedLandmarkList rightHandLandmarks,
                              NormalizedLandmarkList leftIrisLandmarks, NormalizedLandmarkList rightIrisLandmarks,
                              LandmarkList poseWorldLandmarks, NormalizedRect poseRoi)
 {
     this.poseDetection      = poseDetection;
     this.poseLandmarks      = poseLandmarks;
     this.faceLandmarks      = faceLandmarks;
     this.leftIrisLandmarks  = leftIrisLandmarks;
     this.rightIrisLandmarks = rightIrisLandmarks;
     this.leftHandLandmarks  = leftHandLandmarks;
     this.rightHandLandmarks = rightHandLandmarks;
     this.poseWorldLandmarks = poseWorldLandmarks;
     this.poseRoi            = poseRoi;
 }
        protected override IEnumerator WaitForNextValue()
        {
            List <Detection>       faceDetections        = null;
            NormalizedRect         faceRect              = null;
            NormalizedLandmarkList faceLandmarksWithIris = null;

            if (runningMode == RunningMode.Sync)
            {
                var _ = graphRunner.TryGetNext(out faceDetections, out faceRect, out faceLandmarksWithIris, true);
            }
            else if (runningMode == RunningMode.NonBlockingSync)
            {
                yield return(new WaitUntil(() => graphRunner.TryGetNext(out faceDetections, out faceRect, out faceLandmarksWithIris, false)));
            }

            _faceDetectionsAnnotationController.DrawNow(faceDetections);
            _faceRectAnnotationController.DrawNow(faceRect);
            _faceLandmarksWithIrisAnnotationController.DrawNow(faceLandmarksWithIris);
        }
    public void Draw(Transform screenTransform, NormalizedLandmarkList poseLandmarks, NormalizedRect poseRoi, Detection poseDetection,
                     NormalizedLandmarkList faceLandmarks, NormalizedLandmarkList leftHandLandmarks, NormalizedLandmarkList rightHandLandmarks, bool isFlipped = false)
    {
        poseLandmarksAnnotation.GetComponent <FullBodyPoseLandmarkListAnnotationController>().Draw(screenTransform, poseLandmarks, isFlipped);
        poseRoiAnnotation.GetComponent <RectAnnotationController>().Draw(screenTransform, poseRoi, isFlipped);
        poseDetectionAnnotation.GetComponent <DetectionAnnotationController>().Draw(screenTransform, poseDetection, isFlipped);
        faceLandmarksAnnotation.GetComponent <FaceLandmarkListAnnotationController>().Draw(screenTransform, faceLandmarks, isFlipped);
        leftHandLandmarksAnnotation.GetComponent <HandLandmarkListAnnotationController>().Draw(screenTransform, leftHandLandmarks, isFlipped);
        rightHandLandmarksAnnotation.GetComponent <HandLandmarkListAnnotationController>().Draw(screenTransform, rightHandLandmarks, isFlipped);

        if (faceLandmarks.Landmark.Count == 0)
        {
            ClearIrisAnnotations();
        }
        else if (faceLandmarks.Landmark.Count > 468)
        {
            var leftIrisLandmarks = GetIrisLandmarks(faceLandmarks, Side.Left);
            leftIrisLandmarksAnnotation.GetComponent <IrisAnnotationController>().Draw(screenTransform, leftIrisLandmarks, isFlipped);

            var rightIrisLandmarks = GetIrisLandmarks(faceLandmarks, Side.Right);
            rightIrisLandmarksAnnotation.GetComponent <IrisAnnotationController>().Draw(screenTransform, rightIrisLandmarks, isFlipped);
        }
    }
Esempio n. 15
0
 public void DrawLeftIrisLandmarkListLater(NormalizedLandmarkList leftIrisLandmarkList)
 {
     DrawLeftIrisLandmarkListLater(leftIrisLandmarkList?.Landmark);
 }
Esempio n. 16
0
 public void DrawNow(NormalizedLandmarkList target)
 {
     DrawNow(target?.Landmark);
 }
Esempio n. 17
0
 public void DrawLater(NormalizedLandmarkList target)
 {
     DrawLater(target?.Landmark);
 }
Esempio n. 18
0
    public override string GetMark()
    {
        // if detect hands change state machine.
        //Debug.Log(currDirection);

        if (handTrackingValue != null && handTrackingValue.PalmDetections != null && handTrackingValue.PalmDetections.Count > 0)
        {
            // blue color one...

            float width  = (float)handTrackingValue.PalmDetections[0].LocationData.RelativeBoundingBox.Width;
            float height = (float)handTrackingValue.PalmDetections[0].LocationData.RelativeBoundingBox.Height;
            // center of the X and Y
            float currX = width / 2 + (float)handTrackingValue.PalmDetections[0].LocationData.RelativeBoundingBox.Xmin;
            float currY = height / 2 + (float)handTrackingValue.PalmDetections[0].LocationData.RelativeBoundingBox.Ymin;

            // the filter to remove noise rect...
            if (width >= noise_radio_ratio && height >= noise_radio_ratio)
            {
                // send landmark here:
                if (handTrackingValue.HandLandmarkLists != null && handTrackingValue.HandLandmarkLists.Count > 0)
                {
                    NormalizedLandmarkList landmarks = handTrackingValue.HandLandmarkLists[0];
                    for (int i = 0; i < landmarks.Landmark.Count; i++)
                    {
                        float tempX, tempY, tempZ;
                        tempX = landmarks.Landmark[i].X;
                        tempY = landmarks.Landmark[i].Y;
                        tempZ = landmarks.Landmark[i].Z;
                        string temp = handsLandmarkMessage + "X=&" + tempX + "Y=&" + tempY + "Z=&" + tempZ;
                        MessageMgr.GetIns().Dispatch("HandMessage", temp);
                    }
                    //Debug.Log(landmarks.Landmark[0].X + "  ,  " + landmarks.Landmark[0].Y);
                }

                if (currState == handState.outScreen)
                {
                    /*
                     *   outScreen state.
                     *   once we detect the hand show in screen, There will be two situation,
                     *   1. first time came into the screen.
                     *   2. the hand left screen because of the move command..
                     *   For the first situation, We set a 3s frozon time,( just change the handState to move. and set time);
                     *   For the second situation. We should not change the original time,
                     *   because it's an instant state, we don't need to update location data, the location will be modified inside move state.
                     *
                     *   by combining this two situations, we need set a relative small time, (say frozen_time/2) to fit the both cases.
                     */

                    currState  = handState.move;
                    originTime = Time.time - freeze_time / 2;
                }
                else if (currState == handState.move)
                {
                    /*
                     *
                     *   move state
                     *   we set a frozon time, within it the program won't detect any move you've down.
                     *   but we will track your current position.
                     *   Time.time return current program running time.  1.0000s,  2.38491s......
                     */

                    originX = currX;
                    originY = currY;
                    if ((Time.time - originTime) > freeze_time)
                    {
                        // Frozon time end, change state to idle, ready to detect new action, Sync the time to current time.
                        currState     = handState.idle;
                        originTime    = Time.time;
                        currDirection = moveDirection.direction_idle;
                    }
                    else
                    {
                        // Frozon time, do nothing here..
                    }
                }
                else if (currState == handState.idle)
                {
                    /*
                     *
                     *   idle state
                     *   In this state, we detect hand shape instantly, (hand spread out, fist)
                     *   And we are ready to detect hand move direction (left, right, up, down)
                     *   If we detect a long range move, we change state to idle, change hand position to move direction, and start frozon time.
                     *
                     */


                    // detect hand shape by calculate vector.

                    if (handTrackingValue != null && handTrackingValue.HandLandmarkLists != null && handTrackingValue.HandLandmarkLists.Count > 0)
                    {
                        NormalizedLandmarkList landmarks = handTrackingValue.HandLandmarkLists[0];
                        Vector2[] cordinates             = new Vector2[landmarks.Landmark.Count];
                        for (int i = 0; i < cordinates.Length; i++)
                        {
                            cordinates[i] = new Vector2(landmarks.Landmark[i].X, landmarks.Landmark[i].Y);
                        }
                        Vector2 vector68   = cordinates[8] - cordinates[6];
                        Vector2 vector56   = cordinates[6] - cordinates[5];
                        Vector2 vector1012 = cordinates[12] - cordinates[10];
                        Vector2 vector910  = cordinates[10] - cordinates[9];
                        Vector2 vector1416 = cordinates[16] - cordinates[14];
                        Vector2 vector1314 = cordinates[14] - cordinates[13];
                        Vector2 vector1820 = cordinates[20] - cordinates[18];
                        Vector2 vector1718 = cordinates[18] - cordinates[17];

                        // the angle between some knuckles.

                        float angle_index  = Vector2.Angle(vector68, vector56);
                        float angle_middle = Vector2.Angle(vector910, vector1012);
                        float angle_ring   = Vector2.Angle(vector1314, vector1416);
                        float angle_pinky  = Vector2.Angle(vector1718, vector1820);

                        if (angle_index <= hand_spread_out_angle && angle_middle <= hand_spread_out_angle &&
                            angle_ring <= hand_spread_out_angle && angle_pinky <= hand_spread_out_angle)
                        {
                            //Debug.Log("finger_spread_out");
                            currShape = handShape.finger_spread_out;
                        }
                        else if (angle_index >= fist_angle && angle_middle >= fist_angle &&
                                 angle_ring >= fist_angle && angle_pinky >= fist_angle)
                        {
                            //Debug.Log("fist");
                            currShape = handShape.fist;
                        }
                        else
                        {
                            // none shape
                            currShape = handShape.none;
                        }
                    }


                    // calculate hand move direction.
                    float diffX = currX - originX;
                    float diffY = currY - originY;
                    if (Mathf.Abs(diffX) > 0.15 || Mathf.Abs(originY - currY) > 0.15)
                    {
                        currState  = handState.move;
                        originX    = currX;
                        originY    = currY;
                        originTime = Time.time;

                        // define which derection it move...
                        // first we just compare diff scale regrad horizontal and vertical...
                        if (Mathf.Pow(diffX, 2) - Mathf.Pow(diffY, 2) > 0)
                        {
                            // x is larger.
                            if (diffX > 0)
                            {
                                currDirection = moveDirection.right;
                            }
                            else
                            {
                                currDirection = moveDirection.left;
                            }
                        }
                        else
                        {
                            if (diffY > 0)
                            {
                                currDirection = moveDirection.down;
                            }
                            else
                            {
                                currDirection = moveDirection.up;
                            }
                        }
                    }
                    string temp = handShapeDirectionMessage + "Gesture=&" + currShape + "Direction=&" + currDirection;
                    MessageMgr.GetIns().Dispatch("HandMessage", temp);
                    Debug.Log(currShape + "  ,  " + currDirection);
                }
            }
        }
        else
        {
            currState = handState.outScreen;
        }
        return(null);
    }
Esempio n. 19
0
 public void Draw(Transform screenTransform, NormalizedLandmarkList poseLandmarkList, Detection poseDetection, bool isFlipped = false)
 {
     poseLandmarkListAnnotation.GetComponent <PoseLandmarkListAnnotationController>().Draw(screenTransform, poseLandmarkList, isFlipped);
     poseDetectionAnnotation.GetComponent <DetectionAnnotationController>().Draw(screenTransform, poseDetection, isFlipped);
 }
 public void Draw(NormalizedLandmarkList target, bool visualizeZ = false, int vertices = 128)
 {
     Draw(target?.Landmark, visualizeZ, vertices);
 }
Esempio n. 21
0
 void OnRightIrisLandmarksOutput(NormalizedLandmarkList rightIrisLandmarks)
 {
     holisticAnnotationController.DrawRightIrisLandmarkListLater(rightIrisLandmarks);
 }
Esempio n. 22
0
 public IrisTrackingValue(List <Detection> faceDetections, NormalizedRect faceRect, NormalizedLandmarkList faceLandmarksWithIris)
 {
     this.faceRect              = faceRect;
     this.faceDetections        = faceDetections;
     this.faceLandmarksWithIris = faceLandmarksWithIris;
 }
Esempio n. 23
0
 void OnFaceLandmarksWithIrisOutput(NormalizedLandmarkList faceLandmarkListWithIris)
 {
     faceLandmarksWithIrisAnnotationController.DrawLater(faceLandmarkListWithIris);
 }
Esempio n. 24
0
 public void DrawLater(NormalizedLandmarkList target)
 {
     UpdateCurrentTarget(target?.Landmark, ref currentTarget);
 }
 public HandTrackingValue(ClassificationList classificationList, NormalizedLandmarkList landmarkList, NormalizedRect rect) :
     this(classificationList, landmarkList, rect, new List <Detection>())
 {
 }
Esempio n. 26
0
 public void DrawFaceLandmarkListLater(NormalizedLandmarkList faceLandmarkList)
 {
     DrawFaceLandmarkListLater(faceLandmarkList?.Landmark);
 }
Esempio n. 27
0
 void OnLeftIrisLandmarksOutput(NormalizedLandmarkList leftIrisLandmarks)
 {
     holisticAnnotationController.DrawLeftIrisLandmarkListLater(leftIrisLandmarks);
 }
Esempio n. 28
0
 public void DrawPoseLandmarkListLater(NormalizedLandmarkList poseLandmarkList)
 {
     DrawPoseLandmarkListLater(poseLandmarkList?.Landmark);
 }
Esempio n. 29
0
 public void Draw(NormalizedLandmarkList targets, bool visualizeZ = true)
 {
     Draw(targets.Landmark, visualizeZ);
 }
Esempio n. 30
0
 public void DrawRightIrisLandmarkListLater(NormalizedLandmarkList rightIrisLandmarkList)
 {
     DrawRightIrisLandmarkListLater(rightIrisLandmarkList?.Landmark);
 }