Я немного поиграл с Kinect v2 и С# и попытался получить массив изображений размером 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-массива данных cFrameData
каждый из записей в DepthFrame-данных массив dFrameData
но где я застрял. Выходом должен быть массив, который в 4 раза (RGBA/BGRA) является размером массива dFrameData
и содержит информацию о цвете для каждого пикселя рамки глубины:
// 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];
.. но я все еще получаю неправильные цвета. В основном белые.