2014-10-27 94 views
5

我使用来自kinect的rgb数据跟踪球。在此之后,我查找相应的深度数据。这两个都很出色。现在我想拥有实际的x,y,z世界坐标(即骨架空间),而不是x_screen,y_screen和depth值。不幸的是,由kinect sdk(http://msdn.microsoft.com/en-us/library/hh973078.aspx)给出的方法不能帮助我。基本上我需要一个函数“NuiImageGetSkeletonCoordinatesFromColorPixel”,但我不存在。所有的功能基本走向相反的方向Kinect:从色彩空间到世界坐标

我知道这大概可以用openNI做,但我不能将其用于其他原因。

有没有做这个工作,我还是我必须做转换自己的功能?如果我必须自己做,我该怎么做?我画了一个小图http://i.imgur.com/ROBJW8Q.png - 你认为这会起作用吗?

+0

为什么['NuiTransformDepthImageToSkeleton'(http://msdn.microsoft.com/en-us/library/jj663871.aspx)不是为你工作? – 2014-10-28 22:15:24

+0

我使用颜色进行跟踪。所以我有x,y在“rgb-space”中。然后,我使用另一个sdk函数将深度数据转换为rgb空间:NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution查找相应的深度值。不幸的是,这个函数没有反转,所以我无法回到深度空间。但对于NuiTransformDepthImageToSkeleton我需要X,Y向纵深空间:( [编辑]:还是这其实只是我的一个误解,当他们说的文档中。“的深度像素的x坐标”,做他们实际上指的是X,Y在RGB空间? – AnonEnginerd 2014-10-29 22:49:15

+1

啊对不起,我误会了...我会看到[这个问题](http://stackoverflow.com/questions/11902593/get-depth-at-color-position-kinect-sdk ),因为它听起来完全像你想要的 – 2014-10-29 23:07:29

回答

3

检查CameraIntrinsics。

typedef struct _CameraIntrinsics 
{ 
    float FocalLengthX; 
    float FocalLengthY; 
    float PrincipalPointX; 
    float PrincipalPointY; 
    float RadialDistortionSecondOrder; 
    float RadialDistortionFourthOrder; 
    float RadialDistortionSixthOrder; 
} CameraIntrinsics; 

你可以从ICoordinateMapper::GetDepthCameraIntrinsics得到它。

然后,在深度空间中的每个像素(u,v,d),你可以通过这样的世界空间坐标:

x = (u - principalPointX)/focalLengthX * d; 
y = (v - principalPointY)/focalLengthY * d; 
z = d; 

对于色彩空间像素,你需要先找到与它关联的深度空间像素,其你应该使用ICoordinateMapper::MapCameraPointTodepthSpace。由于并非所有彩色像素都具有相关的深度像素(1920x1080 vs 512x424),因此您无法使用全高清彩色点云。

相关问题