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

Разработка приложения, используя SDK Анализ лица (мимики)

< Лекция 5 || Самостоятельная работа 4: 12 || Лекция 6 >
Аннотация: Разработка приложения с использованием модуля анализа лица Intel Perceptual Computing SDK.

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

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

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

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

2. Для упрощения работы воспользуемся уже готовыми приложениям face_render. Скопируйте и добавьте файлы landmark_detection.cpp и face_render.cpp из архива решения к проекту, как показано на рис. 9.1.

Подключение файлов к проекту

Рис. 9.1. Подключение файлов к проекту

Если в вашем проекте используются предварительно откомпилированные заголовки, то компиляция любого файла, не содержащего #include "stdafx.h", будет остановлена с ошибкой. Чтобы этого не случилось, в нашем случае необходимо сделать следующее: добавить в начало файлов landmark_detection.cpp и face_render.cpp строчку #include "stdafx.h"

Что бы было легче понять код, проанализируем по следующим этапам.

  • Первый шаг – это использование класса UtilPipeline для создания очень простого приложения и определение нового класса "FacePipeline", который является наследником утилитного класса. Класс FacePipeline необходим для генерации контрольных точек лица, в связи с тем, что эта функция не является частью утилитного класса UtilPipeline. Поэтому конструктор объявляет новый FaceRender и деконструктор чистит его.
class FacePipeline: public UtilPipeline {
public:
    FacePipeline(void):UtilPipeline() {
        m_face_render = NULL; 

        m_face_render = new  FaceRender(L"Face Viewer");
        EnableFaceLandmark();
    }

	~FacePipeline() {
		if (m_face_render != NULL) delete m_face_render;
	}
...
protected:
	FaceRender* m_face_render;
};
1. Создание нового класса FacePipeline
  • Для генерации контрольных точек, приложению необходимо применить функцию UtilPipeline::OnNewFrame, которая генерирует данные анализа лица, используя утилиту FaceRender. Функция OnNewFrame использует UtilPipeline::QueryFace() для запроса класса анализирующего лицо. Затем анализатор лица использует функцию PXCFaceAnalysis:: QueryFace() для запроса обнаруженного лица. Если лицо было обнаружено, тогда приложение должно запросить данные обнаружения или контрольных точек после динамического приведения к соответствующему модулю PXCFaceAnalysis::Landmark. В завершении обращение к FaceRender::SetLandmarkData используется для установки данных анализа лица, которые будут генерироваться, когда вызывается FaceRender::RenderFrame.
virtual bool OnNewFrame(void) { 
/* face */ 
PXCFaceAnalysis *faceAnalyzer = QueryFace(); 
PXCFaceAnalysis::Landmark *landmark = 
faceAnalyzer->DynamicCast<PXCFaceAnalysis::Landmark>(); 
// loop all faces 
m_face_render->ClearData(); 
for (int fidx = 0; ; fidx++) { 
pxcUID fid = 0; 
pxcU64 timeStamp = 0; 
pxcStatus sts = faceAnalyzer->QueryFace(fidx, &fid, &timeStamp); 
if (sts < PXC_STATUS_NO_ERROR) break; // no more faces 
m_face_render->SetLandmarkData (landmark, fid); 
} 
return(m_face_render->RenderFrame( 
QueryImage(PXCImage::IMAGE_TYPE_COLOR)) ); }
2. объявление функции OnNewFrame
  • Для обработки каждого фрейма захватываемого с видеопотока, вызывается в главной функции вызывается функция LoopFrames() для захвата и обработки каждого фрейма. Функция LoopFrames также вызывает функцию OnNewFrame для нахождения и генерации определенных данных.
FacePipeline* pipeline = new FacePipeline(); 
pipeline->LoopFrames(); 
delete pipeline;
3. Вызов функции LoopFrames() для захвата и обработки каждого фрейма

3. Теперь создадим приложение, которое будет использовать функцию по определению лица.

1 шаг

Сессия SDK – это самый первый объект приложения по определению лица, который должен быть создан для поддержания всех входов/выходов или алгоритмов модулей. Это создается вызовом функции PXCSession_Create. Приложение использует функции сессии для создания экземпляра модуля алгоритма определения лица, который являются частью интерфейса PXCFaceAnalysis. В начале приложение создает экземпляр интерфейса анализа лица PXCFaceAnalysis вызовом функции PXCSession::CreateImpl с идентификатором интерфейса PXCFaceAnalysis::CUID.

// Create a session PXCSession 
*session; PXCSession_Create(&session); 
// Create Face analyzer interface PXCFaceAnalysis 
*faceAnalyzer; session->CreateImpl(PXCFaceAnalysis::CUID, 
(void**)&faceAnalyzer);
4. Создание SDK сессии
< Лекция 5 || Самостоятельная работа 4: 12 || Лекция 6 >
Гульзия Калымова
Гульзия Калымова
Александр Радченко
Александр Радченко