старый неактивный вопрос, но в любом случае вот что у меня сработало. У меня есть старая модель kinect (1414 для XBOX360 + сокращение ПК), и недавно я успел сделать код и измерения:
мои необработанные данные 16 бит, а не 10/11/12/13 бит !!!
, поэтому, вероятно, ваши данные очень похожи.Минимальное измеренное расстояние равно ~0.95m
максимальное неизвестное расстояние (недостаточно большой площади для тестирования), а минимальное допустимое значение равно 6408 ... ~0.95m
от датчика.Другое допустимое значение - 15800 ... ~2.5m
от датчика для интерполяции
наивное (линейное) преобразование в метры
float z,m=(2.5-0.9)/(15800.0-6408.0);
WORD raw;
raw=... raw depth form camera/image;
z=0.0;
if ((raw>=6408)&&(raw< 0xFFF0))
z=0.9+(float(raw-6408)*m);
// here z is range in [m] or 0 for invalid depth
когда у меня будет больше времени, я проверю линейность и уточню
, чтобы сделать это, мне нужно выполнить некоторое программирование для лучшего измерения и настроить рабочую область для более точного расстоянияизмерения.Более точные константы могут добавлять косинусную коррекцию, если это необходимо.Я не знаю, если устройство / драйвер делает это сам или нет, чтобы измерить его.Когда я доберусь до него, я обновлю свой ответ, но я очень ленив, так что это может занять какое-то время ...
[Edit 1] сделал некоторые настройки измерения геометрии и изменения кода
Итак, вот новые более точные выводы:
if (raw==0x0000) z=0.0;
else if (p.raw>=0x8000) p.z=4.0;
else p.z=0.8+(float(p.raw-6576)*0.00012115165336374002280501710376283);
raw
данные уже косинусно скорректированы драйвером или kinect , поэтому raw
представляют перпендикулярное расстояние отдатчик.raw
данные линейно перпендикулярны расстоянию (по крайней мере, на расстоянии 0,8 - 2,0 м) и после более точного измерения диапазон глубины составляет <0.8 - 4.0> [m]
.Измерения раньше были неточными.
raw = 0
- слишком близкое значение
raw >= 32768
- слишком далеко / неизвестное значение или даже что-то еще (есть больше возможностей)