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



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

该方法的工作原理不是很好。有人使用过吗?

我自己要进行手动校准来计算转换矩阵,所以我很高兴解决方案。

多亏了评论员的恐怖,我得到了MSDN的链接,并提供了一些有用的信息(也感谢MSDN的T. Chen Over,感谢您对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); 
}

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

可能这是满足您需求的过度杀伤,我不知道该方法有多快。Xbox Kinect开发人员的该功能的实现非常快,该功能以帧速率在GPU上运行,Windows开发人员可能并不那么幸运!

最新更新