Leap Motion — получение картинки с камер


На фоне новостей о проекте AR-гарнитуры North Star от компании Leap Motion, уместно вспомнить об их основном продукте — контроллере Leap Motion (рус. скачкообразное движение), который представляет собой USB-устройство, отслеживающее в области пространства над собой движение рук, пальцев и карандашей, ручек.

Как видно по фотографиям прототипа экспериментальной платформы Project North Star — для отслеживания рук пользователя там так же используется контроллер Leap Motion — только закрепляется он над головой таким образом, чтобы его рабочая область приходилась как раз перед пользователем.

Сам контроллер Leap Motion представляет собой небольшую коробочку, подключаемую к USB специальным шнурком, на конце которого интересный сдвоенный разъём из microUSB и какого-то их собственного разъема.

Не буду повторять обзоры контроллера. Кому интересно может почитать:
Обзор Leap Motion
Leap Motion. Впечатления

Текущая цена контроллера: 5-8 тыс. рублей.

Устройство Leap Motion

Leap Motion

Устройство контроллера Leap Motion довольно простое. Устройство состоит из двух камер и трёх инфракрасных светодиодов (с длиной волны 850 нанометров).

Разборку и внутреннее устройство контроллера можно посмотреть здесь: Leap Motion Teardown.

Благодаря широкоугольным объективам, камеры имеют широкое поле зрения (150 градусов). Обзорный диапазон контроллера Leap Motion ограничивается примерно 60 см над устройством (программное обеспечение Orion позволяет увеличить его до 80 см). Этот диапазон ограничивается распространением светодиодного света в пространстве, так как за пределами определенного расстояния, определенить положение руки становится намного сложнее. Интенсивность светодиодного света, в итоге, ограничена максимальным током, который можно передать по USB-соединению.

Принцип работы Leap Motion

В отличие от Kinect-а, контроллер Leap Motion не создает карту глубины — вместо этого он применяет специальные алгоритмы к сырым данным датчика.

Программное обеспечение на компьютере (Leap Motion Service) — обрабатывает изображения: выполняется компенсация фоновых объектов и окружающего освещения, а затем изображения анализируются для восстановления трехмерного представления того, что видит устройство.

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

Посредством этого протокола, сервис Leap Motion связывается с панелью управления (Leap Motion Control Panel), а также с собственными и клиентскими веб-библиотеками через локальное сокет-соединение (TCP, WebSocket). Клиентская библиотека организует данные в объектно-ориентированную структуру API, управляет историей кадров и предоставляет вспомогательные функции и классы.
Именно здесь клиентское приложение может соединяться с Leap Motion и реализовывать свою логику интерактивного взаимодействия.

Программирование Leap Motion

Простое и удобное SDK к контроллеру, позволяет использовать его для самого разного применения.
Например: Управление роборукой при помощи leap motion.

Для работы с контроллером на Python нужно только три файла библиотеки (Setting Up a Project):

lib/Leap.py
lib/x64/LeapPython.pyd
lib/x64/Leap.dll

В своём скрипте нужно просто прописать их расположение, что делается очень просто:

import sys
sys.path.append("../lib/Leap")
sys.path.append("../lib/x86")
sys.path.append("../lib")

Нужно обратить внимание, что в составе SDK идут библиотеки только для Python 2.7, но для Python 3 можно пересобрать библиотеку, используя SWIG 2.0.9: Generating a Python 3.3.0 Wrapper with SWIG 2.0.9

Получение изображения с камер Leap Motion

Что замечательно, контроллер не только выдаёт параметры рук и пальцев, но и сами картинки с камер.
Получить их можно от текущего фрейма, через доступ к списку Frame.images().

#
# Get Leap Motion camera images
#
# https://developer.leapmotion.com/documentation/python/devguide/Leap_Images.html

import os, sys
sys.path.append("../lib/Leap")
sys.path.append("../lib/x86")
sys.path.append("../lib")

import cv2, Leap, math, ctypes
import numpy as np

def make_npimage(image):
    #wrap image data in numpy array
    i_address = int(image.data_pointer)
    ctype_array_def = ctypes.c_ubyte * image.height * image.width
    # as ctypes array
    as_ctype_array = ctype_array_def.from_address(i_address)
    # as numpy array
    as_numpy_array = np.ctypeslib.as_array(as_ctype_array)
    img = np.reshape(as_numpy_array, (image.height, image.width))

    return img


def run(controller):

    while(True):
        frame = controller.frame()
        image = frame.images[0]
        if image.is_valid:
            #display images
            cv2.imshow('Left Camera', make_npimage(frame.images[0]))
            cv2.imshow('Right Camera', make_npimage(frame.images[1]))

            if cv2.waitKey(1) & 0xFF == ord('q'):
                break


def main():
    controller = Leap.Controller()
    controller.set_policy_flags(Leap.Controller.POLICY_IMAGES)
    try:
        run(controller)
    except KeyboardInterrupt:
        sys.exit(0)

if __name__ == '__main__':
    main()

Leap Motion Images

SDK уже содержит функционал для устранения дисторсии изображений, так что можно рассмотреть вариант использования данного контроллера не только для отслеживания рук, но и как своеобразную ИК-стереокамеру для экспериментов с компьютерным зрением.

Ссылки
Project North Star: AR-гарнитура с мощной технологией отслеживания рук
Unveiling Project North Star
Setting Up a Project
Generating a Python 3.3.0 Wrapper with SWIG 2.0.9
How Does the Leap Motion Controller Work?
Leap Motion Teardown
Camera Images
Leap.Image

По теме
Kinect — новый датчик для роботов?
Kinect: принцип работы и ПО


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

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
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение