Unity AzureKinect 初识(二) 姿势识别

2021/02/04 插眼更新: 每次需要多识别一个姿势,需要加好多代码,公开bool值给外部调用,这是很不方便的,直接用委托的方式即可,委托绑定的时候最好放在Start()里,不要放在Awake(),完整代码放最后

效果: (右手过肩1秒之后,识别并打印信息)

1. 添加KinectManager.cs 和 KinectGestureManager.cs

2. 添加 Kinect4AzureInterface.cs

3.添加两个自定义的脚本TintGestureListener.cs ,TintGestureDemo.cs

这个是你需要识别的姿势,例如我只要识别右手举过肩,就写1,再在下面选择Raise Right Hand

如果需要识别多个:

在 TintGestureListener.cs 里面照着这个写法 多公开几个方法,让外部调用


    /// <summary>
    /// 右手举起过肩并保持至少一秒
    /// </summary>
    private bool RaiseRightHand;
    /// <summary>
    /// Determines whether swipe left is detected.
    /// </summary>
    /// <returns><c>true</c> if swipe left is detected; otherwise, <c>false</c>.</returns>
    public bool IsRaiseRightHand()
    {
        if (RaiseRightHand)
        {
            RaiseRightHand = false;
            return true;
        }
        return false;
    }

再在下面,将对应的bool值设置为true 

TintGestureDemo.cs

using UnityEngine;

public class TintGestureDemo : MonoBehaviour
{
    void Update()
    {
        if (TintGestureListener.Instance.IsRaiseRightHand())
        {
            Debug.Log("右手举起过肩并保持至少一秒");
        }
    }
}

TintGestureListener.cs

using com.rfilkov.kinect;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TintGestureListener : MonoBehaviour, GestureListenerInterface
{
    [Tooltip("Index of the player, tracked by this component. 0 means the 1st player, 1 - the 2nd one, 2 - the 3rd one, etc.")]
    public int playerIndex = 0;

    [Tooltip("List of the gestures to detect.")]
    public List<GestureType> detectGestures = new List<GestureType>();


    // 单例
    public static TintGestureListener Instance;
    private void Awake()
    {
        Instance = this;
    }


    /// <summary>
    /// 右手举起过肩并保持至少一秒
    /// </summary>
    private bool RaiseRightHand;
    /// <summary>
    /// Determines whether swipe left is detected.
    /// </summary>
    /// <returns><c>true</c> if swipe left is detected; otherwise, <c>false</c>.</returns>
    public bool IsRaiseRightHand()
    {
        if (RaiseRightHand)
        {
            RaiseRightHand = false;
            return true;
        }
        return false;
    }

    public bool GestureCancelled(ulong userId, int userIndex, GestureType gesture, KinectInterop.JointType joint)
    {
        return true;
    }

    public bool GestureCompleted(ulong userId, int userIndex, GestureType gesture, KinectInterop.JointType joint, Vector3 screenPos)
    {
        if (userIndex != playerIndex)
            return false;

        switch (gesture)
        {
            case GestureType.None:
                break;
            case GestureType.RaiseRightHand:
                // 识别举起右手
                RaiseRightHand = true;
                break;
            case GestureType.RaiseLeftHand:
                break;
            case GestureType.Psi:
                break;
            case GestureType.Tpose:
                break;
            case GestureType.Stop:
                break;
            case GestureType.Wave:
                break;
            case GestureType.SwipeLeft:
                break;
            case GestureType.SwipeRight:
                break;
            case GestureType.SwipeUp:
                break;
            case GestureType.SwipeDown:
                break;
            case GestureType.ZoomIn:
                break;
            case GestureType.ZoomOut:
                break;
            case GestureType.Wheel:
                break;
            case GestureType.Jump:
                break;
            case GestureType.Squat:
                break;
            case GestureType.Push:
                break;
            case GestureType.Pull:
                break;
            case GestureType.ShoulderLeftFront:
                break;
            case GestureType.ShoulderRightFront:
                break;
            case GestureType.LeanLeft:
                break;
            case GestureType.LeanRight:
                break;
            case GestureType.LeanForward:
                break;
            case GestureType.LeanBack:
                break;
            case GestureType.KickLeft:
                break;
            case GestureType.KickRight:
                break;
            case GestureType.Run:
                break;
            case GestureType.RaisedRightHorizontalLeftHand:
                break;
            case GestureType.RaisedLeftHorizontalRightHand:
                break;
            case GestureType.TouchRightElbow:
                break;
            case GestureType.TouchLeftElbow:
                break;
            case GestureType.MoveLeft:
                break;
            case GestureType.MoveRight:
                break;
            case GestureType.Apose:
                break;
            case GestureType.UserGesture1:
                break;
            case GestureType.UserGesture2:
                break;
            case GestureType.UserGesture3:
                break;
            case GestureType.UserGesture4:
                break;
            case GestureType.UserGesture5:
                break;
            case GestureType.UserGesture6:
                break;
            case GestureType.UserGesture7:
                break;
            case GestureType.UserGesture8:
                break;
            case GestureType.UserGesture9:
                break;
            case GestureType.UserGesture10:
                break;
            default:
                break;
        }
        return true;
    }

    public void GestureInProgress(ulong userId, int userIndex, GestureType gesture, float progress, KinectInterop.JointType joint, Vector3 screenPos)
    {
      
    }

    public void UserDetected(ulong userId, int userIndex)
    {
        if (userIndex == playerIndex)
        {
            // as an example - detect these user specific gestures
            KinectGestureManager gestureManager = KinectManager.Instance.gestureManager;

            // 识别所有姿势
            foreach (GestureType gesture in detectGestures)
            {
                gestureManager.DetectGesture(userId, gesture);
            }
        }
    }

    public void UserLost(ulong userId, int userIndex)
    {
        if (userIndex != playerIndex)
            return;
    }

   
}

2020/02/04 代码更新:

调用示例:

using com.rfilkov.kinect;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TintGestureListener : MonoBehaviour, GestureListenerInterface
{
    [Tooltip("Index of the player, tracked by this component. 0 means the 1st player, 1 - the 2nd one, 2 - the 3rd one, etc.")]
    public int playerIndex = 0;

    [Tooltip("List of the gestures to detect.")]
    public List<GestureType> detectGestures = new List<GestureType>();


    // 单例
    public static TintGestureListener Instance;
    private void Awake()
    {
        Instance = this;
    }

    public bool GestureCancelled(ulong userId, int userIndex, GestureType gesture, KinectInterop.JointType joint)
    {
        return true;
    }

    public Action RaiseRightHandAction;
    public Action RaiseLeftHandAction;
    public Action SwipeLeftAction;
    public bool GestureCompleted(ulong userId, int userIndex, GestureType gesture, KinectInterop.JointType joint, Vector3 screenPos)
    {
        if (userIndex != playerIndex)
            return false;

        switch (gesture)
        {
            case GestureType.None:
                break;
            case GestureType.RaiseRightHand:
                // 识别举起右手
                RaiseRightHandAction?.Invoke();
                break;
            case GestureType.RaiseLeftHand:
                // 识别举起左手
                RaiseLeftHandAction?.Invoke();
                break;
            case GestureType.Psi:
                break;
            case GestureType.Tpose:
                break;
            case GestureType.Stop:
                break;
            case GestureType.Wave:
                break;
            case GestureType.SwipeLeft:
                SwipeLeftAction?.Invoke();
                break;
            case GestureType.SwipeRight:
                break;
            case GestureType.SwipeUp:
                break;
            case GestureType.SwipeDown:
                break;
            case GestureType.ZoomIn:
                break;
            case GestureType.ZoomOut:
                break;
            case GestureType.Wheel:
                break;
            case GestureType.Jump:
                break;
            case GestureType.Squat:
                break;
            case GestureType.Push:
                break;
            case GestureType.Pull:
                break;
            case GestureType.ShoulderLeftFront:
                break;
            case GestureType.ShoulderRightFront:
                break;
            case GestureType.LeanLeft:
                break;
            case GestureType.LeanRight:
                break;
            case GestureType.LeanForward:
                break;
            case GestureType.LeanBack:
                break;
            case GestureType.KickLeft:
                break;
            case GestureType.KickRight:
                break;
            case GestureType.Run:
                break;
            case GestureType.RaisedRightHorizontalLeftHand:
                break;
            case GestureType.RaisedLeftHorizontalRightHand:
                break;
            case GestureType.TouchRightElbow:
                break;
            case GestureType.TouchLeftElbow:
                break;
            case GestureType.MoveLeft:
                break;
            case GestureType.MoveRight:
                break;
            case GestureType.Apose:
                break;
            case GestureType.UserGesture1:
                break;
            case GestureType.UserGesture2:
                break;
            case GestureType.UserGesture3:
                break;
            case GestureType.UserGesture4:
                break;
            case GestureType.UserGesture5:
                break;
            case GestureType.UserGesture6:
                break;
            case GestureType.UserGesture7:
                break;
            case GestureType.UserGesture8:
                break;
            case GestureType.UserGesture9:
                break;
            case GestureType.UserGesture10:
                break;
            default:
                break;
        }
        return true;
    }

    public void GestureInProgress(ulong userId, int userIndex, GestureType gesture, float progress, KinectInterop.JointType joint, Vector3 screenPos)
    {
      
    }

    public void UserDetected(ulong userId, int userIndex)
    {
        if (userIndex == playerIndex)
        {
            // as an example - detect these user specific gestures
            KinectGestureManager gestureManager = KinectManager.Instance.gestureManager;

            // 识别所有姿势
            foreach (GestureType gesture in detectGestures)
            {
                gestureManager.DetectGesture(userId, gesture);
            }
        }
    }

    public void UserLost(ulong userId, int userIndex)
    {
        if (userIndex != playerIndex)
            return;
    }

   
}

猜你喜欢

转载自blog.csdn.net/qq_39097425/article/details/113179719