kinect笔记 二、识别手势(全身/姿势)

在unity中使用kinect识别手势等,我在这里用的是卡耐基梅隆的插件

网址  https://pan.baidu.com/s/19XbE7CLA64c1K6jrK9wf9g  密码 e4uw  或  链接:https://pan.baidu.com/s/10hC2mubXOrlpm6FD0ZjF4A 密码:odei

借鉴  https://www.cnblogs.com/Zackzhang/p/6203379.html

在场景中创建一个空物体,命名为KinectManager,给这个物体绑定上 KinectManager 和 KinectGestures脚本

再新建一个空物体,命名为MyGestureListener,新建一个脚本MyGestureListener.cs。这个脚本需要继承MonoBehaviour类并且实现KinectGestures.GestureListenerInterface接口。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class MyGestureListener : MonoBehaviour,KinectGestures.GestureListenerInterface {

    [Tooltip("由该组件跟踪的播放器索引。0代表第一人,1人,第二人,2人,第三人,等等。")]
    public int playerIndex = 0;

    [Tooltip("Text 用于显示监听到的手势动作的信息")]
    public Text gestureInfo;

    //跟踪进程消息是否已显示的内部变量
    private bool progressDisplayed;
    private float progressGestureTime;

    //是否检测到需要的手势
    private bool swipeLeft;
    private bool swipeRight;
    private bool swipeUp;

    /// <summary>
    /// UDP客户端
    /// </summary>
    public UDPClient udpClient;

    /// <summary>
    /// 当检测到新用户时调用。在这里,可以通过调用KinectManager.DetectGesture()来开始手势跟踪。
    /// </summary>
    /// <param name="userId">User ID</param>
    /// <param name="userIndex">User index</param>
    public void UserDetected(long userId, int userIndex)
    {
        // 只允许主要用户使用手势
        KinectManager manager = KinectManager.Instance;
        if (!manager || (userIndex != playerIndex))
            return;

        // 检测这些用户特定的手势
        manager.DetectGesture(userId, KinectGestures.Gestures.SwipeLeft);
        manager.DetectGesture(userId, KinectGestures.Gestures.SwipeRight);
        manager.DetectGesture(userId, KinectGestures.Gestures.SwipeUp);

        /*manager.DetectGesture(userId, KinectGestures.Gestures.RaiseLeftHand);
        manager.DetectGesture(userId, KinectGestures.Gestures.RaiseRightHand);*/
        /*manager.DetectGesture(userId, KinectGestures.Gestures.Pull);
        manager.DetectGesture(userId, KinectGestures.Gestures.Push);*/
        //manager.DetectGesture(userId, KinectGestures.Gestures.SwipeDown);


        // manager.DetectGesture(userId, KinectGestures.Gestures.Wave);//极少触发

        //ing中
        //manager.DetectGesture(userId, KinectGestures.Gestures.Wheel);
        manager.DetectGesture(userId, KinectGestures.Gestures.ZoomIn);
        manager.DetectGesture(userId, KinectGestures.Gestures.Tpose);
        //manager.DetectGesture(userId, KinectGestures.Gestures.ZoomOut);

        //未测出
        //manager.DetectGesture(userId, KinectGestures.Gestures.RaisedLeftHorizontalRightHand);
        //manager.DetectGesture(userId, KinectGestures.Gestures.RaisedRightHorizontalLeftHand);

        if (gestureInfo != null)
        {
            //gestureInfo.text = "Swipe left, right or up to change the slides.";
            gestureInfo.text = "向左、向右或向上滑动,以更改信息。";
            
        }
    }
    
    /// <summary>
    /// 当用户丢失时调用。此用户的所有跟踪手势都会自动清除
    /// </summary>
    /// <param name="userId">User ID</param>
    /// <param name="userIndex">User index</param>
    public void UserLost(long userId, int userIndex)
    {
        // 只允许主要用户使用手势
        if (userIndex != playerIndex)
            return;

        if (gestureInfo != null)
        {
            gestureInfo.text = string.Empty;
        }
    }
    /// <summary>
    /// 当手势正在进行时调用
    /// </summary>
    /// <param name="userId">User ID</param>
    /// <param name="userIndex">User index</param>
    /// <param name="gesture">Gesture type</param>
    /// <param name="progress">Gesture progress [0..1]</param>
    /// <param name="joint">Joint type</param>
    /// <param name="screenPos">Normalized viewport position</param>
    public void GestureInProgress(long userId, int userIndex, KinectGestures.Gestures gesture,
                                  float progress, KinectInterop.JointType joint, Vector3 screenPos)
    {
        // 只允许主要用户使用手势
        if (userIndex != playerIndex)
            return;
        /*Debug.Log("ing");
        Debug.Log(gesture);
        Debug.Log("----ing----");*/
        if ((gesture == KinectGestures.Gestures.ZoomOut || gesture == KinectGestures.Gestures.ZoomIn) && progress > 0.5f)
        {
            if (gestureInfo != null)
            {
                string sGestureText = string.Format("{0} - {1:F0}%", gesture, screenPos.z * 100f);
                gestureInfo.text = sGestureText;

                progressDisplayed = true;
                progressGestureTime = Time.realtimeSinceStartup;
            }
            /*if(gesture == KinectGestures.Gestures.ZoomOut)
            {
                udpClient.SocketSend("fangDa");
            }
            //Debug.Log(gesture);
            if (gesture == KinectGestures.Gestures.ZoomIn)
            {
                udpClient.SocketSend("suoXiao");
            }*/
            if (gesture == KinectGestures.Gestures.ZoomIn && progress > 0.6f)
            {
                Debug.Log("缩小");
                //udpClient.SocketSend("suoXiao");
            }


        }
        else if ((gesture == KinectGestures.Gestures.Wheel || gesture == KinectGestures.Gestures.LeanLeft ||
                 gesture == KinectGestures.Gestures.LeanRight) && progress > 0.5f)
        {
            if (gestureInfo != null)
            {
                string sGestureText = string.Format("{0} - {1:F0} degrees", gesture, screenPos.z);
                gestureInfo.text = sGestureText;

                progressDisplayed = true;
                progressGestureTime = Time.realtimeSinceStartup;

            }

        }
        else if (gesture == KinectGestures.Gestures.Run && progress > 0.5f)
        {
            if (gestureInfo != null)
            {
                string sGestureText = string.Format("{0} - progress: {1:F0}%", gesture, progress * 100);
                gestureInfo.text = sGestureText;

                progressDisplayed = true;
                progressGestureTime = Time.realtimeSinceStartup;
            }
        }
        if (gesture == KinectGestures.Gestures.Tpose)
        {
            Debug.Log("放大");
            //udpClient.SocketSend("fangDa");
        }
    }
    /// <summary>
    /// 如果手势完成,则调用。
    /// </summary>
    /// <returns>true</returns>
    /// <c>false</c>
    /// <param name="userId">User ID</param>
    /// <param name="userIndex">User index</param>
    /// <param name="gesture">Gesture type</param>
    /// <param name="joint">Joint type</param>
    /// <param name="screenPos">Normalized viewport position    标准视口位置</param>
    public bool GestureCompleted(long userId, int userIndex, KinectGestures.Gestures gesture,
                                  KinectInterop.JointType joint, Vector3 screenPos)
    {
        // 只允许主要用户使用手势
        if (userIndex != playerIndex)
            return false;

        Debug.Log("complete");
        Debug.Log(gesture);
        Debug.Log("----complete----");
        if (gestureInfo != null)
        {
            string sGestureText = gesture + " detected";
            gestureInfo.text = sGestureText;
        }

        if (gesture == KinectGestures.Gestures.SwipeLeft)
        {
            swipeLeft = true;
            //udpClient.SocketSend(gesture.ToString());
            //udpClient.SocketSend("xiangZuo");
        }
        else if (gesture == KinectGestures.Gestures.SwipeRight)
        {
            swipeRight = true;
            //udpClient.SocketSend(gesture.ToString());
            //udpClient.SocketSend("xiangYou");
        }
        else if (gesture == KinectGestures.Gestures.SwipeUp)
        {
            swipeUp = true;
            //udpClient.SocketSend(gesture.ToString());
            //udpClient.SocketSend("xiangShang");
        }
        else if(gesture==KinectGestures.Gestures.RaiseLeftHand|| gesture == KinectGestures.Gestures.RaiseRightHand)
        {
            //udpClient.SocketSend("fangDa");
        }

        return true;
    }
    /// <summary>
    /// 如果手势被取消,则调用
    /// </summary>
    /// <returns>true</returns>
    /// <c>false</c>
    /// <param name="userId">User ID</param>
    /// <param name="userIndex">User index</param>
    /// <param name="gesture">Gesture type</param>
    /// <param name="joint">Joint type</param>
    public bool GestureCancelled(long userId, int userIndex, KinectGestures.Gestures gesture,
                                  KinectInterop.JointType joint)
    {
        // 只允许主要用户使用手势
        if (userIndex != playerIndex)
            return false;

        if (progressDisplayed)
        {
            progressDisplayed = false;

            if (gestureInfo != null)
            {
                gestureInfo.text = String.Empty;
            }
        }

        return true;
    }
    // Update is called once per frame
    void Update () {
        
    }
}
原文地址:https://www.cnblogs.com/lingLuoChengMi/p/9647177.html