Upload
denis-perevalov
View
3.903
Download
17
Embed Size (px)
DESCRIPTION
Работа с 3D-камерами Kinect и Xtion: принципы работы, SDK, примеры использования.
Citation preview
с/к Компьютерное зрение и OpenCV
Работа с 3D-камерами Microsoft Kinect и Asus Xtion
УрФУ / ИММ осень 2011лекции и объявления: вопросы отправляйте на адрес www.uralvision.blogspot.com [email protected]
Что такое 3D-камераПринцип работы массовых 3d-камер - использование стереозрения на основе активной ИК-подсветки.Лазер светит в ИК-диапазоне, создавая специальный паттерн на объектах. ИК-камера анализирует эти паттерны и восстанавливает расстояние до точек объектов.
Что такое 3D-камераПлюсы: - в замкнутых помещениях, даже затемненных, работает достаточно устойчиво (по сравнению с обычными стереосистемами).
Минусы: - при ярком свете не работает, так как камера не видит свет от ИК-лазера (по сравнению с обычными стереосистемами).- не видит стеклянные и зеркальные объекты (по сравнению с сонарами).- низкая точность (по сравнению с камерами, основанными на лазерных дальномерах).
Какие есть камерыMicrosoft Kinect30 fps 640x480,есть RGB-камера и 4 микрофона.Длинный шнур (3 м).Но: очень большой и тяжелый.
Asus Xtion Pro30 fps 640x480, 60 fps 320x480.
Asus Xtion Pro Liveкак Asus Xtion Pro, плюсRGB-камера.
Все камеры - USB 2.0.
Характеристики измерения дальностиДиапазон измеренийКамеры измеряют расстояние от 80 см до 500 см, но качественно - от 80 см до 350-400 см.
Охват камерыС расстояния 200 см камера видит по горизонтали область размером примерно в 200 см длиной.
Точность измеренийПринцип измерения дальности в рассматриваемых камерах основан на явлении параллакса. Поэтому с ростом расстояния до объекта точность измерений падает обратно пропорционально расстоянию.
На расстоянии 100-200 см от камеры точность в среднем составляет 1 см.
Безопасность использованияПроизводители говорят, что ИК-излучение, производимое лазером, безопасно для глаз, особенно если не смотреть в него в упор.
Какие есть средства разработкиНизкоуровневые - Freenect и т.п.Низкоуровневый доступ к камере для получения карты глубин, управление мотором.Среди них выделяется PCL (Point cloud library)аналог OpenCV, только для анализа облаков точек.
OpenNISDK от фирмы PrimeSense, которая и изобрела первоначально класс устройств типа Kinect и Xtion.Карта глубин, выделение людей в кадре (создание карты пикселов, соответствующих id каждого человека или объекта, похожего по габаритам на человека), трекинг скелета (требуется калибровка с Ψ-позой), трекинг жестов.
Microsoft KinectSDKКарта глубин, выделение людей в кадре (?), трекинг скелета (без требования калибровки), работа с микрофонами и мотором.
Сравнение OpenNI и Microsoft KinectSDK для задачи трекинга скелета
OpenNIБольшой минус: требуется калибровка (встать в Ψ-позу).Плюсы: заметно более работает - меньше дергается скелет. Позволяет распознать больше двух скелетов в кадре. Работает под Windows, Mac, Linux.
Microsoft KinectSDKБольшой плюс: сразу распознает скелет, без калибровки.Минусы: работает не так устойчиво, и позволяет трекерить не более двух скелетов в кадре. Работает только под Windows 7, только с Kinect.
Оба SDK - не очень хорошо распознают положение ног.Также, не работают для людей в юбке и балахонистой одежде.
Примеры1. Использование карты глубин
- Эксперименты в визуализацией и трансформацией облаков точек. - Простейший анализатор жестов с помощью отсечения пороговой обработкой.- Напольные игры.- Построение 3d-карты помещения с помощью анализа перемещения камеры и интеграции получаемых облаков точек.
http://www.youtube.com/watch?v=iUkWgSXbz40
http://www.georgetoledo.com/2010_11_01_archive.htmlhttp://spryflash.com/blog/?p=32
Примеры2. Использование анализаторов жестов OpenNI
- Управление устройствами типа ТВ с помощью жестов.- Создание "безкасательных" информационных стендов.
Когда я тестировал распознаватель жестов OpenNI, оказалось, что хорошо распознаются жесты Push, Wave, правда, после чтения инструкции - как точно их следует делать. Хорошо идет трекинг конца кисти. А круговые жесты, махи вправо и влево - распознаются очень плохо. Может быть, я просто не умею делать их правильно.
http://www.youtube.com/watch?v=m2Jdqs_vz40
Примеры3. Использование выделения людей OpenNI
- Создание интерактивных систем, в которых не требуется понимание, где какие части тела расположены.Применимо для развлечений, подсветки танцоров и т.п.
- Анализ положения людей в комнате для охранных систем и интерактивных применений. Для этого находится центр масс пикселов, соответствующих человеку, и это характеристика его центра. Затем, локальные координаты этой точки (x пикс,y пикс, z мм) преобразуются в мировые (X мм, Y мм, Z мм), и получаем точные координаты людей относительно камеры.
http://vimeo.com/27772326http://www.binaura.net/bnc/blog/media/SnowBells/openNi.jpg
Примеры4. Использование трекинга скелета OpenNI, KinectSDK
- игры,- развлечения,- управление роботами.
Минус: отсутствует тактильная связь, поэтому для управления не очень удобно.
http://www.youtube.com/watch?v=FdGLTSbOTDchttp://img215.imageshack.us/img215/8204/fafu.png
Использование в своих проектах- Поставить интересующий SDK (OpenNI, KinectSDK, Freenect.)
- Если требуется работа с 3d-точками, которые предполагается выводить на экран, то встроить нужные библиотеки в свой проект.
- Если же требуется лишь результат анализа 3d точек ("положение ноги на полу"), или положение частей скелета, или координаты людей в комнате - то можно использовать примеры, идущие с SDK, модифицировать их, и передавать нужные вашей программе данные. Это проще всего делать с помощью протокола OSC - для Unity3D, OpenFrameworks, Cinder,либо XmlSockets - для Flash.
Использование в своих проектахПоследняя возможность особенно важна для использования Microsoft KinectSDK, так как он, на мой взгляд труднее всех интегрируется в мои проекты. По OSC также можно посылать данные о скелете на другой компьютер (обычно Mac) для рендеринга.
Использование с OpenCVЕсли вы получили картинку глубины - обычно это 16-битное одноканальное изображение:unsigned short *depthData = ...; //размером w x h
то по нему строится изображение OpenCV:Mat depth = Mat( cv::Size( w, h ), CV_16UC1, depthData );
Вопрос на изучение OpenCV:в последнем случае - выделается ли память под depth, или просто используется этот указатель?
Достижение быстрого времени работы приложенияЕсли камера выдает 30 кадров в секунду, то этого недостаточно для гладкого рендеринга (он обычно не менее 60 кад/сек).
Чтобы решить проблему, есть два варианта:1. Опрос и обработка кадров с 3д-камеры выносится в отдельный поток.Главный поток просто считывает текущее состояни 3д-камеры.
2. Анализ 3д-камеры выносится в отдельное приложение, как обсуждали ранее.