Опубликован: 23.08.2014 | Уровень: для всех | Доступ: платный | ВУЗ: Северный (Арктический) федеральный университет им. М.В. Ломоносова
Практическая работа 1:

Решение образовательных задач с применением Intel Perceptual Computing SDK

< Лекция 3 || Практическая работа 1 || Лекция 4 >

Дополнительные материалы к работе можно скачать здесь.

Цель данной практической работы заключается в использовании возможностей Intel Perceptual Computing SDK для разработки интерактивных приложений, носящих образовательный характер.

В данной работе будет рассмотрено применение возможностей SDK по распознаванию физических объектов для написания интерактивного приложения "Geo quiz".

Приложение "Geo quiz"

Спектр форм применения возможностей SDK по распознаванию физических объектов довольно широк, однако, в данной практической работе мы рассмотрим процесс написания образовательного приложения, затрагивающего вопросы повышения знаний в области географии.

Приложение "Geo quiz" позволит школьникам средних классов более эффективно и в ненавязчивой манере изучить географические факты и флаги различных государств.

Сценарий работы приложения

Приложение включает в себя некоторую базу данных фактов о том или ином государстве и изображения флагов этих государств. На экран выводится вопрос о государстве и для ответа на него пользователю необходимо показать карточку с флагом этого государства. За правильные ответы присуждаются баллы.

Реализация

D'Fusion Studio CV

Для реализации функционала приложения мы будем использовать инструмент D'Fusion Studio Computer Vision (иначе D'FusionCV), входящий в состав Intel Perceptual Computing SDK. Напомним, что D'FusionCV представляет собой пакет программного обеспечения для получения "естественной" информации, предоставляемой различными реальными объектами, распознанными в изображении или видео потоке. Собрав данные, объект может быть идентифицирован и отслежен через последовательные изображения из видео потока в режиме реального времени.

Пакет D'FusionCV по умолчанию устанавливается на компьютер совместно с Intel Perceptual Computing SDK. Запустить пакет можно из "Intel Perceptual Computing SDK 2013 -> Tools -> D'Fusion Studio CV - Intel PCSDK". (или C:\Program Files (x86)\Intel\PCSDK\contrib\Total Immersion\StudioCV)

Создание сценария

Для того чтобы использовать функционал отслеживания объектов, необходимо сперва создать и настроить свой сценарий, используя D'Fusion Studio CV. В большинстве случаев сценарий предполагает создание следующих элементов:

  • XML файл конфигурации, содержащий настройки сценария (обычно "tracker.xml");
  • XML файл конфигурации, содержащий результаты калибровки камеры (обычно "cameraCalib.xml");
  • XML файл конфигурации, содержащий настройки захвата изображения (обычно "cameraConfig.xml");
  • Изображения, соответствующие отслеживаемому объекту;
  • Двоичные файлы, которые могут быть использованы для хранения объектов статистических структур (для поддержания процесса распознавания).

В данной лабораторной работе мы создадим отдельный сценарий. Кратко напомним процесс создания сценария отслеживания объекта.

  1. Запустите D'Fusion Studio Computer Vision и на вкладке Video Manager нажмите кнопку Open для начала захвата изображения с камеры.

  2. На вкладке Scenario Manager создайте несколько отслеживаемых объектов (карточек с флагами государств), задав им соответствующие имена. Также создайте ключевой кадр для каждого объекта.

  3. На вкладке Tracking Manager проверьте результат работы вашего сценария.

  4. Сохраните сценарий, оставив имена файлов, предложенные по умолчанию.

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

  1. Для начала создайте новый проект Project.cpp и настройте его для работы с Intel PerC SDK, как это делали ранее. Добавьте SDK библиотеки libpxc_d.lib и libpxcutils_d.lib в Additional Dependencies Linker > Input.
  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"../scen/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"));
          

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

В данной практической работе нас интересует только имя объекта

Для отображения информации обо всех объектах сценария изменим код файла dcvRender.cpp, добавив цикл.

for (int tt = 0; tt < 3; tt++)
   {
  PXCDCVTracker::TrackingStatus status = m_tracker->GetTargetStatus(tt);
  pxcI32 index = m_tracker->GetTrackedKeyFrameIndex(0);

  if((status == PXCDCVTracker::STATUS_TRACKING) || (index != -1))
  {
   int targetTracked = m_tracker->GetTrackedKeyFrameIndex(tt);
	}
	}
    
  • Переменная tt - номер объекта в текущем сценарии;
  • Переменная status - сообщает о том, что объект отслеживается. Статут получается при помощи метода dcvTracker::GetTargetStatus;
  • Переменная index содержит индекс ключевого кадра или -1, если ключевой кадр не распознан. Индекс получается при помощи метода dcvTracker::GetTrackedKeyframeIndex.

Для выполнения каких-либо действий при появлении объекта в видео потоке с камеры нам необходимо получить имя объекта. Для этого добавим следующий код:

wstring atr;
const pxcCHAR* label = m_tracker->GetTargetName(tt);//
	atr = label;
	wprintf(L"%s\n",label);
    
  • Метод dcvTracker::GetTargetName позволяет получить имя объекта;
  • Переменная atr типа wstring понадобится нам в дальнейшем для передачи имени объекта во внешний модуль.

Перейдем в Project.cpp.

Добавим extern wstring atr для передачи имени объекта в текущий модуль.

Теперь, получая имя объекта, добавим действия. В нашем случае, приложение будет задавать вопросы о государствах мира, а в качестве ответов будет получать карточки с флагами.

Добавим вопрос:

wprintf(L"The only country in the world washed by 12 seas\n");
int f = 0;
    

Добавим соответствующий ответ на этот вопрос:

if ((atr == L"Russia") && (f == 0))
		{wprintf(L"Right\n");
		 f=1;}
    

Таким образом, в результате мы получаем консольное окно для отображения вопросов и ответов и рендер.



Дополнительное задание

  1. Измените код таким образом, чтобы приложение могло работать с группой объектов и определяло не только имя, но и координаты позиции объектов.
  2. Основываясь на координатах, попробуйте проверить, правильно ли расположены объекты друг относительно друга.

    К примеру, на контурной карте Европы Франция граничит с Испанией, а Испания в свою очередь граничит с Португалией. Имея три карточки с контурами этих государств, проверьте правильность их совмещения.


< Лекция 3 || Практическая работа 1 || Лекция 4 >
Дмитрий Юнушкин
Дмитрий Юнушкин

В лабораторной работе №2 (идентификация лица) сказано:

в FaceTracking.cs: удалим или закомментируем функцию SimplePipelineкласс MyUtilMPipeline и изменим функцию AdvancedPipeline...

Класса MyUtilMPipeline  нет в проекте вообще;

Функции AdvancedPipeline так же нет. Материалов к лабораторной  №2 в начале работы (по ссылке открывается та же страница) тоже нет.Это ошибки или используется другая версия примера?

Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Дмитрий Юнушкин
Дмитрий Юнушкин
Россия, г. Пенза