Функция getDistance()
, которую вы используете для расчета реальной глубины, относится к обнаружению игрока Kinect. Поэтому убедитесь, что вы соответственно открываете свой поток kinect или, возможно, вам следует получить только необработанные данные о глубине
Runtime nui = Runtime.Kinects[0] ;
nui.Initialize(RuntimeOptions.UseDepth);
nui.DepthStream.Open(
ImageStreamType.Depth,
2,
ImageResolution.Resolution320x240,
ImageType.Depth);
, а затем вычислите глубину простым сдвигом битов второго байта на 8:
Расстояние (0,0) = (int) (биты [0] | биты [1] << 8); </p>
Первые методы калибровки должны работать нормально, даже если вы могли бы сделать небольшое улучшение
используя лучшее приближение, данное Стефаном Магненатом:
расстояние = 0,1236 * загар (rawDisparity / 2842,5 + 1,1863) в метрах
Если вам действительно нужны более точные значения калибровки, вы должны действительно откалибровать свой kinect, используя, например, такой инструмент, как калибровка matlab kinect:
http://sourceforge.net/projects/kinectcalib/
И дважды проверьте полученные значения с теми, которые вы используете в данный момент, предоставленные Николасом Буррусом.
EDIT
Читая ваш вопрос еще раз, я заметил, что вы используете Microsoft SDK , поэтому значения
которые возвращаются с датчика kinect уже реальных расстояний в мм . Вам не нужно использовать функцию RawDepthToMeters()
, ее следует использовать только с неофициальными SDK.
Аппаратное обеспечение создает карту глубины, которая является нелинейной функцией значений диспаратности и имеет 11 бит точности. Драйвер kinect sdk преобразует из коробки это значение диспаратности в мм и округляет его до целого числа. MS Kinect SDK имеет диапазон глубины 800 мм до 4000 мм .