3d 如何在不使用Kinect Window SDK中的Coordinatemapper的情况下将三维骨骼关节映射回二维彩色图像

3d 如何在不使用Kinect Window SDK中的Coordinatemapper的情况下将三维骨骼关节映射回二维彩色图像,3d,kinect-sdk,kinect-v2,camera-projection,3d,Kinect Sdk,Kinect V2,Camera Projection,我想在不使用坐标映射器的情况下,将CameraSpace中的3D骨架映射回Kinect中的2D彩色图像。 我需要从深度相机转换到彩色相机吗 在我看来,骨骼关节是从深度图像中获取的。因此,为了获得彩色图像中的关节位置,我应该经历以下3个步骤: 1) 3D关节位于深度摄影机3D空间,我需要变换到颜色摄影机3D空间(旋转/平移)我不知道如何得到这个变换矩阵 2) 找到彩色摄像机的固有参数(使用matlab校准工具箱)以将3D映射回2D 3) 乘以畸变系数 我在这里发现了一个类似的问题: 然而,关于如何

我想在不使用坐标映射器的情况下,将CameraSpace中的3D骨架映射回Kinect中的2D彩色图像。 我需要从深度相机转换到彩色相机吗

在我看来,骨骼关节是从深度图像中获取的。因此,为了获得彩色图像中的关节位置,我应该经历以下3个步骤:

1) 3D关节位于深度摄影机3D空间,我需要变换到颜色摄影机3D空间(旋转/平移)我不知道如何得到这个变换矩阵

2) 找到彩色摄像机的固有参数(使用matlab校准工具箱)以将3D映射回2D

3) 乘以畸变系数

我在这里发现了一个类似的问题: 然而,关于如何找到转换矩阵来将深度相机映射到彩色相机的问题没有得到回答

编辑: 实施后,我认为彩色2D和深度2D共享相同的3D相机空间(在某些方面,实际上深度和颜色是两个不同的相机-->它们应该有不同的3D相机空间)。因此,我成功地将3D点映射为2D颜色,而无需坐标映射函数(我使用从Matlab工具箱中找到的投影矩阵)3D摄像机空间->投影回2D像素颜色


一开始,我认为3D点在3D深度空间,3D深度和3D颜色空间是不同的。(输入:三维深度空间中的三维点,输出:二维彩色像素),我需要将三维深度摄影机->三维彩色摄影机->投影回二维像素颜色。但是,不需要执行步骤3D depthcamera->3D colorcamera

是的,您绝对需要从深度摄影机空间转换到彩色摄影机空间。Kinect有两个摄像头-红外和RGB以及三个“空间”-摄像头、深度和颜色。深度图像和红外图像共享相同的颜色空间。骨骼关节以3D形式出现在摄影机空间中,因此为了在深度或颜色空间中具有相应的点,需要进行适当的转换(当然,在转换过程中会丢失Z坐标)

有一个很好的理由可以解释为什么坐标映射过程被抽象到API调用后面。它取决于摄像机的FOV(视野)和它们之间的物理距离。每种型号的传感器可能会有所不同。因此,有必要检查特定传感器的这些值。它们是恒定的,所以如果你能保证你的代码只在那个特定的Kinect模型上运行,你就没事了


在此之后,请参阅以下关于您需要进行的计算的帖子:

Hi Levko,您是说深度和红外图像共享相同的“深度”空间而不是颜色空间吗?。实施后,我认为彩色2D和深度2D共享相同的3D相机空间(在某些方面,实际上深度和颜色是两个不同的相机-->它们应该有不同的3D相机空间)。因此,我成功地将3D点映射为2D颜色,而无需坐标映射函数(我使用从Matlab工具箱中找到的投影矩阵)。开始时,我认为3D点位于3D深度空间,我需要更改为3D颜色空间。但似乎没有必要。深度和红外共享相同的“深度”空间。它们由相同的尺寸表示,但是,每个坐标或像素的值将不同。在您的例子中,投影矩阵正在进行坐标映射,而不是Kinect API.Yes中的CoordinateMapper类。我明白你的意思了。总结:Kinect有3个空间:2-2D空间深度和颜色,1-3D空间摄影机空间(真实深度信息)。骨架位于三维空间(真实深度)。如我们所知,要将3D映射回2D,我们需要摄像机的固有矩阵(若我们不想使用坐标映射函数)。