我正在使用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开发人员可能并不那么幸运!