Unity显示Kinect深度数据
1.创建显示图形对象
1.1 创建RawImage对象
1.2 创建材质
设置为如下参数,将其设定为unlit-transparent使得透明显示
2. 建立字段
public MultiSourceManager mMultiSource;
public Texture2D mDepthTexture;//深度纹理
//深度数据
private ushort[] mDepthData = null;//MultiSource Manager输出的深度数据内容
private CameraSpacePoint[] mCameraSpacePoint = null;
private ColorSpacePoint[] mColorSpacePoints = null;
//Kinect
private KinectSensor mSensor = null;
private CoordinateMapper mMapper = null;//映射坐标器
//深度数据的分辨率为512*424
private readonly Vector2 mDepthResolution = new Vector2(512, 424);
3. Awake
private void Awake()
{
mSensor = KinectSensor.GetDefault();//获取Kinect传感器
mMapper = mSensor.CoordinateMapper;//获取坐标映射器
int arraySize = (int)(mDepthResolution.x * mDepthResolution.y);//深度数据分辨率
//根据深度数据的分辨率创建新的空间点
mCameraSpacePoint = new CameraSpacePoint[arraySize];
mColorSpacePoints = new ColorSpacePoint[arraySize];
}
4. Update
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))//判断是否按下空格
{
//按下空格则将深度图像映射到彩色空间
DepthToColor();
mDepthTexture = CreateTexture();//获取新纹理
}
}
5.创建新纹理
/// <summary>
/// 创建新纹理
/// </summary>
/// <returns></returns>
private Texture2D CreateTexture()
{
Texture2D newTexture = new Texture2D(1920, 1080, TextureFormat.Alpha8, false);//RGB相机输出的1920*1080像素的图片,alpha8使我们能看到透明的图片
//遍历所有像素点清除初始纹理
for (int x = 0; x < 1920; x++)
{
for (int y = 0; y < 1080; y++)
{
newTexture.SetPixel(x, y, Color.clear);
}
}
//遍历所有像素点为他们设置新的颜色
foreach (ColorSpacePoint point in mColorSpacePoints)//遍历所有像素点为他们设置新的颜色
{
newTexture.SetPixel((int)point.X, (int)point.Y, Color.black);
}
newTexture.Apply();//应用新纹理
return newTexture;
}
6. 深度数据映射到彩色空间
/// <summary>
/// 获取相机空间点和颜色空间点
/// </summary>
private void DepthToColor()
{
//获取深度图像数据,一组数据流
mDepthData = mMultiSource.GetDepthData();
//将图像映射
mMapper.MapDepthFrameToCameraSpace(mDepthData, mCameraSpacePoint);//将深度帧数映射到相机空间点
mMapper.MapDepthFrameToColorSpace(mDepthData, mColorSpacePoints);//深度帧数映射到颜色空间点
}
清除彩色图像后能显示出如下的深度数据。