我对Kinect v2和C#进行了一些尝试,试图获得一个512x424像素大小的图像数组,其中包含深度数据以及有关颜色信息(RGBA)。
因此,我使用MultiSourceFrameReader
类接收一个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像素大小的图像,它们却相反。
编辑
我认识到我应该能够通过使用
ColorSpacePoint
-struct获得映射的颜色信息,该结构包含特定颜色像素的X和Y坐标。因此,我设置了点。// 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];
..但我仍然得到错误的颜色。多为白人。
最佳答案
好吧,我自己弄清楚了。该错误是微不足道的。因为该数组不是其中一个条目包含RGBA信息的像素数组,而是一个字节数组,其中每个条目代表R,G,B或AI,所以必须将索引乘以每像素字节数(在这种情况下为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];