欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Kinect获取彩色图像

程序员文章站 2022-05-13 15:08:03
...

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

实现的功能:人像框可以*的移动。

首先:创建KinectControl,把KinectManager挂载在上边。属性如下:

Kinect获取彩色图像

2、创建一个材质球,Shader如下

Kinect获取彩色图像

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

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;//转换坐标
    public Sprite sprx;
	// Use this for initialization
	void Start () {
        sprx = transform.GetComponent<Sprite>();
        manager = KinectManager.Instance;
        if (manager && manager.IsInitialized())
        {
            KinectInterop.SensorData sensorData = manager.GetSensorData();
            if (sensorData != null && sensorData.sensorInterface != null)
            {
                depthImageWidth = sensorData.depthImageWidth;
                depthImageHeight = sensorData.depthImageHeight;
                deptocol = new Color32[217088];//new 一个  彩色图像的大小2073600   217088  深度
                myv2 = new Vector2[217088];
                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;
            }
          }
	}
}

4、创建一个Plane,把脚本和材质放上去。

Kinect获取彩色图像

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

Kinect获取彩色图像

相关标签: Kinect