Разработка приложения, используя SDK Анализ лица (мимики)
Дополнительный материал к лабораторной работе можно скачать здесь.
The Intel Perceptual Computing SDK представляет собой библиотеку, содержащую алгоритмы распознавания и обнаружения, реализованные через стандартные интерфейсы. SDK предоставляет набор алгоритмов анализа лица, включающий определения местоположения лица и его контрольных точек, распознавания лица и его атрибуты.
В этой лабораторн6ой работе мы рассмотрим, как использовать SDK для определения местоположения лица и обнаружения его контрольных точек, и как написать объявление для этих модулей анализа лица.
1. Для начала создайте новый пустой проект и настройте его для работы с Intel SDK, так это делали на практическом занятии №1.
2. Для упрощения работы воспользуемся уже готовыми приложениям face_render. Скопируйте и добавьте файлы landmark_detection.cpp и face_render.cpp из архива решения к проекту, как показано на рис. 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 сессии