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 комментариев на «“Kinect — начало работы — настройка OpenCV”»

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

  2. На приставке шикарная вещь, ток я тож очкую её подключать куда попало 😀
    кстати, почему, если посмотреть на то место, где ИК светит, то будут видны краснык «блики», будто там лазер красный?

    • может просто там колеблица между тем что видим и нет…

  3. возникло пару вопросов

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

    • это моя статья 🙂
      действительно — в составе 2.4.2 этого примера уже нет — значит, не кладут.
      include находится в исходной директории opencv.
      попробуйте закомментировать, понять на что ругается и подключить требуемые заголовочные файлы.

    • 2 часа ковыряния и я в принципе нашёл все ответы на что спрашивал ранее 🙂 спасибо, переменной used_precompiled_headers в версии 2.4.2 нет. И можно подправить cmake.config там можно подключить поддержку openni до сборки Си мейком

Добавить комментарий

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Arduino Bluetooth CraftDuino DIY Google IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение