将投影机-Kinect校准应用于Unity3d相机

问题描述 投票:0回答:3

我正在开发具有多个Kinect V2,投影仪和Unity3D的交互式艺术装置。

因此,我使用了此处描述的技术:https://github.com/genekogan/KinectProjectorToolkit,并在C#中的Unity3D中实现了自己的校准。

校准的结果是带有11个条目的DotNetMatrix。

有了该矩阵,我可以通过以下方法获得3D点的正确映射的2D屏幕位置。

public static Vector2 convertKinectToProjector(Vector3 ksp)
{
    Vector3 kp = new Vector3(ksp.x * 1000, ksp.y * 1000, ksp.z * 1000);
    Vector2 mappedScreenPoint = new Vector2();
    float denom = (float)x.GetElement(8, 0) * kp.x + (float)x.GetElement(9, 0) * kp.y + (float)x.GetElement(10, 0) * kp.z + 1;
    mappedScreenPoint.x = Screen.width * ((float)x.GetElement(0, 0) * kp.x + (float)x.GetElement(1, 0) * kp.y + (float)x.GetElement(2, 0) * kp.z + (float)x.GetElement(3, 0)) / denom;
    mappedScreenPoint.y = Screen.height * ((float)x.GetElement(4, 0) * kp.x + (float)x.GetElement(5, 0) * kp.y + (float)x.GetElement(6, 0) * kp.z + (float)x.GetElement(7, 0)) / denom;

    return mappedScreenPoint;
}

通过该解决方案,我可以在GUI上显示正确映射的纹理和其他内容,但是我也想利用3D空间的优点。

因此,我正在寻找一种将校准纳入Unity3D摄像机的方法。我的目标是,将摄像机看到的所有内容正确地从3D空间映射到屏幕空间。

我已经设置了Unity3D相机。像Kinect相机一样,它具有正确的视场(60)和位置(0,0,0)。因此,如果我从Kinect身体信息中在Unity3D中生成骨骼,则所有事物都将匹配,例如真实世界的大小等。

缺少的部分是校准本身。

我想到了两种解决方案:

相机阴影

更改投影矩阵

是否有一种方法可以实现将3D点转换为2D到着色器的方法,以便它将每个Pixel转换到正确的位置。

或者我可以简单地更改Unity摄像机的投影矩阵吗?Unity3d中的Projection Matrix是主要列中的4 * 4矩阵。我的校准矩阵是11 * 1矩阵,有没有办法从该来源生成4 * 4矩阵?

matrix unity3d shader kinect camera-calibration
3个回答
0
投票

我使用RoomAliveToolkit来获得投影矩阵。我的Unity项目还可以解释数据并更改投影机,以使照相机从其角度进行投影。但是飞鱼ke不适合投影。我问microft家伙,他们给了我一个提示。请注意,kinect使用的是右手坐标系,并且使用左手统一。

我不知道为什么您的矩阵是11 * 1。但是,如果您愿意,我可以支持您。您是否在github或bitbucket上共享您的源代码?


0
投票

您可以基于此untiy reference调整相机投影矩阵


0
投票

骨骼映射的想法非常好。您有新的解决方案吗?

© www.soinside.com 2019 - 2024. All rights reserved.