2

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

由于深度图像和 RGB 图像不对齐,我想找到一种方法将 RGB 图像的坐标转换为深度图像的坐标,因为我想在从中获得的深度图像上使用图像蒙版对 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
)

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

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

4

2 回答 2

2

感谢评论者 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); 
}
于 2012-11-12T21:36:19.800 回答
1

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

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

于 2012-11-12T16:32:42.063 回答