С# и Kinect v2: получить значения RGB, которые соответствуют пикселю глубины

Я немного поиграл с 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];

.. но я все еще получаю неправильные цвета. В основном белые.

Ответ 1

Ну, я понял это сам. Ошибка была тривиальной. Поскольку массив не является пиксельным массивом, где одна запись содержит информацию 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];