【问题标题】:Kinect: Converting from RGB Coordinates to Depth CoordinatesKinect:从 RGB 坐标转换为深度坐标
【发布时间】:2012-11-08 19:11:40
【问题描述】:

我正在使用 Windows Kinect SDK 从传感器获取深度和 RGB 图像。

由于深度图像和 RGB 图像不对齐,我想找到一种方法将 RGB 图像的坐标转换为深度图像的坐标,因为我想在深度图像上使用图像蒙版 I已经从对 RGB 图像的一些处理中获得。

已经有一种将深度坐标转换为色彩空间坐标的方法:

NuiImageGetColorPixelCoordinatesFromDepthPixel

不幸的是,相反的情况不存在。 INUICoordinateMapper 中只有一个神秘的调用:

HRESULT MapColorFrameToDepthFrame(
     NUI_IMAGE_RESOLUTION eColorResolution,
     NUI_IMAGE_RESOLUTION eDepthResolution,
     DWORD cDepthPixels,
     NUI_DEPTH_IMAGE_PIXEL *pDepthPixels,
     DWORD cDepthPoints,
     NUI_DEPTH_IMAGE_POINT *pDepthPoints
)

这种方法的工作原理并没有很好的记录。有人用过吗?

我即将自己执行手动校准以计算转换矩阵,所以我很高兴有一个解决方案。

【问题讨论】:

  • 我无法帮助您,但您能否详细说明图像不对齐的原因?我以为他们是一样的。有固定的偏移量还是它们的视野不同?
  • 我现在的情况几乎一样。并找到了这个页面。 social.msdn.microsoft.com/Forums/en-US/kinectsdknuiapi/thread/… 我要试试这个。但如果你找到了路,请告诉我。
  • @Marian 存在一定程度的视差误差...如果您查看设备,您可能会注意到两个接收器稍微分开。两个坐标系之间的转换并非一帆风顺。

标签: image image-processing kinect kinect-sdk


【解决方案1】:

感谢 horristic 评论者,我获得了一个包含一些有用信息的 msdn 链接(还要感谢 msdn 的 T. Chen 对 API 的帮助)。摘自 T. Chen 的帖子,下面是执行从 RGB 到深度坐标空间的映射的代码:

INuiCoordinateMapper* pMapper;

mNuiSensor->NuiGetCoordinateMapper(&pMapper);

pMapper->MapColorFrameToDepthFrame(
        NUI_IMAGE_TYPE_COLOR,
        NUI_IMAGE_RESOLUTION_640x480,
        NUI_IMAGE_RESOLUTION_640x480,
        640 * 480, 
        (NUI_DEPTH_IMAGE_PIXEL*)LockedRect.pBits,
        640 * 480, 
        depthPoints);

注意:需要初始化传感器并锁定深度框架才能使其工作。

转换后的坐标可以,例如,如下查询:

/// transform RGB coordinate point to a depth coordinate point 
cv::Point TransformRGBtoDepthCoords(cv::Point rgb_coords, NUI_DEPTH_IMAGE_POINT *    depthPoints)
{
    long index = rgb_coords.y * 640 + rgb_coords.x;
    NUI_DEPTH_IMAGE_POINT depthPointAtIndex = depthPoints[index];
    return cv::Point(depthPointAtIndex.x, depthPointAtIndex.y); 
}

【讨论】:

    【解决方案2】:

    据我所知,MapColorFrameToDepthFrame 有效地在 RGB 图像的每个像素上运行坐标系统转换,将转换产生的深度图像坐标和生成的深度值存储在输出 NUI_DEPTH_IMAGE_POINT 数组中.该结构的定义在这里:http://msdn.microsoft.com/en-us/library/nuiimagecamera.nui_depth_image_point.aspx

    但是,这可能对您的需求来说有点过头了,而且我不知道这种方法有多快。 XBOX Kinect 开发人员有一个非常快速的实现该功能,在 GPU 上以帧速率运行,Windows 开发人员可能就没那么幸运了!

    【讨论】:

    • 在Windows 7上性能似乎完全没有受到影响。但是,我不知道GPU是否正在使用。
    • @Koffiman 很高兴知道。我很确定早期的 SDK 版本根本没有 GPU 加速,但我想最近的版本很有可能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 1970-01-01
    • 2013-07-30
    • 2015-09-18
    • 1970-01-01
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多