Kinect获取深度图像,并呈如今Plane上

一、建立一个Plane,材质球的属性以下。code

二、先看效果,由于是Plane面板,因此位置是能够随便调整的。orm

二、脚本以下。值得一提的是:此脚本只锁定第一我的,其余人不会被识别和成像。xml

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System;
public class MyDepthView1 : MonoBehaviour
{
    public KinectManager manager;
    private int depthImageWidth;
    private int depthImageHeight;
    public UnityEngine.GameObject objplan;
    private  Texture2D texture;
    ushort[] rawDepthMap;
    //人面对摄像机  先后左右 距离
    private float scope_X_left =  -0.5f;
    private float scope_X_right=0.5f;
    private float scope_Z_bef =0.5f;
    private float scope_Z_aft =1.5f;
    Color[] Depthcolors;// = new Color[512 * 424];
    ////  xml.SaveToFile(name);
    //顺带 显示 彩色图像-----------------------
    Color32[] coltodep;//-----
    private Texture2D textureCol;
    Vector2[] myv2;
    void Start () {
        manager = KinectManager.Instance;
        //-------------------------------------------------
        if (manager && manager.IsInitialized())
        {
            KinectInterop.SensorData sensorData = manager.GetSensorData();
            if (sensorData != null && sensorData.sensorInterface != null)
            {
                //深度图像的宽高
                depthImageWidth = sensorData.depthImageWidth;
                depthImageHeight = sensorData.depthImageHeight;
                //深度图像的每个像素点的颜色
                Depthcolors = new Color[depthImageWidth * depthImageHeight];
                //深度图像每个像素点的坐标
                myv2 = new Vector2[217088]; //深度512*424 = 217088
                //建立一个宽高为512*424具备alpha的纹理的Texture2D
               texture = new Texture2D(depthImageWidth, depthImageHeight, TextureFormat.ARGB32, false);
               texture.wrapMode = TextureWrapMode.Clamp;
               texture.filterMode = FilterMode.Trilinear;
                rawDepthMap = sensorData.depthImage;//深度数据
                }
            }
        }
 private Int64 userID1;
    private Int64 userID2;
    private Int64 userID3;
    private Int64 userID4;
    private Int64 userID5;
    private Int64 userID6;
 // 刚开始找到人吗 
 private bool gbl_zhaodaoL = false;
    //suoding的ID
    private Int64 userID_suoding;
    //
    static public Int64 userID_suodingA;//给别的脚本用
 static public Int64 sd_userID;
 static public Vector3 posPointManLeft;//必定的距离 范围内---
 Vector3 posPointMan1;
 Vector3 posPointMan2;
 Vector3 posPointMan3;
 Vector3 posPointMan4;
 Vector3 posPointMan5;
 Vector3 posPointMan6;

    //人 的 位置
    Vector3 posPointMan1A;
    //------------------------------------------------------------
    //检测范围  锁定  动做触发  移动位置
private int ttt222;
private int myIdesx;
 public ushort myIdesx1;
    void Update () {
     
        if (manager && manager.IsInitialized())
        {
            KinectInterop.SensorData sensorData = manager.GetSensorData();
            if (sensorData != null && sensorData.sensorInterface != null)
            {
                depthImageWidth = sensorData.depthImageWidth;
                depthImageHeight = sensorData.depthImageHeight;
                int pp = -1;
                //------------------------------锁定人物-----------------------------------------
                  // overlay all joints in the skeleton  至少有一个
                if (manager.IsUserDetected())
                {
                    userID1 = manager ? manager.GetUserIdByIndex(0) : 0;
                    userID2 = manager ? manager.GetUserIdByIndex(1) : 0;
                    userID3 = manager ? manager.GetUserIdByIndex(2) : 0;
                    userID4 = manager ? manager.GetUserIdByIndex(3) : 0;
                    userID5 = manager ? manager.GetUserIdByIndex(4) : 0;
                    userID6 = manager ? manager.GetUserIdByIndex(5) : 0;
                    if (gbl_zhaodaoL == false)
                    {
                        if ((userID1 != 0))
                        {
                            posPointMan1 = manager.GetUserPosition(userID1);//-------------------------
                            if ((posPointMan1.z> scope_Z_bef) &&(posPointMan1.z< scope_Z_aft) &&(posPointMan1.x> scope_X_left) &&(posPointMan1.x< scope_X_right))//z 前正  x 左 负 右 正
                            {
                                gbl_zhaodaoL = true;
                                userID_suoding = userID1;
                            }
                        }
                        if ((userID2 != 0))
                        {
                            posPointMan2 = manager.GetUserPosition(userID2);//-------------------------
                            if ((posPointMan2.z > scope_Z_bef) && (posPointMan2.z < scope_Z_aft) && (posPointMan2.x > scope_X_left) && (posPointMan2.x < scope_X_right))//z 前正  x 左 负 右 正
                            {
                                gbl_zhaodaoL = true;
                                userID_suoding = userID2;
                            }
                        }
                        if ((userID3 != 0))
                        {
                            posPointMan3 = manager.GetUserPosition(userID3);//-------------------------
                            if ((posPointMan3.z > scope_Z_bef) && (posPointMan3.z < scope_Z_aft) && (posPointMan3.x > scope_X_left) && (posPointMan3.x < scope_X_right))//z 前正  x 左 负 右 正
                            {
                                gbl_zhaodaoL = true;
                                userID_suoding = userID3;
                            }
                        }
                        if ((userID4 != 0))
                        {
                            posPointMan4 = manager.GetUserPosition(userID4);//-------------------------
                            if ((posPointMan4.z > scope_Z_bef) && (posPointMan4.z < scope_Z_aft) && (posPointMan4.x > scope_X_left) && (posPointMan4.x < scope_X_right))//z 前正  x 左 负 右 正
                            {
                                gbl_zhaodaoL = true;
                                userID_suoding = userID4;
                            }
                        }
                        if ((userID5 != 0))
                        {
                            posPointMan5 = manager.GetUserPosition(userID5);//-------------------------
                            if ((posPointMan5.z > scope_Z_bef) && (posPointMan5.z < scope_Z_aft) && (posPointMan5.x > scope_X_left) && (posPointMan5.x < scope_X_right))//z 前正  x 左 负 右 正
                            {

                                gbl_zhaodaoL = true;
                                userID_suoding = userID5;
                            }
                        }

                        if ((userID6 != 0))
                        {
                            posPointMan6 = manager.GetUserPosition(userID6);//-------------------------
                            if ((posPointMan6.z > scope_Z_bef) && (posPointMan6.z < scope_Z_aft) && (posPointMan6.x > scope_X_left) && (posPointMan6.x < scope_X_right))//z 前正  x 左 负 右 正
                            {
                                gbl_zhaodaoL = true;
                                userID_suoding = userID6;
                            }
                        }
                    }
                    //Vector2 posDepth;
                    if (gbl_zhaodaoL)
                    {
                        posPointManLeft = manager.GetUserPosition(userID_suoding);
                        if ((posPointManLeft.z > scope_Z_bef) && (posPointManLeft.z < scope_Z_aft) && (posPointManLeft.x > scope_X_left) && (posPointManLeft.x < scope_X_right))//z 前正  x 左 负 右 正
                        {
                            //gbl_zhaodaoL = true;
                            //userID_suoding = userID6;
                        }
                        else
                        {
                            gbl_zhaodaoL = false; //找到的离开了区域 从新找
                            userID_suoding = 0;
                        }

                  
                        pp = manager.GetBodyIndexByUserId(userID_suoding);
                        sd_userID = userID_suoding;
                
                    }
                }
                else
                {
                    userID1 =  0;
                    userID2 =  0;
                    userID3 =  0;
                    userID4 =  0;
                    userID5 =  0;
                    userID6 =  0;

                    gbl_zhaodaoL = false; //找到的离开了区域 从新找   摄像机自己都没找到 从新找
                    userID_suoding = 0;
                }
                myIdesx = pp;//锁定人的IDex               
                rawDepthMap = sensorData.depthImage;//深度数据
                for (int i = 0; i < depthImageHeight; i++)
                {
                    for (int k = 0; k < depthImageWidth; k++)
                    {
                        int Didx = depthImageWidth * i + k;
                        //ushort userDepth = sensorData.depthImage[Didx];  //
                        ushort userMap = sensorData.bodyIndexImage[depthImageWidth * i + k];//
                        Depthcolors[depthImageWidth * i + k] = Color.clear;
                        float r = ((float)sensorData.depthImage[depthImageWidth * i + k]) / 8000;
                        float g = ((float)sensorData.depthImage[depthImageWidth * i + k]) / 8000;
                        float b = ((float)sensorData.depthImage[depthImageWidth * i + k]) / 8000;
                        Color tempColor = new Color(r, g, b, 0);//------------透明度 0  其它不显示 只显示人
                        Depthcolors[depthImageWidth * i + k] = tempColor;
                        if(userMap!=255)//小绿人
                        {
                            ttt222 = (int)userMap & 0x07; 
                            if(ttt222==myIdesx) //小绿人
                            {
                                Color tempColor1 = new Color(0, g, 0, 1);
                                Depthcolors[depthImageWidth * i + k] = tempColor1;

                            }
                        }
                    }
                }       
                texture.SetPixels(Depthcolors);
                texture.Apply();
                objplan.GetComponent<MeshRenderer>().material.mainTexture = texture;//能够显示 扣出来的彩色图像  也能够显示深度图像--
                userID_suodingA = userID_suoding;
            }
        }
	}
}