В лабораторной работе №2 (идентификация лица) сказано: - в FaceTracking.cs: удалим или закомментируем функцию SimplePipeline, класс MyUtilMPipeline и изменим функцию AdvancedPipeline... Класса MyUtilMPipeline нет в проекте вообще; Функции AdvancedPipeline так же нет. Материалов к лабораторной №2 в начале работы (по ссылке открывается та же страница) тоже нет.Это ошибки или используется другая версия примера? |
Применение возможностей Intel Perceptual Computing SDK для расширения границ взаимодействия людей с ограниченными возможностями с внешним миром
Дополнительные материалы к работе можно скачать здесь и здесь.
Перед началом выполнения работы необходимо настроить проект для работы с SDK. Подробно о том, как настраивать проект, было описано в первой части курса. Здесь мы только кратко напомним, что необходимо для настройки. В Проект -> Свойства добавим:
- В Каталоги VC++ -> Каталоги включения: $(PCSDK_DIR)/include и $(PCSDK_DIR)/sample/common/include;
- В Каталоги VC++ -> Каталоги библиотек: $(PCSDK_DIR)/lib/$(Platform) и $(PCSDK_DIR)/sample/common/lib/$(Platform)/$(PlatformToolset);
- В Компоновщик -> Ввод-> Дополнительные зависимости: libpxc_d.lib, libpxcutils_d.lib и msimg32.lib;
- В С/С++ -> Создание кода -> Библиотека времени выполнения: Многопоточная отладка (/MTd).
Упражнение 2.1
Как уже говорилось в лекции, программа может не корректно определять пальцы участвующее в жесте. Для проверки этого факта создадим небольшое приложении, в котором будем помечать кончики пальцев разноцветными маркерами.
В основе приложения конвейерный класс UtilPipeline (пример 2.1), функция EnableGesture() - вызывается когда распознан жест или определен геометрический узел, функция OnGesture() вызывается, когда распознан жест или геометрический узел; функция OnNewFrame() вызывается для обработки данных нового кадра.
Для обозначения кончиков пальцев разноцветными маркерами напишем следующий код, представленный в примере 2.2. Создадим структуру skeletons[], где перечислим все необходимые нам геометрические узлы. Например, в данном приложении будем использовать кончики всех пальцев левой руки. Каждому кончику пальца присвоен свой цвет, и обозначен радиус маркера. При этом необходимо предварительно прописать необходимые цвета, как это показано в примере 2.3. Функция MapXY() используется для перевода координатного пространства глубинного изображения к RGB и обратно.
В приложении 1 приведен код упражнения 2.1.
class GesturePipeline: public UtilPipeline { public: GesturePipeline (void):UtilPipeline(),m_render(L"Gesture Viewer") { EnableGesture(); } virtual void PXCAPI OnGesture(PXCGesture::Gesture *data) { PXCGesture* gest=QueryGesture(); if (data->active) m_gdata = (*data); } virtual bool OnNewFrame(void) { return m_render.RenderFrame(QueryImage(PXCImage::IMAGE_TYPE_DEPTH),QueryGesture(), &m_gdata); } protected: GestureRender m_render; PXCGesture::Gesture m_gdata; };2.1. Использование конвейерного класса UtilPipeline в приложении
static struct { PXCGesture::GeoNode::Label label; COLORREF color; int raduis; } skeletons[]={ { PXCGesture::GeoNode::LABEL_BODY_HAND_LEFT|PXCGesture::GeoNode::LABEL_FINGER_THUMB, COLOR_GREEN, 2 }, { PXCGesture::GeoNode::LABEL_BODY_HAND_LEFT|PXCGesture::GeoNode::LABEL_FINGER_INDEX, COLOR_RED, 2 }, { PXCGesture::GeoNode::LABEL_BODY_HAND_LEFT|PXCGesture::GeoNode::LABEL_FINGER_MIDDLE, COLOR_BLUE, 2 }, { PXCGesture::GeoNode::LABEL_BODY_HAND_LEFT|PXCGesture::GeoNode::LABEL_FINGER_RING, COLOR_YELLOW, 2 }, { PXCGesture::GeoNode::LABEL_BODY_HAND_LEFT|PXCGesture::GeoNode::LABEL_FINGER_PINKY, COLOR_PINK, 2 } };2.2. Создание структуры с перечислением геометрических узлов
// задаем значения цветов в RGB палитре #define COLOR_RED RGB(255,0,0) #define COLOR_GREEN RGB(0,255,0) #define COLOR_BLUE RGB(0,0,255) #define COLOR_YELLOW RGB(255,255,0) #define COLOR_PINK RGB(255,0,255)2.3. Перечисление значения цветов в RGB палитре
На рисунке 2.1 представлены результаты работы приложения, которое цветными маркерами обозначает кончики пальцев. При тестировании можно сделать выводы, что приложение не всегда корректно определяет представленные пальцы.
1а | 1б |
Рис. 2.1. Результаты распознавания кончиков пальцев: 1а - Результат распознавания, когда доступны все кончики пальцев ладони; 1б - Результат распознавание кончиков пальцев, когда доступны не все кончики пальцев |
Упражнение 2.2
В этом упражнении мы создадим приложение по распознаванию жестового обозначения цифр, представленного на рисунке 2.2.
Для начала необходимо описать геометрические узлы - кончики пальцев, которые участвуют в распознаваемых жестах.
Модуль SDK позволяет отслеживать геометрические узлы на каждом кадре, для этого используется функция QueryNodeData, которая извлекает данные о геометрических узлах. Геометрическая метка узла всегда состоит из двух частей: метки тела и локальной детализирующей метки. В примере 2.4 создадим метку геометрическую метку указательного пальца. Описание геометрического узла необходимо добавлять в функцию OnNewFrame(), которая вызывается когда новый кадр готов к обработке.
PXCGesture::GeoNode indexNode; //указательный палец gest-> QueryNodeData(0,PXCGesture::GeoNode::LABEL_BODY_HAND_PRIMARY|PXCGesture::GeoNode::LABEL_FINGER_INDEX, &indexNode);2.4. Описание геометрического узла указательного пальца
Теперь можем получить координаты (x,y) кончика пальца indexNode.positionImage.x и indexNode.positionImage.y.
Для создания приложения по распознаванию жестового обозначения цифр необходимо определять доступен ли палец в кадре. Для начала добавим метки геометрических узлов всех пальцев, как показано в примере 2.5. Следующим шагом необходимо определить доступен ли палец в кадре. Если координаты пальца больше нуля, то палец доступен в кадре (indexNode.positionImage.x>0 && indexNode.positionImage.y).
PXCGesture::GeoNode indexNode; //указательный палец gest->QueryNodeData(0,PXCGesture::GeoNode::LABEL_BODY_HAND_PRIMARY|PXCGesture::GeoNode::LABEL_FINGER_INDEX, &indexNode); PXCGesture::GeoNode ringNode; //безымянный палец gest->QueryNodeData(0,PXCGesture::GeoNode::LABEL_BODY_HAND_PRIMARY|PXCGesture::GeoNode::LABEL_FINGER_RING, &ringNode); PXCGesture::GeoNode pinkyNode; //мизинец gest->QueryNodeData(0,PXCGesture::GeoNode::LABEL_BODY_HAND_PRIMARY|PXCGesture::GeoNode::LABEL_FINGER_PINKY, &pinkyNode); PXCGesture::GeoNode middle; //средний палец gest->QueryNodeData(0,PXCGesture::GeoNode::LABEL_BODY_HAND_PRIMARY|PXCGesture::GeoNode::LABEL_FINGER_MIDDLE, &middle); PXCGesture::GeoNode thumb; //большой палец gest->QueryNodeData(0,PXCGesture::GeoNode::LABEL_BODY_HAND_PRIMARY|PXCGesture::GeoNode::LABEL_FINGER_THUMB, &thumb);2.5. Описание геометрических узлов всех пальцев
Следующий код, представленный в примере 2.6, позволяет распознавать жестовое обозначение цифр 1, 2, 3 и 4.
PXCGesture* gest=QueryGesture(); int i=0; int t=0; int m=0; int r=0; int p=0; PXCGesture::GeoNode indexNode; //указательный палец gest->QueryNodeData(0,PXCGesture::GeoNode::LABEL_BODY_HAND_PRIMARY|PXCGesture::GeoNode::LABEL_FINGER_INDEX, &indexNode); PXCGesture::GeoNode ringNode; //безымянный палец gest->QueryNodeData(0,PXCGesture::GeoNode::LABEL_BODY_HAND_PRIMARY|PXCGesture::GeoNode::LABEL_FINGER_RING, &ringNode); PXCGesture::GeoNode pinkyNode; //мизинец gest->QueryNodeData(0,PXCGesture::GeoNode::LABEL_BODY_HAND_PRIMARY|PXCGesture::GeoNode::LABEL_FINGER_PINKY, &pinkyNode); PXCGesture::GeoNode middle; //средний палец gest->QueryNodeData(0,PXCGesture::GeoNode::LABEL_BODY_HAND_PRIMARY|PXCGesture::GeoNode::LABEL_FINGER_MIDDLE, &middle); PXCGesture::GeoNode thumb; //большой палец gest->QueryNodeData(0,PXCGesture::GeoNode::LABEL_BODY_HAND_PRIMARY|PXCGesture::GeoNode::LABEL_FINGER_THUMB, &thumb); if (indexNode.positionImage.x>0 && indexNode.positionImage.y) i=1; //проверка на присутствие пальца в кадре if (middle.positionImage.x>0 && middle.positionImage.y) m=1; if (ringNode.positionImage.x>0 && ringNode.positionImage.y) r=1; if (thumb.positionImage.x>0 && thumb.positionImage.y) t=1; if (pinkyNode.positionImage.x>0 && pinkyNode.positionImage.y) p=1; if (i==1 && m==0 && r==0 && t==0 && p==0) wprintf(L"1\n"); if (i==1 && m==1 && r==0 && t==0 && p==0) wprintf(L"2\n");2.6.
Дополнительное задание: Реализуйте остальные цифры. Для реализации цифры 10 используйте уровень открытости/закрытости ладони.