我正在使用kinect的rgb数据跟踪一个球。在此之后,我查找相应的深度数据。这两项工作都非常出色。现在我想要实际的x,y,z世界坐标(即骨架空间)而不是x_screen,y_screen和深度值。不幸的是,kinect sdk(http://msdn.microsoft.com/en-us/library/hh973078.aspx)给出的方法对我没有帮助。基本上我需要一个函数“NuiImageGetSkeletonCoordinatesFromColorPixel”,但我不存在。所有功能基本上都是相反的方向
我知道这可能是用openNI完成的,但由于其他原因我无法使用它。
是否有一个功能可以为我做这个或者我自己必须进行转换?如果我必须自己做,我该怎么做?我勾勒出一个小图http://i.imgur.com/ROBJW8Q.png - 你认为这会起作用吗?
答案 0 :(得分: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对512x424),因此您无法拥有全高清色点云。