[Перевод] Технология Intel RealSense в игре Ombre Fabula с управлением жестами

ca09ca52c67e44198eb8f9c3bb51601a.png


Ombre Fabula — прототип приложения, в котором объединены традиции европейских и азиатских театров теней. В этом приложении используется Intel RealSense SDK для создания интерактивной игры с тенями с управлением при помощи жестов. В процессе разработки команде создателей игры (Тьи Бинь Минь Нгуен (Thi Binh Minh Nguyen) и члены компании Prefrontal Cortex) пришлось преодолеть целый ряд затруднений. В частности, потребовалось добиться, чтобы камера Intel RealSense точно распознавала различные жесты руки с помощью собственных алгоритмов обнаружения BLOB. Потребовалось провести обширное тестирование с участием множества пользователей.
Проект Ombre Fabula задумала Тьи Бинь Минь Нгуен (Thi Binh Minh Nguyen) в качестве учебного проекта для получения степени бакалавра. Затем с помощью компании дизайнеров-разработчиков Prefrontal Cortex этот проект был преобразован в интерактивную инсталляцию, работающую на ПК или ноутбуке, оборудованном камерой, направленной на пользователя. Минь объясняет, что возникло желание придать этому проекту новый интерактивный уровень, стереть границы между аудиторией и игроком.

Игроки попадают в таинственный двухмерный мир, населенный теневыми куклами. Пользователь вызывает на экран разных животных, складывая свои руки в соответствующие фигуры, например в виде кролика. Затем пользователь передвигает тень руки, чтобы управлять главным героем игры — ребенком, собирающим разноцветные фрагменты света, чтобы восстановить зрение своей бабушки.

Игра Ombre Fabula приняла участие в конкурсе Intel RealSense App Challenge 2014 года и заняла на нем второе место, уступив игре Ambassador.


Разработчики обладали опытом работы с более специализированными HID-устройствами, их привлекли широкие возможности технологии Intel RealSense с точки зрения жестов, отслеживания лица и распознавания голоса, хотя в конечном итоге в интерфейсе Ombre Fabula использовались только жесты.

▍Создание пользовательского интерфейса


При этом интерфейс приложения не переделывали путем доработки другого интерфейса, а создавали с нуля, с самого начала ориентируясь на управление руками и жестами. Кроме того, проект Ombre Fabula задумывался как интерактивная инсталляция с проецированием изображения на стену, в соответствии с традициями театров теней, и чтобы за изображениями могли наблюдать все находящиеся в комнате.

a0dc153bf8cc4470889ca20d3082331a.jpg


Проект Ombre Fabula задумывался как комнатная интерактивная инсталляция с как можно большим вовлечением участников. Здесь пользователь делает фигуру птицы.

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

Пользовательский интерфейс в Ombre Fabula нарочно сделан предельно минималистским: нет ни кнопок, ни курсоров, ни экранных меню, ни вообще каких-либо элементов управления, за исключением различных жестов руки, распознаваемых приложением. Приложение предназначено для использования в контролируемой среде инсталляции, где всегда есть ведущий, способный подсказать пользователям, что нужно делать. Дизайнеры этого проекта нередко создают крупные интерактивные инсталляции такого вида, а в Ombre Fabula они нарочно старались предложить пользователям короткое, но наиболее глубокое погружение в игровой мир, сравнимое с ощущениями в интерактивной галерее или в другом аналогичном месте. Поскольку время взаимодействия пользователя с игрой намеренно выбрано достаточно коротким, то для быстрого ознакомления пользователей с миром игры прямые указания ведущего действуют намного эффективнее, чем встроенные в игру учебные материалы. Пользовательский интерфейс, состоящий только из теней, также способствует более глубокому погружению в игровую атмосферу и в традиции театра теней.

885bb912c19946b79d549d93b98f6d4d.png


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

▍Реализация отслеживания рук


На начальном этапе разработки создатели игры использовали возможности Intel RealSense SDK по отслеживанию ладони и пальцев, чтобы воспринимать жесты рук, складывающихся в простые фигуры, например в форму кролика, птицы или дракона. Были выбраны именно эти фигуры, поскольку они являются наиболее традиционными для стиля театра теней, по мотивам которого создано это приложение, а также поскольку для пользователей такие фигуры являются самыми простыми и интуитивно понятными. Чтобы сделать фигуру кролика, нужно соединить большой и указательный пальцы одной руки, выпрямив средний и безымянный пальцы так, чтобы они изображали «уши» кролика. Чтобы получить фигуру птицы, нужно сцепить большие пальцы обеих рук, выпрямив пальцы в стороны наподобие «крыльев». Чтобы получить фигуру дракона, нужно свести две руки рядом так, чтобы получилась «закрывающаяся зубастая челюсть».

f78fb0be2a574025a7e9568dec15c5af.jpg


Простые жесты руки позволяют создать кролика, птицу и дракона.

Впрочем, быстро выяснилось, что алгоритмы Intel RealSense SDK не могли правильно обрабатывать тени из-за неоднородной видимости: пальцы сливались вместе и пересекались в одной плоскости. Камера Intel RealSense распознавала простейшие жесты (растопыренные пять пальцев, знак «V» указательным и средним пальцами, поднятый большой палец и т. д.), но этого было недостаточно для требовавшегося распознавания более сложных фигур животных.

Поэтому разработчикам пришлось отказаться от встроенных функций отслеживания рук Intel RealSense SDK и использовать алгоритм обнаружения BLOB-объектов, который отслеживает контуры рук. Этот алгоритм выдает маркированные изображения, например изображение левой руки, после чего Intel RealSense SDK выдает контуры этого изображения.

f49be0ea22194145aa0860903b4d34dd.png


На этом рисунке жесты птицы, дракона и кролика показаны с маркированными контурами рук, благодаря чему Ombre Fabula распознает разные жесты.

Сначала извлечь необходимые данные контуров из Intel RealSense SDK было непросто. Интеграция Unity* отлично подходит для отслеживания ладоней и пальцев, но непригодна для эффективного отслеживания контуров. Впрочем, ознакомившись с документацией и поработав с Intel RealSense SDK, разработчики научились извлекать подробные данные контуров, необходимые для распознавания нестандартных фигур.

9fdd241706df4cce94c4785c871ccb53.jpg


Пользователь складывает пальцы в фигуру кролика, чтобы на экране появилась теневая кукла кролика.

84cdb461c2204e5780b3cfe91ca2ec1d.jpg


Пользователь двигает рукой, чтобы вести кролика по игровому миру и собирать точки желтого света.

▍Использование собственного алгоритма обнаружения BLOB


После получения данных BLOB из Intel RealSense SDK требовалось упростить эти данные, чтобы распознавание эффективно работало для каждой из трех фигур: кролика, птицы и дракона. Этот процесс оказался сложнее, чем можно было предполагать; потребовалось обширное тестирование и множество доработок, чтобы упростить фигуры для повышения вероятности их однородного и точного распознавания приложением.

// Code snippet from official Intel "HandContour.cs" script for blob contour extraction

int numOfBlobs = m_blob.QueryNumberOfBlobs();
PXCMImage[] blobImages = new PXCMImage[numOfBlobs];

for(int j = 0; j< numOfBlobs; j++)
{
        blobImages[j] = m_session.CreateImage(info);


        results = m_blob.QueryBlobData(j,  blobImages[j], out blobData[j]);
        if (results == pxcmStatus.PXCM_STATUS_NO_ERROR && blobData[j].pixelCount > 5000)
        {
                results = blobImages[j].AcquireAccess(PXCMImage.Access.ACCESS_WRITE, out new_bdata); 
                blobImages[j].ReleaseAccess(new_bdata);
                BlobCenter = blobData[j].centerPoint;
                float contourSmooth = ContourSmoothing;
                m_contour.SetSmoothing(contourSmooth);
                results = m_contour.ProcessImage(blobImages[j]);
                if (results == pxcmStatus.PXCM_STATUS_NO_ERROR && m_contour.QueryNumberOfContours() > 0)
                {
                        m_contour.QueryContourData(0, out pointOuter[j]);
                        m_contour.QueryContourData(1, out pointInner[j]);
                }
        }
}

Для получения данных контуров из Intel RealSense SDK используется код извлечения контуров.

После этого упрощенные данные обрабатывали алгоритмом $P Point-Cloud Recognizer*. Это свободно доступный алгоритм, часто использующийся для распознавания символов, таких как рукописные штрихи. Разработчики внесли в этот алгоритм некоторые незначительные доработки и добились его правильной работы в Unity, а затем применили его для определения формы рук в Ombre Fabula. Алгоритм определяет (с вероятностью порядка 90%), фигуру какого животного изображают руки пользователя, после чего распознанная фигура отображается на экране.

// every few frames, we test if and which animal is currently found
void DetectAnimalContour () {
        // is there actually a contour in the image right now?
        if (handContour.points.Count > 0) {
                // ok, find the most probable animal gesture class
                string gesture = DetectGestureClass();
                // are we confident enough that this is one of the predefined animals?
                if (PointCloudRecognizer.Distance < 0.5) {
                        // yes, we are: activate the correct animal
                        ActivateAnimalByGesture(gesture);
                }
        }
}

// detect gesture on our contour
string DetectGesture() {
        // collect the contour points from the PCSDK
        Point[] contourPoints = handContour.points.Select (x => new Point (x.x, x.y, x.z, 0)).ToArray ();

        // create a new gesture to be detected, we don't know what it is yet
        var gesture = new Gesture(contourPoints, "yet unknown");

        // the classifier returns the gesture class name with the highest probability
        return PointCloudRecognizer.Classify(gesture, trainingSet.ToArray());
}

// This is from the $P algorithm
// match a gesture against a predefined training set
public static string Classify(Gesture candidate, Gesture[] trainingSet) {
        float minDistance = float.MaxValue;
        string gestureClass = "";
        foreach (Gesture template in trainingSet) {
                float dist = GreedyCloudMatch(candidate.Points, template.Points);
                if (dist < minDistance) {
                        minDistance = dist;
                        gestureClass = template.Name;
                        Distance = dist;
                }
        }
        return gestureClass;
}

Код использует алгоритм $P, чтобы определить, фигуру какого животного изображают руки пользователя.
На самом раннем этапе разработки создатели игры поняли, что все люди складывают фигуры животных несколько по-разному, не говоря уже о том, что у всех людей различается и форма рук, и их размер. Из этого следовало, что для отладки обнаружения контуров требовалось тестировать алгоритм обнаружения с участием множества людей.

К счастью, это оказалось возможным: поскольку Минь учится в университете, оказалось несложно найти около 50 добровольцев из числа студентов этого университета и пригласить их для тестирования приложения. Поскольку в игре используется небольшое число жестов, такого количества людей оказалось достаточно для оптимизации алгоритма определения контуров и повышения вероятности распознавания именно того животного, которое пользователь пытается изобразить жестом руки.

66f131ed8da74a3da4bfa88135bb5288.jpg


При движении рук влево или вправо движется камера, а главный герой игры следует за животным по миру теней.

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

Одна из распространенных проблем, связанных с распознаванием жестов, состоит в том, что пользователи могут сделать очень быстрый жест (например, поднять большой палец), из-за чего приложение может не успеть отреагировать. В Ombre Fabula жесты являются непрерывными, это необходимо, чтобы нужное животное было на экране. Тестирование показало, что благодаря постоянству жестов приложение успевало правильно на них отреагировать. Никакой оптимизации с точки зрения скорости реагирования приложения на жесты не потребовалось.

Игра Ombre Fabula оптимизирована для кратковременных игровых сеансов продолжительностью 6–10 минут. Люди, привлеченные для тестирования, отметили, что не возникает никакой усталости кистей и предплечий, поскольку пользователи естественным образом привыкли держать руки поднятыми в течение определенного времени.


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

▍Intel RealSense SDK


Пакет Intel RealSense SDK использовали для сопоставления контуров рук, для чего очень пригодилась документация по отслеживанию контуров, входящая в состав SDK. Разработчики также использовали образцы Unity, предоставленные корпорацией Intel, когда сначала пробовали работать со встроенными возможностями отслеживания рук. Одного лишь отслеживания рук оказалось недостаточно, поэтому перешли к изображениям и реализовали собственный алгоритм отслеживания BLOB-объектов.

▍Программное обеспечение Unity


И Минь, и члены команды Prefrontal Cortex считают себя в первую очередь дизайнерами, им важно не тратить время на разработку платформ и написание кода, а быстро воплощать замыслы в действующие прототипы. В этом отношении платформа Unity позволила быстро создавать прототипы и переходить к дальнейшим этапам разработки. Кроме того, выяснилось, что набор инструментов Intel RealSense Unity в составе Intel RealSense SDK удобен в использовании и позволяет быстро приступить к работе.

▍$P Point-Cloud Recognizer


$P Point-Cloud Recognizer — это двухмерный программный алгоритм распознавания жестов, определяющий (с некоторым уровнем вероятности), в какую фигуру складываются штрихи ручки на бумаге или аналогичные графические данные. Этот алгоритм часто используется для быстрого создания прототипов в пользовательских интерфейсах с управлением жестами. Разработчики несколько изменили этот алгоритм и использовали его в Unity для определения фигуры, образованной руками пользователя, в Ombre Fabula. Подсчитывая вероятность, алгоритм решает, какое из животных пытается изобразить пользователь, и приложение отображает соответствующее изображение животного.

e117bb668aa047e6844d1e8002020dae.jpg


Чтобы появился дракон, нужно сложить две руки так, чтобы получились «челюсти», как показано на этом снимке экрана.
Ombre Fabula обладает очевидным потенциалом для дальнейшего развития и добавления других теневых фигурок животных, создаваемых и управляемых пользователями, хотя в данное время разработчики не планируют дальше работать над этой игрой. Их конечная цель — устроить международное турне с Ombre Fabula и демонстрировать ее зрителям в виде интерактивной инсталляции, что задумывалось с самого начала.


Феликс Хербст (Felix Herbst) из команды Prefrontal Cortex твердо уверен в том, что системы управления с помощью жестов необходимо создавать с нуля, а попытки адаптировать существующие приложения к управлению с помощью жестов в большинстве случаев приведут к неудобству пользователей. Он подчеркивает важность анализа соответствующих сильных сторон всех возможных интерфейсов управления (включая и управление жестами) и выбор наиболее подходящей модели при разработке приложения.
Правильно подобранные, полезные и эффективные способы взаимодействия крайне важны для долгосрочного распространения технологий с естественными интерфейсами. Хербст считает, что если достаточное количество разработчиков станет использовать технологию Intel RealSense, то подобные типы интерфейсов получат широкое распространение в будущем.

© Habrahabr.ru