开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

问答求助

关注:404

当前位置:游戏蛮牛 技术专区 问答求助

_____________________________________________________________________________________________________________
问答求助版块规则:

  1、问题尽量描述清楚
      2、代码要放在代码块里
      3、附件最好放到云盘,然后把链接放到TXT文档里,上传TXT文档。【最好没有附件,你懂得】
      4、本版块回复不得无意义,如:顶、呵呵、不错......以及擦边!【真的会扣分的哦】严重者,封IP!
      5、问题得到解决,请选择最佳答案。
      6、若问题是你自己解决了,可以联系管理员,返还蛮牛币,写下你的答案,另有蛮牛币奖赏。
_____________________________________________________________________________________________________________
查看: 516|回复: 14

[脚本] 想请问下kinect v2.9的动作识别问题

[复制链接]  [移动端链接]
5熟悉之中
509/1000
排名
4549
昨日变化
1

5

主题

67

帖子

509

积分

Rank: 5Rank: 5

UID
164216
好友
0
蛮牛币
1070
威望
0
注册时间
2016-8-25
在线时间
233 小时
最后登录
2017-3-25
发表于 2016-12-12 12:15:05 | 显示全部楼层 |阅读模式
20蛮牛币
    是个新手 最近要求让我做一些kinect的改动,所以来请教大家。

在kinect的KinectFittingRoom1 这个试衣间场景中 playerCalibrationPose 这个属性可以识别到玩家做出一定动作然后给玩家套上衣服这个功能,是kinect设定好的21个动作,但是同时只能识别一个,我多加了几个公共的playerCalibrationPose然后做出相应动作 只有第一个动作可以识别,那如果想要同时识别不同的动作应该怎么办?
还有就是这个场景的运行是怎么样的?做出相应动作之后,然后是哪个方法判断返回的值 之后添加的衣服? 因为KinectManager这个脚本太长了 我看着看着就看懵了因为因为是新手 所以理解能力实在有限,想请大家帮个忙。 谢谢

回复

使用道具 举报

4四处流浪
324/500
排名
6162
昨日变化
3

1

主题

82

帖子

324

积分

Rank: 4

UID
144935
好友
1
蛮牛币
519
威望
0
注册时间
2016-4-9
在线时间
103 小时
最后登录
2017-3-3
发表于 2016-12-12 12:15:06 | 显示全部楼层
using UnityEngine;
using System.Collections;
using System;
using Windows.Kinect;

public class GestureListener : MonoBehaviour, KinectGestures.GestureListenerInterface
{
        // GUI Text to display the gesture messages.
        public GUIText GestureInfo;
       
        private bool swipeLeft;
        private bool swipeRight;
        private bool swipeUp;
        private bool swipeDown;
       
       
        public bool IsSwipeLeft()
        {
                if(swipeLeft)
                {
                        swipeLeft = false;
                        return true;
                }
               
                return false;
        }
       
        public bool IsSwipeRight()
        {
                if(swipeRight)
                {
                        swipeRight = false;
                        return true;
                }
               
                return false;
        }
       
        public bool IsSwipeUp()
        {
                if(swipeUp)
                {
                        swipeUp = false;
                        return true;
                }
               
                return false;
        }
       
        public bool IsSwipeDown()
        {
                if(swipeDown)
                {
                        swipeDown = false;
                        return true;
                }
               
                return false;
        }
       

        public void UserDetected(long userId, int userIndex)
        {
                // detect these user specific gestures
                KinectManager manager = KinectManager.Instance;
               
        /*        manager.DetectGesture(userId, KinectGestures.Gestures.SwipeLeft);
                manager.DetectGesture(userId, KinectGestures.Gestures.SwipeRight);*/
//                manager.DetectGesture(userId, KinectGestures.Gestures.SwipeUp);
//                manager.DetectGesture(userId, KinectGestures.Gestures.SwipeDown);
               
                if(GestureInfo != null)
                {
                        GestureInfo.GetComponent<GUIText>().text = "Swipe left or right to change the slides.";
                }
        }
       
        public void UserLost(long userId, int userIndex)
        {
                if(GestureInfo != null)
                {
                        GestureInfo.GetComponent<GUIText>().text = string.Empty;
                }
        }

        public void GestureInProgress(long userId, int userIndex, KinectGestures.Gestures gesture,
                                                                  float progress, JointType joint, Vector3 screenPos)
        {
                // don't do anything here
        }

        public bool GestureCompleted (long userId, int userIndex, KinectGestures.Gestures gesture,
                                      JointType joint, Vector3 screenPos)
        {
                string sGestureText = gesture + " detected";
                if(GestureInfo != null)
                {
                        GestureInfo.GetComponent<GUIText>().text = sGestureText;
                }
               
                if(gesture == KinectGestures.Gestures.SwipeLeft)
                        swipeLeft = true;
                else if(gesture == KinectGestures.Gestures.SwipeRight)
                        swipeRight = true;
                else if(gesture == KinectGestures.Gestures.SwipeUp)
                        swipeUp = true;
                else if(gesture == KinectGestures.Gestures.SwipeDown)
                        swipeDown = true;
               
                return true;
        }

        public bool GestureCancelled (long userId, int userIndex, KinectGestures.Gestures gesture,
                                      JointType joint)
        {
                // don't do anything here, just reset the gesture state
                return true;
        }
       
}
你里面应该有GestureListener.CS这个脚本,如果没有可以使用这个(已经贴出),里面的动作替换成你想用的。需要添加到KinectManager所在的对象上。(应该是有的,你找找看,如果找不到就按照上面的写法写就好了)

回复

使用道具 举报

4四处流浪
324/500
排名
6162
昨日变化
3

1

主题

82

帖子

324

积分

Rank: 4

UID
144935
好友
1
蛮牛币
519
威望
0
注册时间
2016-4-9
在线时间
103 小时
最后登录
2017-3-3
发表于 2016-12-13 08:26:59 | 显示全部楼层
KinectGestures.cs        在Gestures中定义姿势
        在CheckForGesture()中实现姿势
GestureListener.cs        UserDetected 设置要被检测的姿势
        GestureCompleted()是否检测到对应的姿势
KinectManager.cs        包含GestureListener.cs(引用)
        包含GUIText 显示正在进行的行为
知道这些就可以自定义,检测姿势。当然需要你把代码浏览一遍;否则功能实现流程不熟悉。

回复

使用道具 举报

5熟悉之中
509/1000
排名
4549
昨日变化
1

5

主题

67

帖子

509

积分

Rank: 5Rank: 5

UID
164216
好友
0
蛮牛币
1070
威望
0
注册时间
2016-8-25
在线时间
233 小时
最后登录
2017-3-25
 楼主| 发表于 2016-12-13 09:45:19 | 显示全部楼层
@峰 发表于 2016-12-13 08:26
KinectGestures.cs        在Gestures中定义姿势
        在CheckForGesture()中实现姿势
GestureListener.cs        UserDetecte ...

在kinect里有个试衣间的示例场景 可以选择动作进行识别 但是它只可以同时选择识别一种姿势,如果我想让它多 识别几个姿势应该怎么做?

回复

使用道具 举报

4四处流浪
324/500
排名
6162
昨日变化
3

1

主题

82

帖子

324

积分

Rank: 4

UID
144935
好友
1
蛮牛币
519
威望
0
注册时间
2016-4-9
在线时间
103 小时
最后登录
2017-3-3
发表于 2016-12-13 11:17:15 | 显示全部楼层
姿势识别通常是在0.7s内完成的(默认情况),Kinect 的识别其实就是关节位置的识别;
1.在KinectGestures.Cs中定义姿势,你可以把姿势定义成一系列的片段(Kinect 在姿势识别时,能取得所有关节的位置,也就是你说的姿势的数据)。
它是在(采样时间内)通过对取得的姿势数据做对比,而确定姿势的。
2.如果想完成一系列动作,需要做个识别顺序判断。

回复

使用道具 举报

5熟悉之中
509/1000
排名
4549
昨日变化
1

5

主题

67

帖子

509

积分

Rank: 5Rank: 5

UID
164216
好友
0
蛮牛币
1070
威望
0
注册时间
2016-8-25
在线时间
233 小时
最后登录
2017-3-25
 楼主| 发表于 2016-12-13 11:24:03 | 显示全部楼层
@峰 发表于 2016-12-13 11:17
姿势识别通常是在0.7s内完成的(默认情况),Kinect 的识别其实就是关节位置的识别;
1.在KinectGestures.C ...

识别顺序判断? 就是我做完一个姿势之后 才能进行下一个姿势是吧?那这个应该怎么写呢?也是在KinectManager里面进行修改吗? 方便加一下您的QQ吗?

回复

使用道具 举报

4四处流浪
324/500
排名
6162
昨日变化
3

1

主题

82

帖子

324

积分

Rank: 4

UID
144935
好友
1
蛮牛币
519
威望
0
注册时间
2016-4-9
在线时间
103 小时
最后登录
2017-3-3
发表于 2016-12-13 13:05:43 | 显示全部楼层
识别顺序不需要在KinectManager中写,根据需要写个bool列表记录姿势的完成情况就行。

回复

使用道具 举报

5熟悉之中
509/1000
排名
4549
昨日变化
1

5

主题

67

帖子

509

积分

Rank: 5Rank: 5

UID
164216
好友
0
蛮牛币
1070
威望
0
注册时间
2016-8-25
在线时间
233 小时
最后登录
2017-3-25
 楼主| 发表于 2016-12-13 14:21:30 | 显示全部楼层
@峰 发表于 2016-12-13 13:05
识别顺序不需要在KinectManager中写,根据需要写个bool列表记录姿势的完成情况就行。 ...

是应该怎么写?不在场景里面 自己新建一个场景然后挂上KinectManager 然后进行判断吗? KinectManager这个脚本太长了 有些地方都没看懂 所以不太清楚应该怎么进行配合

回复

使用道具 举报

5熟悉之中
509/1000
排名
4549
昨日变化
1

5

主题

67

帖子

509

积分

Rank: 5Rank: 5

UID
164216
好友
0
蛮牛币
1070
威望
0
注册时间
2016-8-25
在线时间
233 小时
最后登录
2017-3-25
 楼主| 发表于 2016-12-13 15:30:11 | 显示全部楼层
@峰 发表于 2016-12-13 15:14
using UnityEngine;
using System.Collections;
using System;

好的 谢谢,这个脚本是可以识别不同动作 然后获取反馈的吗? 先不说自定义什么姿势 就说Tpose跟举高右手这俩 我现在就想让在摄像头识别到人物之后 如果做出这俩相应的动作 那么就可以在Debug.Log里输出出来,可是我不知道应该怎么写。因为不知道当kinect识别到动作之后的流程..

回复

使用道具 举报

4四处流浪
324/500
排名
6162
昨日变化
3

1

主题

82

帖子

324

积分

Rank: 4

UID
144935
好友
1
蛮牛币
519
威望
0
注册时间
2016-4-9
在线时间
103 小时
最后登录
2017-3-3
发表于 2016-12-13 16:09:26 | 显示全部楼层
UserDetected,GestureCompleted把函数中对应的姿势换成你要检测的姿势,根据文件头对布尔变量的获取:IsSwipeDown()的到对应的检测是否完成;虽然简单,但是还是需要你了解下kinectManager.CS的整个流程,慢慢分析下代码,比较核心的功能都有。

回复

使用道具 举报

5熟悉之中
509/1000
排名
4549
昨日变化
1

5

主题

67

帖子

509

积分

Rank: 5Rank: 5

UID
164216
好友
0
蛮牛币
1070
威望
0
注册时间
2016-8-25
在线时间
233 小时
最后登录
2017-3-25
 楼主| 发表于 2016-12-13 16:21:01 | 显示全部楼层
@峰 发表于 2016-12-13 16:09
UserDetected,GestureCompleted把函数中对应的姿势换成你要检测的姿势,根据文件头对布尔变量的获取:IsS ...

然后这个脚本挂载到KinectManager所在的对象上,通过bool值的判断来进行相应的反馈吗? 那是不是KinectManager脚本中不需要进行修改呢?

回复

使用道具 举报

4四处流浪
324/500
排名
6162
昨日变化
3

1

主题

82

帖子

324

积分

Rank: 4

UID
144935
好友
1
蛮牛币
519
威望
0
注册时间
2016-4-9
在线时间
103 小时
最后登录
2017-3-3
发表于 2016-12-13 16:50:34 | 显示全部楼层
KinectManager 中的脚本,如果不想添加新的姿势,可以不用修改

回复

使用道具 举报

5熟悉之中
509/1000
排名
4549
昨日变化
1

5

主题

67

帖子

509

积分

Rank: 5Rank: 5

UID
164216
好友
0
蛮牛币
1070
威望
0
注册时间
2016-8-25
在线时间
233 小时
最后登录
2017-3-25
 楼主| 发表于 2016-12-13 17:06:30 | 显示全部楼层
@峰 发表于 2016-12-13 16:50
KinectManager 中的脚本,如果不想添加新的姿势,可以不用修改

这个脚本是需要实现GestureListenerInterface接口是吧? 不过少了几个还有就是UserLost参数数量不对 只要按照GestureListenerInterface接口重新写一下就好了是吧?

回复

使用道具 举报

5熟悉之中
509/1000
排名
4549
昨日变化
1

5

主题

67

帖子

509

积分

Rank: 5Rank: 5

UID
164216
好友
0
蛮牛币
1070
威望
0
注册时间
2016-8-25
在线时间
233 小时
最后登录
2017-3-25
 楼主| 发表于 2016-12-13 17:11:06 | 显示全部楼层
@峰 发表于 2016-12-13 16:50
KinectManager 中的脚本,如果不想添加新的姿势,可以不用修改

重新改了一下接口的输出 然后用Debug.Log输出 果然成功了! 谢谢您!这么麻烦的指导我!感谢!

回复

使用道具 举报

4四处流浪
324/500
排名
6162
昨日变化
3

1

主题

82

帖子

324

积分

Rank: 4

UID
144935
好友
1
蛮牛币
519
威望
0
注册时间
2016-4-9
在线时间
103 小时
最后登录
2017-3-3
发表于 2016-12-14 09:31:04 | 显示全部楼层
蛤蛤蛤王 发表于 2016-12-13 17:11
重新改了一下接口的输出 然后用Debug.Log输出 果然成功了! 谢谢您!这么麻烦的指导我!感谢! ...

主要是,有的时候你必须得先熟悉它的流程;这个,有的时候比较耗费时间,但是熟悉核心功能之后,再做修改就容易了。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表