Kinect开发(三)——手势识别

此开发内容,以Kinect for Unity SDK 2.20插件进行开发,插件各版本下载链接SDK2.20  https://download.csdn.net/download/JLX_Sir/21059009

SDK2.19.2https://download.csdn.net/download/JLX_Sir/21070889

SDK2.16.2https://download.csdn.net/download/JLX_Sir/21070879

★开发要点:

1、需添加新脚本,并继承接口GestureListenerInterface、CloudFaceListenerInterface

2、GestureCompleted(long userId, int userIndex, KinectGestures.Gestures gesture, KinectInterop.JointType joint, Vector3 screenPos)方法

     需要在方法中对需要的手势进行注册监听

示例代码:

using System;

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.UI;

using static KinectGestures;

namespace KinectStudy

{

    public class KinectUser : MonoBehaviour, GestureListenerInterface, CloudFaceListenerInterface

    {

        /// <summary>

        /// 背景—摄像头检测到的内容

        /// </summary>

        [SerializeField] private RawImage _kinectImage;

        /// <summary>

        /// 跟踪到的人索引,0为第一个人,1为第一个人

        /// </summary>

        [SerializeField] private int _playerIndex;

        /// <summary>

        /// 上一个用户Id

        /// </summary>

        private long _lastUserId = 0;

        private void Update()

        {

            KinectManager _kinectManager = KinectManager.Instance;

            //检测设备是否可用

            if (_kinectManager && _kinectManager.IsInitialized())

            {

                if (_kinectImage.texture == null)

                {

                    //从设备获取彩色数据

                    Texture2D _kinectPic = (Texture2D)KinectManager.Instance.GetUsersClrTex();

                    //把彩色数据给控件显示

                    _kinectImage.texture = _kinectPic;

                }

                #region 暂时弃用的(测试使用)

                //检测到玩家

                //if (KinectManager.Instance.IsUserDetected())

                //{

                //    //Debug.LogError("检测到玩家信息了");

                //    //获取用户ID

                //    long _userId = KinectManager.Instance.GetPrimaryUserID();

                //    //获取用户离Kinect的距离信息

                //    Vector3 _userPos = KinectManager.Instance.GetUserPosition(_userId);

                //    //Debug.LogError("用户距离Kinect的距离坐标为:" + _userPos);

                //    //获取左手信息

                //    int _jointType = (int)KinectInterop.JointType.HandLeft;

                //    //关节点被追踪到了

                //    if (KinectManager.Instance.IsJointTracked(_userId, _jointType))

                //    {

                //        Vector3 _leftHandlePos = KinectManager.Instance.GetJointKinectPosition(_userId, _jointType);

                //        //获取左手姿势

                //        KinectInterop.HandState _leftHandState = KinectManager.Instance.GetLeftHandState(_userId);

                //        if (_leftHandState == KinectInterop.HandState.Closed)

                //        {

                //            Debug.LogError("检测到左手握拳了");

                //        }

                //        else if (_leftHandState == KinectInterop.HandState.Open)

                //        {

                //            Debug.LogError("检测到左手张开了");

                //        }

                //        else if (_leftHandState == KinectInterop.HandState.Lasso)

                //        {

                //            Debug.LogError("检测到左手Yes手势了");

                //        }

                //    }

                //}

                //else

                //{

                //    Debug.LogError("未检测到玩家");

                //}

                #endregion

                //当前使用者Id

                long _userId = _kinectManager.GetUserIdByIndex(_playerIndex);

                if (_lastUserId != _userId)

                {

                    _lastUserId = _userId;

                }

                if (_userId == 0 && _userId != _lastUserId)

                {

                    _lastUserId = _userId;

                    //检测不到当前用户

                }

            }

            else

            {

                Debug.LogError("没有检测到Kinect设备");

            }

        }

        /// <summary>

        /// 对要检测的姿势进行定义

        /// </summary>

        /// <param name="userId"></param>

        /// <param name="userIndex"></param>

        public void UserDetected(long userId, int userIndex)

        {

            KinectManager _kinectManager = KinectManager.Instance;

            if (!_kinectManager || (userIndex != _playerIndex))

                return;

            //对要检测的手势进行添加监听

            foreach (Gestures _gestures in Enum.GetValues(typeof(Gestures)))

            {

                _kinectManager.DetectGesture(userId, _gestures);

            }

        }

        /// <summary>

        /// 对当前姿势进行识别

        /// </summary>

        /// <param name="userId"></param>

        /// <param name="userIndex"></param>

        /// <param name="gesture"></param>

        /// <param name="joint"></param>

        /// <param name="screenPos"></param>

        /// <returns></returns>

        public bool GestureCompleted(long userId, int userIndex, KinectGestures.Gestures gesture, KinectInterop.JointType joint, Vector3 screenPos)

        {

            if (userIndex != _playerIndex)

                return false;

            switch (gesture)

            {

                case Gestures.None:

                    break;

                case Gestures.RaiseRightHand:

                    ShuntHandSignal.Instance.HandSignalCarryOut(HandSignalType.Signal_Two);

                    break;

                case Gestures.RaiseLeftHand:

                    break;

                case Gestures.Psi:

                    ShuntHandSignal.Instance.HandSignalCarryOut(HandSignalType.Signal_Three);

                    break;

                case Gestures.Tpose:

                    ShuntHandSignal.Instance.HandSignalCarryOut(HandSignalType.Signal_One);

                    break;

                case Gestures.Stop:

                    break;

                case Gestures.Wave:

                    break;

                case Gestures.SwipeLeft:

                    break;

                case Gestures.SwipeRight:

                    break;

                case Gestures.SwipeUp:

                    break;

                case Gestures.SwipeDown:

                    break;

                case Gestures.ZoomIn:

                    break;

                case Gestures.ZoomOut:

                    break;

                case Gestures.Wheel:

                    break;

                case Gestures.Jump:

                    break;

                case Gestures.Squat:

                    break;

                case Gestures.Push:

                    break;

                case Gestures.Pull:

                    break;

                case Gestures.ShoulderLeftFront:

                    break;

                case Gestures.ShoulderRightFront:

                    break;

                case Gestures.LeanLeft:

                    break;

                case Gestures.LeanRight:

                    break;

                case Gestures.LeanForward:

                    break;

                case Gestures.LeanBack:

                    break;

                case Gestures.KickLeft:

                    break;

                case Gestures.KickRight:

                    break;

                case Gestures.Run:

                    break;

                case Gestures.RaisedRightHorizontalLeftHand:

                    break;

                case Gestures.RaisedLeftHorizontalRightHand:

                    break;

                case Gestures.TouchRightElbow:

                    break;

                case Gestures.TouchLeftElbow:

                    break;

                case Gestures.MoveLeft:

                    break;

                case Gestures.MoveRight:

                    break;

                case Gestures.UserGesture1:

                    break;

                case Gestures.UserGesture2:

                    break;

                case Gestures.UserGesture3:

                    break;

                case Gestures.UserGesture4:

                    break;

                case Gestures.UserGesture5:

                    break;

                case Gestures.UserGesture6:

                    break;

                case Gestures.UserGesture7:

                    break;

                case Gestures.UserGesture8:

                    break;

                case Gestures.UserGesture9:

                    break;

                case Gestures.UserGesture10:

                    break;

                default:

                    break;

            }

            return true;

        }

        /// <summary>

        /// 用户丢失

        /// </summary>

        /// <param name="userId"></param>

        /// <param name="userIndex"></param>

        public void UserLost(long userId, int userIndex)

        {

        }

        /// <summary>

        /// 姿势正在进行

        /// </summary>

        /// <param name="userId"></param>

        /// <param name="userIndex"></param>

        /// <param name="gesture"></param>

        /// <param name="progress"></param>

        /// <param name="joint"></param>

        /// <param name="screenPos"></param>

        public void GestureInProgress(long userId, int userIndex, Gestures gesture, float progress, KinectInterop.JointType joint, Vector3 screenPos)

        {

          

        }

        /// <summary>

        /// 当取消激活此方法时

        /// </summary>

        /// <param name="userId"></param>

        /// <param name="userIndex"></param>

        /// <param name="gesture"></param>

        /// <param name="joint"></param>

        /// <returns></returns>

        public bool GestureCancelled(long userId, int userIndex, Gestures gesture, KinectInterop.JointType joint)

        {

            if (userIndex != _playerIndex)

                return false;

            return true;

        }

        public void UserFaceDetected(int userIndex, UserGender gender, float age, float smile)

        {

            if (userIndex != _playerIndex)

                return;

            //后续待写

        }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值