首页 文章

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

提问于
浏览
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
)

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

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

2 回答

  • 1

    感谢colristter horristic,我得到了一个msdn的链接,提供了一些有用的信息(还要感谢T. Chen在msdn上帮助了解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);
    

    Note: 传感器需要初始化并锁定深度框架以使其工作 .

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

    /// 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开发人员可能不会那么幸运!

相关问题