Kinect获取彩色图像
程序员文章站
2022-05-13 15:08:03
...
写此博客的目的:在官方的SDK中KinectBackgroundRemoval1场景是用来抠图的,但是面临着一个问题,如果你想把人像移植到3D场景中,效果就有点不尽人意了。此博客是把彩色图像转换为深度图像。
实现的功能:人像框可以*的移动。
首先:创建KinectControl,把KinectManager挂载在上边。属性如下:
2、创建一个材质球,Shader如下
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,把脚本和材质放上去。
5、运行结果,效果很棒,你值得拥有。
上一篇: Kinect V2开发(2)从Kinect获取数据
下一篇: Kinect学习(四):提取深度数据