Для программистов, недавно начавших работать с технологией Intel RealSense, мы подготовили пост c тремя простыми примерами, демонстрирующими возможности камеры R200. В число примеров вошли:
  • Запись и просмотр необработанных потоков
  • Изменение фокусировки по глубине
  • Отслеживание лица


Запись и просмотр необработанных потоков камеры R200


В этом доступном для загрузки коде демонстрируются основы записи и просмотра необработанных потоков камеры R200 на C#/XAML с помощью Intel RealSense SDK для Windows*. Решение Visual Studio* состоит из четырех простых проектов (размер каждого — не более 200 строк кода).
  • ColorStream — отображение цветового потока с камеры RGB.
  • DepthStream — отображение потока глубины.
  • IRStreams — отображение правого и левого потоков инфракрасной камеры.
  • AllStreams — отображение всего перечисленного в одном окне (см. рис. 1).


Рисунок 1. Образец кода для всех потоков

Среда разработки программного обеспечения


Этот образец кода был создан в Windows 10 RTM с помощью Microsoft Visual Studio Community 2015. Для этого образца был использован шаблон проекта Visual C#WindowsClassic Desktop.
Версии SDK и DCM, использованные в этом проекте.
  • Intel RealSense SDK v6.0.21.6598
  • Intel RealSense Depth Camera Manager R200 v2.0.3.39488

Описание оборудования


Для данной работы мы использовали комплект Intel RealSense Developer Kit (R200), в состав которого входит камера, кабель USB3 и магнитное крепление для установки камеры на ноутбуке (рис. 2).


Рисунок 2. Intel RealSense Developer Kit (R200)

Для образца кода R200 действуют следующие требования к оборудованию:
  • Процессор Intel Core 4-го поколения (или более позднего).
  • 150 МБ свободного места на жестком диске.
  • ОЗУ 4 ГБ.
  • Камера Intel RealSense (R200).
  • Доступный порт USB3 для камеры R200 (или выделенное подключение для встроенной камеры).

Важно! Для поддержки потока данных, передаваемого камерой, требуется интерфейс USB3. Этот интерфейс должен быть подключен к выделенному порту USB3 на клиентской системе (без использования разветвителя).

Описание кода


Решение в Visual Studio состоит из четырех проектов WPF, разработанных на C#. Эти проекты используют явно заданный путь к libpxcclr.cs.dll (управляемой DLL-библиотеке):

C:\Program Files (x86)\Intel\RSSDK\bin\x64

Не забудьте изменить этот путь, если в вашей системе пакет SDK установлен в другую папку.
Так как мы запускаем 64-битную версию DLL, перейдите в меню Project > Properties > Platform target (Проект > Свойства > Целевая платформа) и убедитесь, что там выбрано значение «x64».
Чтобы собрать и запустить определенный проект, щелкните правой кнопкой мыши имя проекта (например, AllStreams) в Solution Explorer (обозревателе решений) и выберите Set as StartUp Project (Назначить запускаемым проектом) в меню.

Все проекты в составе решения CameraStreams обладают схожей структурой.

Настройте интерфейс Session и SenseManager.

Запустите рабочий поток с именем Update, в котором обрабатывается цикл AcquireFrameReleaseFrame.

В цикле AcquireFrameReleaseFrame происходят следующие действия.
  • Получение данных изображения.
  • Вызов метода Render для обновления пользовательского интерфейса.
  • Высвобождение ресурсов.
  • Высвобождение кадра.

В методе Render происходят следующие действия.
  • Вызов метода ConvertBitmap для преобразования каждого растрового кадра в тип BitmapImage, который требуется для отображения каждого кадра в элементе управления WPF Image.
  • Обновление пользовательского интерфейса путем делегирования работы диспетчеру, связанному с потоком пользовательского интерфейса.

Метод ShutDown вызывается при каждом возникновении событий Window_Closing или btnExit_Click. В методе ShutDown происходят следующие действия.
  • Остановка метода Update.
  • Удаление объектов.


Изменение фокусировки по глубине


В этом примере кода C#/XAML демонстрируются основы работы с модулем Enhanced Photography (EP) в Intel RealSense SDK для Windows* для изменения фокусировки изображения после его съемки. Этот образец кода выполняет следующие действия.
  • Отображение цветового потока RGB камеры R200 в элементе управления Image (слева).
  • Съемка кадра и отображение его во втором элементе управления Image (справа).
  • Изменение фокусировки и диафрагмы с помощью ползунка.
  • Сохранение измененного изображения в виде стандартного JPG-файла (Snapshot.jpg).


Рисунок 3. Пример изменения фокусировки по глубине (фокусировка на цветке)


Рисунок 4. Сохраненный файл изображения

Как описано в руководстве по SDK (в файле RSSDK_DIR\doc\PDF\sdkmanuals.pdf), модуль Enhanced Photography (EP) расширяет традиционные возможности обработки фото и видео за счет использования трехмерной информации (в частности, данных о глубине), записанной вместе с фотографиями и видео. Функция изменения глубины резкости меняет фокусировку и глубину резкости кадра после его съемки. (Обратите внимание, что этот алгоритм работает только с камерой R200.)

Описание оборудования


Для этой работы мы использовали комплект Intel RealSense Developer Kit (R200). Камера была установлена на ноутбук с помощью магнитного крепления, входящего в комплект (рис. 5).


Рисунок 5. Камера, присоединенная к магнитному креплению

Примечания к сборке


В этом проекте используется пространство имен System.Drawing.Imaging. Ссылка на него указывается вручную: в новом проекте щелкните правой кнопкой мыши References (Ссылки) в Solution Explorer (обозревателе решений) и выберите Add Reference… (Добавить ссылку…), чтобы открыть окно диспетчера ссылок. Затем выберите Assemblies, Framework (Сборки, платформа) и найдите System.Drawing в списке. Установите флажок и нажмите кнопку ОК.

В этом проекте используют явно заданный путь к libpxcclr.cs.dll (управляемой DLL-библиотеке): C:\Program Files (x86)\Intel\RSSDK\bin\x64. Не забудьте изменить этот путь, если в вашей системе пакет SDK установлен в другую папку.

Поскольку проект ссылается на 64-разрядную версию DLL-библиотеки, убедитесь, что параметр «x64» указан в разделе Project > Properties > Platform target (Проект > Свойства > Целевая платформа).

Проект включает команду события после сборки, чтобы убедиться в копировании неуправляемой DLL-библиотеки (libpxccpp2c.dll) в целевую выходную папку:
if "$(Platform)" == "x86" (copy /y "$(RSSDK_DIR)\bin\win32\libpxccpp2c.dll" "$(TargetDir)" ) else ( copy /y "$(RSSDK_DIR)\bin\x64\libpxccpp2c.dll" "$(TargetDir)" )

Отслеживание лица


В этом примере кода C#/XAML демонстрируются основы работы с алгоритмом отслеживания лиц в Intel RealSense SDK для Windows* для обнаружения и отслеживания лиц людей в реальном времени с помощью камеры R200. Этот образец кода выполняет следующие действия.
  • Отображение цветового потока RGB камеры R200 в элементе управления Image.
  • Наложение прямоугольного элемента управления, который отслеживает расположение лица пользователя (в зависимости от того, где находится пользователь в поле зрения камеры).
  • Отображение количества лиц, обнаруженных камерой R200.
  • Отображение высоты и ширины отслеживаемого лица.
  • Отображение двухмерных координат (X и Y) отслеживаемого лица.
  • Указание глубины лица, то есть расстояния от камеры R200 до лица.
  • Поддержка и отображение отслеживания оповещений, подписка на обработчик событий.


Рисунок 6. Образец кода для отслеживания лиц

Описание оборудования


Для этой работы мы использовали комплект Intel RealSense Developer Kit (R200). Камера была установлена на стандартный штатив с помощью приобретаемого дополнительно магнитного крепления** (рис. 7).


Рисунок 7. Камера, присоединенная к магнитному креплению (может поставляться не во всех комплектах)

Примечания к сборке


Смотрите предыдущий пример.

Описание кода


Образец кода имеет следующую структуру.

Настройте интерфейс Session и SenseManager, а также модуль распознавания лиц.
Запустите рабочий поток с именем Update, в котором обрабатывается цикл AcquireFrameReleaseFrame.
В цикле AcquireFrameReleaseFrame происходят следующие действия.
  • Получение данных изображения.
  • Получение данных модуля распознавания лиц.
  • Вызов метода Render для обновления пользовательского интерфейса.
  • Высвобождение ресурсов.
  • Высвобождение кадра.

В методе Render происходят следующие действия.
  • Вызов метода ConvertBitmap для преобразования каждого растрового кадра в тип BitmapImage, который требуется для отображения каждого кадра в элементе управления WPF Image.
  • Обновление пользовательского интерфейса путем делегирования работы диспетчеру, связанному с потоком пользовательского интерфейса.

Метод ShutDown вызывается при каждом возникновении событий Window_Closing или btnExit_Click. В методе ShutDown происходят следующие действия.
  • Остановка метода Update.
  • Удаление объектов.

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


  1. Psychosynthesis
    22.10.2015 14:12

    Вот почему в подобных проектах всегда шарп, а не кресты?


  1. sergehog
    22.10.2015 16:54

    Может я чего пропустил, но нельзя ли чуть подробнее описать принцип построения карты глубин в этом сенсоре? Стерео-матчинг между двумя инфра-красными картинками? На сколько я помню раньше использовался Structured Light, да и сам депт выглядел значительно лучше.


    1. rPman
      22.10.2015 20:12

      Присоединяюсь к вопросу.

      Меня интересует погрешность/точность расчета глубины (в идеальных условиях освещения или в темноте, и матовой однотонной поверхности, например согнутая бумага).


      1. alazarev27
        26.10.2015 16:51

        По опыту пока максимальная точноть — два миллиметра, но может быть сильно хуже, сильно зависит от расстояния до предмета, от условий съёмки, от отражающих свойств поверхности, от движения. то есть бывает и значительно хуже. Так же нужно понимать, что увеличение точности изображения глубины приводит к увеличению шумов в сигнале, это неизбежно.
        Интел работает над улучшением качества изображения глубины.

        Обратите внимание, что заинтересованным разработчикам предлагается так же самим строить и улучшать картинку глубины: вы можете получить потоки инфракрасного видео с правого и левого сенсоров и, сравнивая их, получить гораздо лучшие результаты, чем получает ASIC камеры (и выдаёт вам в виде потока глубины). На мощном ЦПУ можно насчитать больше, лучше и быстрее, чем на слабеньком ASIC камеры, особенно зная больше об условиях съёмки и о снимаемой сцене.
        Справедливости ради, стоит отметить, что Интел тоже дорабатывает картинку глубины, получаемую из камеры, в некоторых из модулей СДК, прежде, чем её использовать.


        1. alazarev27
          26.10.2015 17:00

          два милиметра точности — имеется в виду суммарная погрешность размера сканируемого объекта размером в 20-30 сантиметров.
          Для измерений небольших расстояний — надо экспериментировать, пожалуйста, пробуйте, пишите.


        1. rPman
          27.10.2015 19:23

          Помимо переотражений (именно из-за них сложно определить 'изображение глубины'), я так понимаю, точность измерения еще зависит от типа поверхности и ее собственного излучения?

          Если не рассматривать худший вариант — зеркальные поверхности, что по поводу влияния на точность материала — бумага, дерево, пластик, кожа (живая и теплая)?


          1. alazarev27
            27.10.2015 19:38
            +1

            Тепловые излучения (от этих мерзких тёпленьких людишек :)) в другом диапазоне.
            Поверхность очень существенна: её цвет и качество. Разная чёрная ткань совершенно по-разному отражает, иногда она просто невидима, разного цвета волосы, шерсть. Глянцевые и прозрачные-получпрозрачные поверхности тоже очень проблемны, Вы правильно заметили.
            Бумага-пластик-дерево-кожа — разницы не видел. Смотря какого цвета кожа, может :)
            Чистые руки, я имею в виду, всегда лучше!


    1. alazarev27
      26.10.2015 16:41
      +1

      В сенсоре F200 (фронтальная камера — «на пользователя», сейчас на большинстве устройств RealSense) — кодированный ИК свет (по вертикальным полоскам, иногда при интерверенции с лампочкой накаливания можно заметить вертикальные полоски-артефакты, это — как раз оно).
      — Минусы кодированного света — солнышко засвечивает любой лазер в практически любом диапазоне, даже рассеянный свет через окно. Остается использование только внутри помещений. И второе — интерференция разных устройств в поле действия лазера, благо оно в камерах F200 не большое.

      В сенсоре R200 (внешеня камера, о которой, собственно, статья) — стереоскопическая disparity map в ИК диапазоне, ИК подсветка для использования внутри помещений, использование природной ИК подсветки.