Я использую следующий код C ++ для считывания информации о глубине из kinect:
BYTE * rgbrun = m_depthRGBX;
const USHORT * pBufferRun = (const USHORT *)LockedRect.pBits;
// end pixel is start + width*height - 1
const USHORT * pBufferEnd = pBufferRun + (Width * Height);
// process data for display in main window.
while ( pBufferRun < pBufferEnd )
{
// discard the portion of the depth that contains only the player index
USHORT depth = NuiDepthPixelToDepth(*pBufferRun);
BYTE intensity = static_cast<BYTE>(depth % 256);// Write out blue byte
*(rgbrun++) = intensity;
// Write out green byte
*(rgbrun++) = intensity;
// Write out red byte
*(rgbrun++) = intensity;
++rgbrun;
++pBufferRun;
}
То, что я хотел бы знать, это то, что самый простой способ реализовать переворачивание кадра (горизонтальный & по вертикали)? Я не смог найти какую-либо функцию в kinect SDK, но, может быть, я пропустил это?
EDIT1 Я бы не хотел использовать какие-либо внешние библиотеки, поэтому любые решения, которые объясняют разметку данных глубины и как инвертировать строки / столбцы, высоко ценятся.
Итак, вы используете стандартную одноканальную карту глубины 16bpp с данными игрока. Это хороший простой формат для работы. Буфер изображения размещается построчно, и каждый пиксель в данных изображения имеет младшие 3 бита, установленные для идентификатора игрока, и верхние 13 битов, установленные для данных глубины.
Вот быстрый и грязный способ прочитать каждую строку в обратном порядке и записать ее в RGB-изображение, с любым простым визуализацией глубины, что немного приятнее смотреть на тот результат обертывания, который вы используете в данный момент.
BYTE * rgbrun = m_depthRGBX;
const USHORT * pBufferRun = (const USHORT *)LockedRect.pBits;
for (unsigned int y = 0; y < Height; y++)
{
for (unsigned int x = 0; x < Width; x++)
{
// shift off the player bits
USHORT depthIn = pBufferRun[(y * Width) + (Width - 1 - x)] >> 3;
// valid depth is (generally) in the range 0 to 4095.
// here's a simple visualisation to do a greyscale mapping, with white
// being closest. Set 0 (invalid pixel) to black.
BYTE intensity =
depthIn == 0 || depthIn > 4095 ?
0 : 255 - (BYTE)(((float)depthIn / 4095.0f) * 255.0f);
*(rgbrun++) = intensity;
*(rgbrun++) = intensity;
*(rgbrun++) = intensity;
++rgbrun;
}
}
Код не проверен, E&О.Е. и т.д .;-)
Можно распараллелить внешний цикл, если вместо использования одного rgbrun
Указатель, вы получаете указатель на начало текущей строки и записываете вывод вместо этого.
Других решений пока нет …