Северный (Арктический) федеральный университет им. М.В. Ломоносова
Опубликован: 23.10.2013 | Доступ: свободный | Студентов: 1822 / 663 | Длительность: 09:26:00
Специальности: Программист
Самостоятельная работа 5:

Работа в D'Fusion Computer Vision, создание сценария отслеживания объекта

< Лекция 6 || Самостоятельная работа 5: 123 || Лекция 7 >

Интеграция D'Fusion CV с Intel Perceptual computing SDK

Наша задача состоит в том, чтобы:

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

1. Для начала создайте новый проект и настройте его для работы с Intel SDK, так это делали на практическом занятии №1.

2. Добавим файлы, необходимые для работы нашего будущего приложения. Для этого скопируем в папку проекта следующие файлы:

  • Intel\PCSDK\contrib\Total Immersion\sample\object_tracking\src\dcvRender.cpp
  • Intel\PCSDK\contrib\Total Immersion\sample\object_tracking\include\dcvRender.h

В Solution Explorer кликните правой кнопкой мышки по Source Files, а затем выберите Add -> Existing Item. Повторите действие для файла заголовка.

3. Теперь можно переходить непосредственно к коду программы.

Для начала добавим в наше приложение следующие предопределенные заголовки:

#include "pxcsession.h"
#include "pxccapture.h"
#include "pxcsmartptr.h"
#include "util_render.h"
#include "util_capture.h"
#include "util_cmdline.h"
#include "pxcdcvtracker.h"
#include "dcvRender.h"

4. Укажем путь к ранее созданному сценарию:

const pxcCHAR* trackerPath = L"../tracking/tracker.xml";

5. Подгрузим модуль:

bool computeModuleDirectory(void* iModule, pxcCHAR* oPath, DWORD pathLen)
{
  if (!::GetModuleFileNameW((HMODULE)iModule,oPath,pathLen)) {
    return false;
  }

  pxcCHAR* tmp = wcsrchr(oPath,L'\\');
  if (tmp==0) {
    return false;
  }
  *(tmp+1) = L'\0';
  return true;
}

6. Создадим сессию.

PXCSmartPtr<PXCSession> session;
    pxcStatus sts=PXCSession_Create(&session);

7. Загрузим модуль отслеживания из файла.

session->LoadImplFromFile(TEXT("dfusion4PCSDK.dll"));

8. Создадим рендер для отображения.

renderer=new dcvRender(L"D'Fusion CV Detection Sample");
renderer->addData(tracker);

9. Создадим точки синхронизации для чтения и обработки кадров.

for (int fnum=0;fnum<cmdl.m_nframes;fnum++) 
  {
    PXCSmartArray<PXCImage> images;
    PXCSmartSP sp1, sp2;

    /* Выполнение чтения и обработки кадров */
    sts=capture.ReadStreamAsync(images, &sp1);
    if (sts<PXC_STATUS_NO_ERROR) break;
    sts=tracker->ProcessImageAsync(images, &sp2);
    if (sts<PXC_STATUS_NO_ERROR) break;
    

    if(sp2) 
      sp2->Synchronize();

    if (!renderer->RenderFrame(images[0])) 
      break;
  }

10. Выгрузим модуль отслеживания.

session->UnloadImplFromFile(TEXT("dfusion4PCSDK.dll"));

11. После того, как объект распознан и отслеживается можно приступить к дополнению. В файле dcvRender.cpp мы получаем координаты позиции и ориентации нашего объекта. Имея эти значения, мы можем привязать к ним объекты дополненной реальности.

Создадим кисть желтого цвета:

hbrush = CreateSolidBrush(RGB(255, 255, 0));
hbrushOld = (HBRUSH)SelectObject(hdc, hbrush);

Нарисуем эллипс:

Ellipse(hdc,x0-rx,y0-ry,x0+rx,y0+ry);
SelectObject(hdc, hbrushOld);

Нарисуем еще несколько эллипсов.

Выведем имя отслеживаемого объекта:

TextOut(hdc, x0, y0, label, _tcslen(label));

label – это имя объекта, взятое из соответствующего узла XML файла сценария.

12. Запустив итоговую версию приложения, мы увидим следующее:

Результат работы приложения дополненной реальности

увеличить изображение
Результат работы приложения дополненной реальности

Окно справа отображает дополненное изображение, а окно слева выводит параметры отслеживаемого объекта.

< Лекция 6 || Самостоятельная работа 5: 123 || Лекция 7 >
Гульзия Калымова
Гульзия Калымова
Александр Радченко
Александр Радченко