Kinect - начало работы - настройка OpenCV



Перед самым Новым Годом, мне наконец-то доставили сенсор Kinect :)
Вот он, красавец:

вместе с сенсором, уже был блок питания и кабель-переходник на обычный USB (Kinect Modification Kit):

Не уверен, что это штатная комплектация, потому как раньше народу приходилось собирать такой переходник самостоятельно, используя вот такую схему выводов (pinout) кабеля:


Установка софта


Windows

Порядок установки софта для оживления сенсора:
1. скачиваем и устанавливаем библитотеку OpenNI
http://www.openni.org/Downloads/OpenNIModules.aspx
2. скачиваем и устанавливаем PrimeSensor Module для OpenNI
https://github.com/avin2/SensorKinect
(берём архив master-а и из каталога Bin запускаем
SensorKinect091-Bin-Win32-v5.1.0.25.msi или SensorKinect091-Bin-Win64-v5.1.0.25.msi — в системе появятся три новых устройства)

Установку необходимо производить в каталоги по-умолчанию !

Уже можно проверить работу сенсора :)
Идём в каталог установки библитотеки OpenNI
C:\Program Files\OpenNI\Samples\Bin\Release\

запустим пример SimpleViewer.net.exe

На сенсоре включается зелёный светодиод, а так же загорается красным (на фотографии — фиолетовым) ИК-прожектор.


прожектор крупным планом:

Если сенсор направить на пол и сфотографировать в темноте:


На экране ПК появляется картинка глубины:


Сразу же можно оценить границы детектирования объектов сенсором глубины.
Минимальное расстояние где-то 40 сантиметров — если поднести руку ближе, то она окрашивается чёрным (т.е. расстояние неизвестно)
Аппаратно, Kinect имеет практическую дальность от 0.5 до 3 метров.
Облако точек имеет разрешение по X, Y — 640х480, а глубина кодируется 11-ю битами (от 0 до 2047). На практике, (при использовании драйвера libfreenect) диапазон глубины составляет от 350 до 1045, представляющих от 0.5 до 3 метров.
Диапазон данных не является линейным, и для объектов, находящихся слишком близко или слишком далеко (или в «тени») — сенсор возвращает значение 2047 (показаны чёрным)

Юбилей Kinect-а


Kinect и OpenCV

Теперь попробуем пересобрать OpenCV для поддержки работы с сенсором Kinect.

Используем графическую утилиту cmake-gui.

1) Запускаем cmake-gui
2) указываем директорию, куда был распакован OpenCV.
3) создаём директорию для хранения генерируемых фалов проекта
4) указываем созданную на прошлом шаге директорию
5) нажимаем Configure, в появившемся окошке выбираем версию нашего компилятора

(например, Visual Studio 9 2008) и нажимаем Finish (студия при этом должна быть закрыта)
6) указываем необходимые опции библиотеки OpenCV:

для поддержки сенсора Kinect необходимо установить галочку напротив опции WITH_OPENNI.
И ещё прописать пути до заголовочных и библиотечных файлов библитотеки OpenNI, а для PrimeSensor Module путь к исполняемым файлам:
OpenNI:
	Linux & MacOSX:
		Libs into: /usr/lib
		Includes into: /usr/include/ni
	Windows:
		Libs into: c:/Program Files/OpenNI/Lib
		Includes into: c:/Program Files/OpenNI/Include

PrimeSensor Module:
	Linux & MacOSX:
		Bins into: /usr/bin
	Windows:
		Bins into: c:/Program Files/Prime Sense/Sensor/Bin


Нюанс:
не знаю в чём фишка, но у меня PrimeSensor Module по-умолчанию установился в каталог c:/Program Files/PrimeSense (без пробела между Prime и Sense) — CMake на это ругался и я решил вопрос ручным созданием необходимого каталога c:/Program Files/Prime Sense
и копированием туда файлов из каталога, куда установился PrimeSensor Module у меня.

OPENNI_PRIME_SENSOR_MODULE_BIN_DIR
C:/Program Files/PrimeSense/SensorKinect/Bin
->
c:/Program Files/Prime Sense/Sensor/Bin



7) жмём кнопку Generate и получаем в директории созданной на 2-м шаге кучу проектных файлов. Запускаем ALL_BUILD.vcproj и запускаем сборку библиотеки.
(некоторые модули сразу не собераются (выдаются ошибки сборки), но если снова запустить сборку, то они уже соберутся без ошибок).

Внимание: уж не знаю, что я делал не так, но почему-то OpenCV всё равно собирался без поддержки Kinect-а.
Проблему решил ручной правкой конфигурационного заголовочного файла:
добавил в конец c:\opencv\cvconfig.h
строчку
#define HAVE_OPENNI

и снова пересобрал библиотеку


8) Остаётся либо прописать путь со свежесобранными dll-ками и lib-файлами в настройках IDE, либо скопировать их в уже прописанную директорию c:\opencv\build, в которой хранятся исходная версия библиотеки (см. Установка OpenCV 2.3.1).

9) Пробуем собрать штатный пример работы с сенсором Kinect —
C:\opencv\samples\cpp\kinect_maps.cpp

запускаем полученный kinect_maps.exe
>kinect_maps.exe

This program demonstrates usage of Kinect sensor.
The user gets some of the supported output images.

All supported output map types:
1.) Data given from depth generator
   OPENNI_DEPTH_MAP            - depth values in mm (CV_16UC1)
   OPENNI_POINT_CLOUD_MAP      - XYZ in meters (CV_32FC3)
   OPENNI_DISPARITY_MAP        - disparity in pixels (CV_8UC1)
   OPENNI_DISPARITY_MAP_32F    - disparity in pixels (CV_32FC1)
   OPENNI_VALID_DEPTH_MASK     - mask of valid pixels (not ocluded, not shaded e
tc.) (CV_8UC1)
2.) Data given from RGB image generator
   OPENNI_BGR_IMAGE            - color image (CV_8UC3)
   OPENNI_GRAY_IMAGE           - gray image (CV_8UC1)

Kinect opening ...
done.

Depth generator output mode:
FRAME_WIDTH    640
FRAME_HEIGHT   480
FRAME_MAX_DEPTH    10000 mm
FPS    30

Image generator output mode:
FRAME_WIDTH    640
FRAME_HEIGHT   480
FPS    30

и видим две картинки:

— обычную картинку с RGB-камеры и карту рассогласования (disparity map).

Запустим kinect_maps.exe с параметром
-m 11111
и увидим ещё картинку с картой глубины:

Красота!

Далее: Работа с Kinect под ROS

Ссылки:
Делаем адаптер питания Kinect из подручных средств
OpenCV HIGHGUI — Using Kinect sensor
http://www.openni.org
https://github.com/OpenNI/OpenNI
https://github.com/PrimeSense/Sensor
https://github.com/avin2/SensorKinect
http://openkinect.org/wiki/Getting_Started
https://github.com/OpenKinect/libfreenect

Ссылки по теме:
Kinect — новый датчик для роботов?
Внутренности Kinect
Юбилей Kinect-а
  • 0
  • 15 января 2012, 14:39
  • noonv

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

RSS свернуть / развернуть
+
0
Я боюсь эксперементировать с такой дорогой игрушкой… но хочу сказать на приставке движения захватывает отлично, и с каждым обновлением задержка в обработке становиться все менее заметна.
avatar

Luan

  • 15 января 2012, 18:20
+
0
На приставке шикарная вещь, ток я тож очкую её подключать куда попало :D
кстати, почему, если посмотреть на то место, где ИК светит, то будут видны краснык «блики», будто там лазер красный?
avatar

blackhand999

  • 18 января 2012, 09:38
+
0
всмысле, посмотреть без камеры, просто глазами
avatar

blackhand999

  • 18 января 2012, 09:38
+
0
может просто там колеблица между тем что видим и нет…
avatar

Luan

  • 18 января 2012, 21:18
+
0
возникло пару вопросов

— а есть ссылка на источник статьи?
— когда я собирал проект, а это уже был opencv242 в рабочей папке samples не было kinect_maps.cpp и я его искал отдельно, — это моя недоработка или просто в поздних версиях они уже не кладут этот исходник?
— откуда берётся папка с include ?? после сборки у меня получились папки bin — с готовыми примерами и lib — с готовыми либами. в принципе заголовочные файлы лежат в исходной папке, однако, там нет improc.hpp который требуется для сборки kinect_maps
avatar

deeman30rus

  • 22 октября 2012, 23:42
+
0
это моя статья :)
действительно — в составе 2.4.2 этого примера уже нет — значит, не кладут.
include находится в исходной директории opencv.
попробуйте закомментировать, понять на что ругается и подключить требуемые заголовочные файлы.
avatar

noonv

  • 23 октября 2012, 06:36
+
0
2 часа ковыряния и я в принципе нашёл все ответы на что спрашивал ранее :-) спасибо, переменной used_precompiled_headers в версии 2.4.2 нет. И можно подправить cmake.config там можно подключить поддержку openni до сборки Си мейком
avatar

deeman30rus

  • 23 октября 2012, 09:17

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