【问题标题】:Kinect: From Color Space to world coordinatesKinect:从色彩空间到世界坐标
【发布时间】:2014-10-27 00:24:17
【问题描述】:

我正在使用来自 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 - 你觉得这样行吗?

【问题讨论】:

  • 为什么NuiTransformDepthImageToSkeleton 不适合你?
  • 我使用颜色进行跟踪。所以我在“rgb 空间”中有 x,y。然后,我使用另一个 sdk 函数:NuiImageGetColorPixelCoordinatesFromDepthPixelAtResolution 将我的深度数据转换为 rgb 空间,以查找相应的深度值。不幸的是,这个函数没有逆函数,所以我没有办法回到深度空间。但是对于 NuiTransformDepthImageToSkeleton 我需要深度空间中的 x,y :(Edit: 或者这实际上只是我的一个误解?当他们在文档中说“深度像素的 x 坐标”时,他们实际上是指x,y 在 RGB 空间中?
  • 对不起,我误会了...我会看到 this question,因为它听起来完全符合您的要求

标签: c++ opencv geometry kinect


【解决方案1】:

检查 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),因此您不能拥有全高清颜色点云。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2015-09-18
    • 1970-01-01
    • 2016-02-06
    • 2018-01-29
    相关资源
    最近更新 更多