Kinect获取彩色图像并成像在Plane面板上。

写此博客的目的:在官方的SDK中KinectBackgroundRemoval1场景是用来抠图的,可是面临着一个问题,若是你想把人像移植到3D场景中,效果就有点不尽人意了。此博客是把彩色图像转换为深度图像。函数

实现的功能:人像框能够自由的移动。code

首先:建立KinectControl,把KinectManager挂载在上边。属性以下:orm

二、建立一个材质球,Shader以下blog

三、建立脚本,脚本是公司大佬写的,我没怎么看懂,只会用。尴尬!索引

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class MyDtoCol : MonoBehaviour {
    public KinectManager manager;
    public int depthImageWidth;
    public int depthImageHeight;
    Color32[] deptocol;
    public Texture2D textureDep; //显示的是彩色图 只有深度图的分辨率
    Vector2[] myv2;//转换坐标
	void Start () {
        manager = KinectManager.Instance;
        if (manager && manager.IsInitialized())
        {
            KinectInterop.SensorData sensorData = manager.GetSensorData();
            if (sensorData != null && sensorData.sensorInterface != null)
            {
                //获取深度宽高 1920*1080
                depthImageWidth = sensorData.depthImageWidth;
                depthImageHeight = sensorData.depthImageHeight;
                //深度值的像素点
                deptocol = new Color32[217088];//new 一个  彩色图像的大小2073600   217088  深度
                //每个像素点的坐标
                myv2 = new Vector2[217088];
                //宽高为512*424的带有aphla的Texture2D;
                textureDep = new Texture2D(depthImageWidth, depthImageHeight, TextureFormat.ARGB32, false);
                textureDep.wrapMode = TextureWrapMode.Clamp;
                textureDep.filterMode = FilterMode.Trilinear;
            }
        }
	}
	void Update () {
          manager = KinectManager.Instance;
          if (manager && manager.IsInitialized())
          {
              KinectInterop.SensorData sensorData = manager.GetSensorData();
              if (sensorData != null && sensorData.sensorInterface != null)
              {
                //关键函数:深度图到彩色图的映射
                manager.MapDepthFrameToColorCoords(ref myv2);
                  for (int i = 0; i < 217088; i++)//深度图的大小
                  {
                    deptocol[i].r = 0;
                    deptocol[i].g = 0;
                    deptocol[i].b = 0;
                    deptocol[i].a = 0;
                    ushort userMap = sensorData.bodyIndexImage[i];
                    if ((userMap != 255))//人的区域  小绿人
                    {
                        Vector2 mv2 = myv2[i];
                        int mdx = (int)Math.Floor(mv2.x);
                        int mdy = (int)Math.Floor(mv2.y);
                        if ((mdx >= 0) && (mdx < 1920) && (mdy >= 0) && (mdy < 1080))
                        {
                            //彩色图 像素索引
                            int Didx = mdy * sensorData.colorImageWidth + mdx; 
                            deptocol[i].r = sensorData.colorImage[(Didx) * 4];
                            deptocol[i].g = sensorData.colorImage[(Didx) * 4 + 1];
                            deptocol[i].b = sensorData.colorImage[(Didx) * 4 + 2];
                            deptocol[i].a = sensorData.colorImage[(Didx) * 4 + 3];
                        }
                    }
                }
                  textureDep.SetPixels32(deptocol);
                  textureDep.Apply();
                gameObject.transform.GetComponent<MeshRenderer>().material.mainTexture = textureDep;

            }
          }	
	}
}

四、建立一个Plane,把脚本和材质放上去。博客

五、运行结果,效果很棒,你值得拥有。it