Пользователь
0,0
рейтинг
6 сентября 2012 в 08:26

Разработка → Kinect for Windows SDK. Часть 1. Сенсор


Три части обзорной статьи можно считать вводными к двум другим: «Играем в кубики с Kinect» и «Программа, апорт!». Хотя хронологически они идут последними. Более того, за время их написания Microsoft успел выпустить новую версию SDK – 1.5. Какой удар со стороны корпорации!

Как вам должно быть известно, Kinect – это бесконтактный контроллер, т.е. скажем в играх, вместо того, чтобы яростно стучать по клавиатуре или терзать gamepad, вы размахиваете руками и ногами и время от времени голосом даете какие-то команды. Самое время спрятать дорогие китайские вазы X века подальше!

Начинать знакомство с Kinect лучше со знакомства с самим сенсором. Это небольшая черная коробочка с тремя камерами, длиной чуть более 20 см и высотой около 5 см (не считая ножки). Один нюанс – в Kinect две камеры. И это изображение (взято из MSDN) тому подтверждение.

image

  • IR Emitter – Инфракрасный излучатель. Да, это не камера. Его назначение испускать инфракрасные лучи, которые, отражаясь от предметов, попадают назад в сенсор, где их принимает:
  • IR Depth Sensor – Инфракрасный приёмник. Собирает отраженные лучи, преобразуя их в расстояние от сенсора до объекта(ов). И таким образом строится, можно сказать, матрица расстояний — целый кадр. Максимальное разрешение 640x480 (30 fps). Если говорить о переводе мне кажется, «ИК приёмник» лучше отражает суть, чем дословный «ИК датчик глубины».
  • Color Sensor – Цветная камера. Захват видео с максимальным разрешением 1280x960 (12fps). Угол обзора камеры: 43° по вертикали и 57° по горизонтали (угол обзора дальномера идентичный). Можно выбрать формат картинки: RGB или YUV.
  • Microphone Array – набор микрофонов. 4 встроенных микрофона позволяют определить местоположение источника звука и направление звуковых волн. Встроенный обработчик звукового сигнала включает подавление эха и уменьшение шума.
  • Tilt Motor – Коррекция наклона. Позволяет программно настраивать наклон сенсора в диапазоне ±27° по вертикали.

Сенсор подключается к компьютеру через USB, хотя, строго говоря, USB устройством не является, т.к. имеет несколько отличную прошивку, нежели стандартное USB устройство. Найти какие-либо комментарии по этому поводу не получилось, но можно предположить, что сделано это исключительно в целях повышения производительности. Вы можете подключить до четырех сенсоров одновременно.

Другой важный аспект аппаратной части – диапазон «рабочих» расстояний, т.е. на каком расстоянии сенсор способен видеть объекты (данные дальномера). И снова картинка помогает продемонстрировать возможности Kinect.

image

Режим Default Range доступен как для Kinect for Windows, так и для Kinect for XBox, но Near Range доступен только для сенсора Kinect for Windows. Простой пример: для всех объектов в кадре находящихся в пределах Normal Values сенсор вернёт измеренное расстояние, но для объектов, выходящих за этот диапазон, сенсор вернёт либо ноль, либо определенную для каждого диапазона константу (зависит от заданных вами настроек). Одно из существенных отличий SDK 1.5 от 1.0 в том, что теперь в режиме Near Range можно получить информацию о сидящем человеке, это так называемый трекинг сидящей фигуры (seated skeletal tracking). Kinect отслеживает 10 точек: голову, шею и руки. Но об этом чуть позже.

Хочется обратить внимание на различия двух Kinect (XBox и Windows). Первый разрабатывался и тестировался с одним устройством – XBox. Второй же, напротив, должен работать с широким диапазоном устройств (компьютеров), поэтому его кабель короче, а специальное устройство призвано не позволить Kinect подраться с остальной USB периферией. Лицензионное соглашение позволяет использовать Kinect for Windows в коммерческих целях, а Kinect for XBox нет.

Перейдем теперь к установке SDK. В версии 1.5 Microsoft разделил SDK на два пакета. Скачать их можно с официальной страницы:
  • Kinect for Windows SDK. Включает APIs и драйверы сенсора.
  • Kinect for Windows Developer Toolkit. Включает Kinect Studio (полезный для отладки инструмент), Face Tracking SDK, примеры кода и документация.

Не будем останавливаться на установке SDK, в этом нет ничего сложного или интересного. А вот что действительно интересно так это то, что же разработчик может получить от Kinect? Взглянем на следующие возможности:
  • Skeletal Tracking (трекинг человеческой фигуры)
  • Face Tracking (трекинг лица)
  • Speech Recognition (распознавание речи)

Обзор этих функций вы найдете в следующих частях статьи.

Полезные ссылки:
  • Kinect for Windows SDK
  • Руководство разработчика. Можно найти примеры на C# (managed code) и на C/C++ (unmanaged code)
  • Kinect for Windows Quickstart Series. Серия видео-уроков о возможностях Kinect (весьма полезная для знакомства с устройством).
  • Near Mode: What it is (and isn’t). Статья о near mode, хотя написана в преддверии SDK 1.0, но полезна в плане разоблачения некоторых мифов.
  • Форумы Kinect for Windows SDK. Здесь можно обратиться за советом к экспертам.
@Lardite
карма
24,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (18)

  • 0
    Очень интересно было бы посмотреть на подключение 4х сенсоров, ну и конечно хотелось бы увидеть в Ваших статьях ещё и Finger Tracking, или это будет включено в Skeletal Tracking?
    • 0
      Нет, в skeletal tracking этого не будет описано. Насколько я знаю, Finger Tracking не поставляется, что называется, из коробки, а реализуется сторонними библиотеками? В любом случае спасибо за комментарий, возможно если будет возможность поиграться с ним, то напишу статью.
    • 0
      Kinect for Windows SDK не поддерживает Finger Tracking.
    • 0
      В Кинекте сенсор слишком шумный, чтобы распознавать пальцы адекватно. Только очень близко. Только на вытянутой к камере руке. Только с ошибками.
  • 0
    А никто не подскажет, можно с помощью Кинекта (нескольких) строить 3х-мерную картинку пространства? Или, может, есть какие-то другие, возможно, более адекватные для этого средства?
    • 0
      В каком-то виде kinect может построить такую картинку с помощью IR камеры.
      image
      • 0
        К сожалению, видимо, неточно выразился — меня интересует, есть ли какие-то примеры / проекты построения 3х мерной структуры с помощью кинекта (например с помощью от 2х до n кинектов строить 3х-мерную структуру, расположенную между ними?

        И по картинке вопрос: яркость — это степень удалённости? А есть какие-то готовые схемы приведения координат? Ну понятно, что смещение в координатах — угловое, а с учётом дальности — точную точку пространства выловить можно?
        • 0
          Хм, честно не слышал о таких проектах.

          В картинке не думаю, что просто удаленность, скорее всего еще какая-то обработка есть. По поводу приведения координат не совсем понял.
          • 0
            Приведение координат — грубо говоря по имеющемуся пикселу (я так понимаю что яркость сообщает об удалённости) вычислить координату (x,y,z) расстояния от кинекта.

            Вообще говоря мысль какая: имея несколько кинектов или иных устройств, позволяющих просматривать пространство, отображая какие-либо объекты, строить 3х мерную картинку имеющегося «мира» и воспроизводить какие-либо интерактивные сюжеты. Например есть такая детская игра в залах с игровыми автоматами «растоптать пришельцев», но там строится исходя из сенсорных данных, а хотелось бы без сенсоров — просто на основе построения 3х-мерной модели (вообще говоря, вроде бы, и такие коммерческие приложения есть, но на чём они базируются — честно говоря не знаю).

            Ну и потом было бы интересно проработать такую технологию — это может позволить реализовывать различные реал-3д игры ) Например интерактивный лабиринт способный взаимодействовать с посетителями с высокой точностью.

            ps сорри, сейчас более точно выразить свои мысли не могу… завтра постраюсь выразить более точно… впрочем не уверен, что получится )
            • 0
              ​Кажется понимаю о чём вы =). В следующей части (будет в понедельник) я расскажу о потоках данных, возможно станет чуточку яснее.
              Если кратко, то у kinect каждый кадр инфракрасной камеры — это набор расстояний до объекта, т.е. пиксель в таком кадре характеризует не цвет, а расстояние до объекта в этой конкретной точке. И, чтобы, например, визуализировать такой кадр, вы вольны придать каждому расстоянию свой цвет и наслаждаться.
            • 0
              А по поводу построения 3D модели, идея интересная! Надо погуглить…
            • 0
              Высокая точность — это не про Kinect. Трехмерная картинка — пожалуйста, там как раз есть трехмерная система координат с расстояниями в метрах, а карта глубины дает облако точек, которое в каком-то роде уже 3d-модель. То есть худо-бедно построить модель можно.
              Я работал в проекте, который отчасти занимался построением трехмерной модели человека, как можно более точно его описывающей, с помощью Kinect. Правда, только одного Kinect. Сложностей возникало немало: низкая точность, очевидно уменьшающаяся при удалении объектов, «тени», некоторые глюки в определении местоположения человека (стул принять за человека — как нечего делать), плюс сложность 3d-моделирования в принципе.
              • 0
                Ну точность больше 5ти сантиметров на начальном этапе и не обязательна (или он и такую не может обеспечить?).
                Построение модели пространства — мне без разницы, человек там или не человек, по большому счёту мне вообще надо охватить объект и просто внести его в картину мира, ну и отслеживать (своим софтом) изменения объекта (например движение). Полагаться на автоматику кинекта в моей идее — вещь абсолютно не нужная (тем более, что кинект же вроде не сразу ловит человека? мне хотелось бы максимально быстро реагировать на появление нового объекта в картине).
                Ну и один кинект для построения модели пространства — совершенно не вариант — нужно же учитывать, что за одним объектом может прятаться другой. 2-3 кинекта эту проблему решат хотя бы отчасти…
                • 0
                  Точность 5 см — вполне обеспечивает :)
                  Человека кинект ловит достаточно быстро, если он движется. Может затупить в начале работы программы, когда человек неподвижен и ждет, пока программа запустится. И еще, что может быть вам полезно: kinectSDK определяет не только точки скелета человека, но и выделяет соответствующее ему облако точек на карте глубины. За это отвечает индексированная карта глубины (разрешение не более 320x240). Выделение в общем случае достаточно неплохое.
                  Было бы интересно увидеть реализацию вашей идеи :) Особенно интересны алгоритмы отслеживания изменений, определения положения человека и т.д.
                  • 0
                    Реализовать ещё не скоро могу… в ближайшие пару месяцев даже не планирую выделение средств на покупку кинектов для экспериментов… Ближе к новому году, возможно.
        • 0
          Структуру можно построить самому. В SDK где-то есть экзампл с RGB облаком точек.
    • 0
      Если память мне не изменяет, то в библиотеке PCL есть реализация kinfu(Kinect Fusion) для GPU, воторая умеет строить 3D модель пространства. Идея там в том, что множество облаков полученных с кинекта склеиваются во что-то типа 3D панорам(при помощи методов глобальной оптимизации каждое новое облако вписывается в уже существующую сцену).
  • 0
    Насчет «ИК датчика глубины»: насколько я знаю, строится не матрица расстояний до сенсора, а матрица глубины — расстояний до плоскости, параллельной сенсору, то есть по оси z трехмерной системы координат. Само собой, в процессе работы сенсора получаются именно расстояния, но в KinectSDK присутствует именно такая структура, как матрица глубины. Или я ошибаюсь?

    Вы не собираетесь рассказывать в следующих частях о работе с несколькими Kinect-ами? Было бы интересно послушать об их взаимодействии, потому как одновременная работа нескольких сенсоров, подключенных к разным компьютерам, давала очень нехорошие шумы и искажения ( существенное снижение точности, большие «тени»). Интересно было бы узнать, есть ли аналогичная проблема при подключении к одному компьютеру и как с ней справляются.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.