C# 和 Kinect v2:获取适合深度像素的 RGB 值
C# and Kinect v2: Get RGB values that fit to depth-pixel
我试了一下 Kinect v2 和 C#,并试图获得一个 512x424 像素大小的图像阵列,其中包含深度数据以及相关的颜色信息 (RGBA)。
因此我使用 MultiSourceFrameReader
class 接收 MultiSourceFrame
,从中我得到了 ColorFrame
和 DepthFrame
。使用方法 ColorFrame.CopyConvertedFrameDataToArray()
和 DepthFrame.CopyFrameDataToArray()
我收到了包含颜色和深度信息的数组:
// Contains 4*1920*1080 entries of color-info: BGRA|BGRA|BGRA..
byte[] cFrameData = new byte[4 * cWidth * cHeight];
cFrame.CopyConvertedFrameDataToArray(cFrameData, ColorImageFormat.Bgra);
// Has 512*424 entries with depth information
ushort[] dFrameData = new ushort[dWidth* dHeight];
dFrame.CopyFrameDataToArray(dFrameData);
现在我必须将 ColorFrame-data-array cFrameData
中的颜色四元组映射到 DepthFrame-data-array dFrameData
的每个条目,但这就是我的位置卡住了。输出应该是一个数组,它是 dFrameData
数组大小的 4 倍 (RGBA/BGRA),并且包含深度帧每个像素的颜色信息:
// Create the array that contains the color information for every depth-pixel
byte[] dColors = new byte[4 * dFrameData.Length];
for (int i = 0, j = 0; i < cFrameData.Length; ++i)
{
// The mapped color index. ---> I'm stuck here:
int colIx = ?;
dColors[j] = cFrameData[colIx]; // B
dColors[j + 1] = cFrameData[colIx + 1]; // G
dColors[j + 2] = cFrameData[colIx + 2]; // R
dColors[j + 3] = cFrameData[colIx + 3]; // A
j += 4;
}
有人有什么建议吗?
我还查看了 Kinect-SDK 的 CoordinateMappingBasics 示例,但他们对我已经开始工作的 1920x1080 像素大小的图像进行了反之亦然。
编辑
我认识到我应该能够通过使用包含特定颜色像素的 X 和 Y 坐标的 ColorSpacePoint
-struct 来获取映射的颜色信息。因此我设置了这样的点..
// Lookup table for color-point information
ColorSpacePoint[] cSpacePoints = new ColorSpacePoint[dWidth * dHeight];
this.kinectSensor.CoordinateMapper.MapDepthFrameToColorSpace(dFrameData, cSpacePoints);
.. 并尝试访问颜色信息,如 ..
int x = (int)(cSpacePoints[i].X + 0.5f);
int y = (int)(cSpacePoints[i].Y + 0.5f);
int ix = x * cWidth + y;
byte r = cFrameData[ix + 2];
byte g = cFrameData[ix + 1];
byte b = cFrameData[ix];
byte a = cFrameData[ix + 3];
..但我仍然得到错误的颜色。大多数是白色的。
嗯,我自己想出来的。这个错误是微不足道的。由于数组不是 pixel-array 其中一个条目包含 RGBA 信息,而是一个字节数组,其中每个条目代表 R、G、B 或 A 我必须将索引乘以 bytes-per-pixel 值,在这种情况下是 4。所以解决方案看起来像:
int ix = (x * cWidth + y) * 4;
byte r = cFrameData[ix + 2];
byte g = cFrameData[ix + 1];
byte b = cFrameData[ix];
byte a = cFrameData[ix + 3];
我试了一下 Kinect v2 和 C#,并试图获得一个 512x424 像素大小的图像阵列,其中包含深度数据以及相关的颜色信息 (RGBA)。
因此我使用 MultiSourceFrameReader
class 接收 MultiSourceFrame
,从中我得到了 ColorFrame
和 DepthFrame
。使用方法 ColorFrame.CopyConvertedFrameDataToArray()
和 DepthFrame.CopyFrameDataToArray()
我收到了包含颜色和深度信息的数组:
// Contains 4*1920*1080 entries of color-info: BGRA|BGRA|BGRA..
byte[] cFrameData = new byte[4 * cWidth * cHeight];
cFrame.CopyConvertedFrameDataToArray(cFrameData, ColorImageFormat.Bgra);
// Has 512*424 entries with depth information
ushort[] dFrameData = new ushort[dWidth* dHeight];
dFrame.CopyFrameDataToArray(dFrameData);
现在我必须将 ColorFrame-data-array cFrameData
中的颜色四元组映射到 DepthFrame-data-array dFrameData
的每个条目,但这就是我的位置卡住了。输出应该是一个数组,它是 dFrameData
数组大小的 4 倍 (RGBA/BGRA),并且包含深度帧每个像素的颜色信息:
// Create the array that contains the color information for every depth-pixel
byte[] dColors = new byte[4 * dFrameData.Length];
for (int i = 0, j = 0; i < cFrameData.Length; ++i)
{
// The mapped color index. ---> I'm stuck here:
int colIx = ?;
dColors[j] = cFrameData[colIx]; // B
dColors[j + 1] = cFrameData[colIx + 1]; // G
dColors[j + 2] = cFrameData[colIx + 2]; // R
dColors[j + 3] = cFrameData[colIx + 3]; // A
j += 4;
}
有人有什么建议吗?
我还查看了 Kinect-SDK 的 CoordinateMappingBasics 示例,但他们对我已经开始工作的 1920x1080 像素大小的图像进行了反之亦然。
编辑
我认识到我应该能够通过使用包含特定颜色像素的 X 和 Y 坐标的 ColorSpacePoint
-struct 来获取映射的颜色信息。因此我设置了这样的点..
// Lookup table for color-point information
ColorSpacePoint[] cSpacePoints = new ColorSpacePoint[dWidth * dHeight];
this.kinectSensor.CoordinateMapper.MapDepthFrameToColorSpace(dFrameData, cSpacePoints);
.. 并尝试访问颜色信息,如 ..
int x = (int)(cSpacePoints[i].X + 0.5f);
int y = (int)(cSpacePoints[i].Y + 0.5f);
int ix = x * cWidth + y;
byte r = cFrameData[ix + 2];
byte g = cFrameData[ix + 1];
byte b = cFrameData[ix];
byte a = cFrameData[ix + 3];
..但我仍然得到错误的颜色。大多数是白色的。
嗯,我自己想出来的。这个错误是微不足道的。由于数组不是 pixel-array 其中一个条目包含 RGBA 信息,而是一个字节数组,其中每个条目代表 R、G、B 或 A 我必须将索引乘以 bytes-per-pixel 值,在这种情况下是 4。所以解决方案看起来像:
int ix = (x * cWidth + y) * 4;
byte r = cFrameData[ix + 2];
byte g = cFrameData[ix + 1];
byte b = cFrameData[ix];
byte a = cFrameData[ix + 3];