(二)Kinect关节识别

基础:添加KinectManager 组件

1)局部关节获取(参考插件场景KinectOverlayDemo1)

要获取局部某一关节及其位置,添加脚本JointOverlayer即可,通过Tracked joint参数可以分别获取到相关关节位置以及坐标。

2)所有关节获取(参考插件场景KinectOverlayDemo2)

获取所有关节,可用脚本SkeletonOverlayer

也可参考如下代码

   /// <summary>
    /// 通过index获取用户的关节,并在每个关节点放置cube
    /// </summary>
    /// <param name="index"></param>
    private void GetBodyJoints(int index)
    {
        if(GetDetected())
        {
            long userId = kinectManger.GetUserIdByIndex(index);

            int jointsCount = kinectManger.GetJointCount();

            if(!isJointsCreated)
            {
                for (int i = 0; i < jointsCount; i++)
                {
                    joints.Add(Instantiate(jointGo));
                }
                isJointsCreated = true;
            }
            else
            {
                for (int i = 0; i < jointsCount; i++)
                {
                   joints[i].transform.position = kinectManger.GetJointKinectPosition(userId,i);
                   joints[i].name = i.ToString();
                }
            }
        }
    }

3)交互功能(参考插件场景KinectOverlayDemo3)

交互功能即为通过手势实现鼠标点击功能需要InteractionManager以及HandOverlayer脚本,通过HandOverlayer/InteractionManager脚本上的参数带texture的参数来实现抓取松开等样式

如果要把手的位置反应到UI上则需要特殊处理,因为我们获取的手的坐标单位为米,反应到unity中只是为数字(比如左手移动0.2m),但是如果分辨率为1920X1080,则手的移动0.2相对于分辨率来说几乎为零,所以需要通过UICamera.ViewportToWorldPoint来转化一下(或者   UICamera.ViewportToScreenPoint)下述脚本为在JointOverlayer中修改的update部分,通过获取手移动的box(范围),然后通过手实际位置转换成相对坐标,然后转化到实际分辨率下的位置。

    void Update ()
    {
        KinectManager manager = KinectManager.Instance;

        if(manager && manager.IsInitialized() && foregroundCamera)
        {
            //backgroundImage.renderer.material.mainTexture = manager.GetUsersClrTex();
            if(backgroundImage && (backgroundImage.texture == null))
            {
                backgroundImage.texture = manager.GetUsersClrTex();
            }

            // get the background rectangle (use the portrait background, if available)
            Rect backgroundRect = foregroundCamera.pixelRect;
            PortraitBackground portraitBack = PortraitBackground.Instance;

            if(portraitBack && portraitBack.enabled)
            {
                backgroundRect = portraitBack.GetBackgroundRect();
            }

            // overlay the joint
            int iJointIndex = (int)trackedJoint;

            if (manager.IsUserDetected())
            {
                for (int i = 0; i < 6; i++)
                {
                    long userId = manager.GetUserIdByIndex(i);

                    //manager.IsUserTracked(userId);

                    if (manager.IsJointTracked(userId, iJointIndex))
                    {
                        //MainFunController.theController.OnDebug("Joint tracked\r\n" + GetPara(manager));

                        overlayObject.gameObject.SetActive(true);
                        Vector3 rightIboxRightBotBack = Vector3.zero, rightIboxRightTopFront = Vector3.zero, rightHandScreenPos = Vector3.zero;
                        bool isrightIboxValid = false;
                        isrightIboxValid = manager.GetRightHandInteractionBox(userId, ref rightIboxRightBotBack, ref rightIboxRightTopFront, isrightIboxValid);

                        if (isrightIboxValid && manager.GetJointTrackingState(userId, (int)KinectInterop.JointType.HandRight) != KinectInterop.TrackingState.NotTracked)
                        {
                            Vector3 rightHandPos = manager.GetJointPosition(userId, (int)KinectInterop.JointType.HandRight);

                            rightHandScreenPos.x = Mathf.Clamp01((rightHandPos.x - rightIboxRightBotBack.x) / (rightIboxRightTopFront.x - rightIboxRightBotBack.x));
                            rightHandScreenPos.y = Mathf.Clamp01((rightHandPos.y - rightIboxRightBotBack.y) / (rightIboxRightTopFront.y - rightIboxRightBotBack.y));
                            rightHandScreenPos.z = Mathf.Clamp01((rightIboxRightBotBack.z - rightHandPos.z) / (rightIboxRightBotBack.z - rightIboxRightTopFront.z));
                        }

                        Vector3 cursorTargetPos = UICamera.ViewportToWorldPoint(rightHandScreenPos);

                        overlayObject.position = Vector2.Lerp(overlayObject.position, cursorTargetPos, 1f);
                        break;
                    }
                    else
                    {
                        overlayObject.gameObject.SetActive(false);
                        //MainFunController.theController.OnDebug("Joint miss");
                        //isFirstCatch = true;
                        //CollisionEvent.theEvent.OnStop();
                    }
                }
            }
            else
            {
                //debugText.text = "body miss";
            }

        }
    }

注:应用时建议复制此脚本,并修改名称,然后做自己的修改

原文地址:https://www.cnblogs.com/llstart-new0201/p/8976553.html

时间: 2024-10-11 13:22:21

(二)Kinect关节识别的相关文章

iOS 花式二维码生成和二维码识别

iOS 原生的二维码识别非常之棒,反正比 ZXing 和 ZBar 效果都好些,所以以后打算尽量用原生的二维码识别,然后最近把原生的二维码生成也顺便做了一遍,并且在原有基础上加了一些样式参数,封了一个小库方便以后使用. 项目地址:https://github.com/EyreFree/EFQRCode EFQRCode 是一个用 Swift 编写的用来生成和识别二维码的库,它基于系统二维码生成与识别进行开发. 生成:利用输入的水印图/图标等资源生成各种艺术二维码: 识别:识别率比 iOS 原生二

关于viewport引起的微信二维码识别区域偏移的问题讨论与解决

一.问题概述 在开发一个含有二维码的微信页面时,我遇到了这样一个问题:使用iPhone第一次进入该页面时,二维码可以长按识别,但第二次进入时长按无法识别到二维码.安卓机都能识别. 二.我进行了以下尝试: 移除控制进入条件的脚本,即部分第一次第二次,长按不能识别二维码.暂时排除脚本原因. 移除二维码所有样式,发现并不是不能识别到二维码而是识别区域发生了偏移.(图1) 移除所有元素,页面上只留一张二维码,发现识别区域变大.虽然整张图都被识别了但图片外面的区域也会被识别.(图2) 图1 图2阶段性结论

Python zxing 库解析(条形码二维码识别)

各种扫码软件 最近要做个二维码识别的项目,查到二维码识别有好多开源的不开源的软件 http://www.oschina.net/project/tag/238/ Zbar 首先试了一下Zbar,python加载ZBar时各种报错.可能的原因是zbar的dll文件是32位的,而我系统是64位的,所以运行不了.只能自己拿源码编译一个64位的出来,对于我这种伸手党来说自己编译源码是难以接受的,所以就放弃了.后来看到文章说Zbar不能识别倾斜的条形码,而且也不能定位条形码区域. Zxing zbar不可

二维条码识别系统设计原理

首     页 条码控件 条码技术 条码新闻 合作伙伴 联系我们 常见问题 电话:010-84827961 当前位置:条形码控件网 > 条形码控件技术文章 > >正文 二维条码识别系统设计原理 发布时间:2014-10-27 二维条码PDF417中PDF为Portable Data File的缩写,每一个PDF码的储存量可高达1 108字节,若将数字压缩则可存放2 729字节.作为一种新的信息存储和传递技术,PDF417具有成本低.信息可随载体移动.不依赖于数据库和计算机网络.保密防伪性

QRCode - 二维码识别与生成

来源:Yi'mouleng(@丶伊眸冷) 链接:http://t.cn/R40WxcM 前言 有关二维码的介绍,我这里不做过多说明, 可以直接去基维百科查看,附上链接QR code(https://en.wikipedia.org/wiki/QR_code). IOS7之前,开发者进行扫码编程时,一般会借助第三方库.常用的是ZBarSDKa和ZXingObjC,IOS7之后,系统的AVMetadataObject类中,为我们提供了解析二维码的接口.经过测试,使用原生API扫描和处理的效率非常高,

基于opencv3.0和zbar下的条形码与二维码识别

其中对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 2. 利用opencv和Zbar(或者Zxing)对标准的QR二维码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 3. 对非标准条形码,进行定位,然后用Zbar(或者Zxing)解码显示. 4. 对非标准的QR二维码图片,进行定位,然后用Zbar(或者Zx

android 图片二维码识别和保存(二)

续上一篇,开发图片二维码识别功能后,我们对功能进行性能分析内存占用显著提高了,不使用该功能内存占用大约是147M,使用这个功能多次以后,高达203M. 因此对功能进行研究,发现每次生成的图片没有即时的释放,导致内存中的图片不断累积,内存占用不断攀升.因此,需要对图片进行释放,释放的时候需要特别关注的地方有: 1.释放注意图片的状态. 2.注意异常的捕获. 下面就是图片释放的有关代码. /** * 回收bitmap */ public static void recycleBitmap(Bitma

使用zxing二维码识别

1.多二维码识别 (同一张图片中多二维码识别) 直接上代码舒服: 1 /** 2 * Parse multiple qr codes(解析多个二维码) 3 * 4 * @param bufferedImage image 5 * @return QRCode analysis results 6 */ 7 @Override 8 public Result[] analysisQRCodeOfMore(BufferedImage bufferedImage) { 9 QRCodeMultiRea

微信小程序二维码识别

目前市场上二维码识别的软件或者网站越来越多,可是真正方便,无广告的却少之很少. 于是,自己突发奇想做了一个微信二维码识别的小程序. 包含功能: 1.识别二维码 ①普通二维码 ②条形码 ③只是复制解析出来的数据 2.生成二维码 ①只是从粘贴板生成二维码 软件截图: 体验二维码: 以下为主要代码 index.js // pages/main/index.js var QR = require("../../utils/qrcode.js"); Page({ data: { canvasHi