Распознавание жестов Kinect 3D на основе движений скелета. Какие библиотеки существуют? - PullRequest
5 голосов
/ 08 марта 2011

Какие библиотеки распознавания жестов (если таковые имеются) существуют для Kinect?Сейчас я использую OpenNI для записи движений скелета, но не знаю, как перейти от этого к запуску отдельных действий.

Моя проблема может быть такой же простой, как обнаружение позы, но она также может быть такой же сложной, как и основанная на временидвижения (то есть обнаружение, когда они двигают свою руку по кругу) в зависимости от того, насколько это сложно.Примеры, которые я видел для определения позы, были очень случайными - это потому, что общий алгоритм трудно сделать правильно?

Ответы [ 4 ]

5 голосов
/ 25 марта 2011

В библиотеке NITE (поверх OpenNI) есть классы для обнаружения смахивания и других жестов, но лично у меня были проблемы с одновременным использованием базовых библиотек OpenNI и NITE в C # (я продолжаю работать с AccessViolationExceptions).Если вы пишете управляемый код, XnVNITE.net.dll - это то, что имеет обнаружение пролистывания.Он находится в папке PrimeSense / NITE после установки NITE.

Если вы можете обойтись без скелета и распознавания пользователей, есть также библиотека ManagedNite.dll, которая является избыточной библиотекой, поставляемой с установкой PrimeSense NITE.ManagedNite.dll также имеет распознавание руки / жеста, но не обнаруживает скелет / пользователя.

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

static bool DetectSwipe(Point3D[] points)
{
    int LineSize = 10; // number of points in the array to look at
    int MinXDelta = 300; // required horizontal distance
    int MaxYDelta = 100; // max mount of vertical variation

    float x1 = points[0].X;
    float y1 = points[0].Y;
    float x2 = points[last].X;
    float y2 = points[last].Y;

    if (Math.Abs(x1 - x2) < MinXDelta)
        return false;

    if (y1 - y2 > MaxYDelta)
        return false;

    for (int i = 1; i < LineSize - 2; i++)
    {
        if (Math.Abs((points[i].Y - y1)) > MaxYDelta)
            return false;

        float result =
            (y1 - y1) * points[i].X +
            (x2 - x1) * points[i].Y +
            (x1 * y2 - x2 * y1);

        if (result > Math.Abs(result))
        {
            return false;
        }
    }
    return true;
}

Вы можете улучшить этот код, чтобы обнаруживать движение вправо или влево.Я также не включил вычисление времени в моем примере выше - вам нужно посмотреть на время первой и последней точки и определить, было ли проведено сканирование в течение определенного периода времени.

1 голос
/ 09 августа 2011

проверьте это: http://kinectrecognizer.codeplex.com/

поддерживает точную настройку 3D-трекинга и распознавания .. также должно быть легко повторным

0 голосов
/ 05 апреля 2011

Я работаю над автономным кодом обнаружения скелета для Kinect.http://code42tiger.blogspot.com

Я планирую выпустить его бесплатно, однако мне еще далеко до совершенства.Мне интересно, если ваше требование - только отслеживание положения рук, вы можете написать его самостоятельно, даже не используя OpenNI или любую другую библиотеку.Если вам нужен простой совет, прочитайте ниже.

1) Удаление фона (объяснено в моем блоге) 2) Обнаружение блобов (чтобы выбрать, какого человека отслеживать, также объясняется в блоге) 3) Отслеживание рук (теперь, когдау вас есть пользователь один в данных, вы можете легко найти руку, рассматривая самую дальнюю точку от тела.) 4) Отслеживайте положение руки, чтобы обнаружить жесты.(некоторые вычисления, которые отслеживают руку каждые несколько кадров, дадут вам геометрию движения)

Это должно работать (если не идеально) в 75% случаев.Если пользователь не пытается найти ошибку в алгоритме, он должен работать для обычных пользователей.

0 голосов
/ 09 марта 2011

Softkinetic выглядит многообещающе, но SDK пока еще не в свободном доступе.

...