我正在使用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
)
这种方法的工作原理并没有很好的记录。有没有人以前用过它?
我即将自己进行手动校准来计算变换矩阵,所以我很乐意找到解决方案。
答案 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开发人员可能不会那么幸运!