Работа в D'Fusion Computer Vision, создание сценария отслеживания объекта
Интеграция 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";
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. Запустив итоговую версию приложения, мы увидим следующее:
Окно справа отображает дополненное изображение, а окно слева выводит параметры отслеживаемого объекта.