Kinect:从RGB坐标转换为深度坐标

时间:2012-11-08 19:11:40

标签: image image-processing kinect kinect-sdk

我正在使用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
)

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

我即将自己进行手动校准来计算变换矩阵,所以我很乐意找到解决方案。

2 个答案:

答案 0 :(得分:2)

感谢评论员的恐怖主义,我得到了msdn的链接,其中包含一些有用的信息(还要感谢T. Chen在msdn上帮助解决了这个问题)。从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); 
}

答案 1 :(得分:1)

据我所知,MapColorFrameToDepthFrame有效地对RGB图像的每个像素进行坐标系转换,存储转换产生的深度图像坐标以及输出中的结果深度值{{ 1}}数组。该结构的定义如下:http://msdn.microsoft.com/en-us/library/nuiimagecamera.nui_depth_image_point.aspx

然而,这可能对你的需求来说太过分了,我不知道这种方法有多快。 XBOX Kinect开发人员可以非常快速地在GPU上以帧速运行该功能,Windows开发人员可能不会那么幸运!