【发布时间】:2013-04-02 21:54:51
【问题描述】:
我正在使用 Kinect 传感器,我正在尝试对齐深度和颜色帧,以便我可以将它们保存为“适合”彼此的图像。我花了很多时间浏览 msdn 论坛和 Kinect SDK 的简陋文档,但我一无所获。
基于此答案:Kinect: Converting from RGB Coordinates to Depth Coordinates
我有以下函数,其中depthData 和colorData 是从NUI_LOCKED_RECT.pBits 获得的,mappedData 是包含新色框的输出,映射到深度坐标:
bool mapColorFrameToDepthFrame(unsigned char *depthData, unsigned char* colorData, unsigned char* mappedData)
{
INuiCoordinateMapper* coordMapper;
// Get coordinate mapper
m_pSensor->NuiGetCoordinateMapper(&coordMapper);
NUI_DEPTH_IMAGE_POINT* depthPoints = new NUI_DEPTH_IMAGE_POINT[640 * 480];
HRESULT result = coordMapper->MapColorFrameToDepthFrame(NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480, NUI_IMAGE_RESOLUTION_640x480, 640 * 480, reinterpret_cast<NUI_DEPTH_IMAGE_PIXEL*>(depthData), 640 * 480, depthPoints);
if (FAILED(result))
{
return false;
}
int pos = 0;
int* colorRun = reinterpret_cast<int*>(colorData);
int* mappedRun = reinterpret_cast<int*>(mappedData);
// For each pixel of new color frame
for (int i = 0; i < 640 * 480; ++i)
{
// Find the corresponding pixel in original color frame from depthPoints
pos = (depthPoints[i].y * 640) + depthPoints[i].x;
// Set pixel value if it's within frame boundaries
if (pos < 640 * 480)
{
mappedRun[i] = colorRun[pos];
}
}
return true;
}
运行此代码时,我得到的只是一个未更改的颜色框,其中删除了(白色)depthFrame 没有信息的所有像素。
【问题讨论】:
-
您是否查看过 Kinect for Windows 编码示例中的绿屏示例? kinectforwindows.codeplex.com。它对齐颜色和深度。
-
是的,我有。它不使用新的
INuiCoordinateMapper,而是使用旧的方法INuiSensor::NuiImageGetColorPixelCoordinateFrameFromDepthPixelFrameAtResolution。我已经尝试过了,它对我也不起作用(我得到了全白图像)。不知何故,他们得到的深度值数组是 USHORT(16 位)而我的是 32 位,可能的原因是我用不同的参数初始化了我的 Kinect 传感器(只有深度没有玩家索引)。即使我从 32 位创建一个 16 位深度值的数组,该函数对我也不起作用。 -
类似的事情在这里解决了:stackoverflow.com/a/19905805/2521214 Kinect SDK 具有对齐图像的功能,但它们根本不适合我(有一个非常旧版本的 kinect)所以我自己做了.. . 在那个链接中是我的 kinect 校准数据,你必须自己测量
-
@Spektre 这不是一回事,因为那里的视图是由同一个相机拍摄的。无法精确地将 RGB 映射到深度,因为图像是从不同的视点拍摄的,因此甚至可能看不到相同的东西(想象在相机之间夹着一张纸 - 每个相机都会看到纸的另一面并且无论如何都无法与其他视图对齐)。这通过相机校准和重投影解决了“远离相机”的物体,这不是一个简单的问题(但解决起来很有趣)。我建议使用 SDK 中的函数(在下面的帖子中提到)。
-
你找到了一个好的答案吗?
标签: c++ image-processing kinect kinect-sdk