Получить значения RGB для каждой 3D-точки в Kinect v2

Меня смущает API Kinect v2 CoordinateMapper . Я хочу получить значения RGB для каждой 3D-точки, также известной как CameraSpacePoint в Kinect v2.

Пожалуйста, смотрите ниже фрагмент кода:

var depthFrame = multiSourceFrame.DepthFrameReference.AcquireFrame();
var colorFrame = multiSourceFrame.ColorFrameReference.AcquireFrame();

var depthWidth = depthFrame.FrameDescription.Width;
var depthHeight = depthFrame.FrameDescription.Height;

ushort[] depthData = new ushort[depthWidth * depthHeight];
CameraSpacePoint[] camerapoints = new CameraSpacePoint[depthData.Length];
ColorSpacePoint[] colorpoints = new ColorSpacePoint[depthData.Length];

depthFrame.CopyFrameDataToArray(depthData);
this.coordinateMapper.MapDepthFrameToCameraSpace(depthData, camerapoints);
this.coordinateMapper.MapDepthFrameToColorSpace(depthData, colorpoints);

Точки 3D хранятся в переменной camerapoints. Я хочу, чтобы значения RGB каждого camerapoints. Другими словами, см. ниже код песудо:

RGBPoint[] rgbpoints = new RGBPoint[depthData.Length];
RGBPoint rgbpoint = rgbpoints[0];
int red   = rgbpoint.r
int green = rgbpoint.g
int blue  = rgbpoint.b

Как всегда, большое спасибо. Я очень ценю ваш добрый ответ.


person Ravi Joshi    schedule 21.11.2017    source источник


Ответы (1)


Массив colorpoints содержит индекс (x, y), который соответствует каждому пикселю в массиве depthData. Отсюда мы можем просто получить данные цветового кадра (из colorFrame) по каждому конкретному (x, y) индексу, указанному colorpoints[index].

var colorWidth = colorFrame.FrameDescription.Width;
var colorHeight = colorFrame.FrameDescription.Height;

// Assuming BGRA format here
byte[] pixels = new byte[colorWidth * colorHeight * 4];
colorFrame.CopyFrameDataToArray(pixels);

byte[] bgraPoints = new byte[depthWidth * depthHeight * 4];

for (var index = 0; index < depthData.Length; index++)
{
    var u = colorpoints[index].X;
    var v = colorpoints[index].Y;
    if (u < 0 || u >= colorWidth || v < 0 || v >= colorHeight) continue;
    var pixelsBaseIndex = v * colorWidth + u;
    Array.Copy(pixels, 4 * pixelsBaseIndex, bgraPoints, 4 * index, 4);
}

var index = 0;
var red = bgraPoints[4 * index + 2];
var green = bgraPoints[4 * index + 1];
var blue = bgraPoints[4 * index];
person Tuwuh S    schedule 21.11.2017
comment
Большое спасибо. Но выдает следующую ошибку ArgumentOutOfRangeException: Number was less than the array's lower bound in the first dimension. Я добавил отдельный вопрос и упомянул о нем дополнительную информацию. См. здесь - person Ravi Joshi; 23.11.2017
comment
Интересно, на самом деле я действительно не пытался выполнить код (сейчас у меня нет под рукой Kinect). Однако я предполагаю, что это связано с тем, что некоторые пиксели глубины могут быть вне рамки цветовых пикселей из-за смещения и поля зрения между двумя камерами. Один из способов справиться с этим — просто игнорировать эти значения. Обновил мой ответ. - person Tuwuh S; 25.11.2017
comment
Большое спасибо. Я попробую это завтра. Еще один вопрос pixelsBaseIndex = v * depthWidth + u вместо depthWidth должно быть colorWidth ? Не уверен, хотя, так как я сейчас вне лаборатории. Еще раз спасибо за обновленный ответ. - person Ravi Joshi; 26.11.2017
comment
Что-то по-прежнему подозрительно. Я не мог сделать это. Не могли бы вы проверить здесь - person Ravi Joshi; 16.12.2017