отслеживание рук не работает после перезагрузки динамической библиотеки openni

Наш проект (http://www.play4health.com/p4h_eng/) использует Ogre 3D вместо Ubuntu 11.04. За исключением основных служб, все они основаны на архитектуре плагинов, использующей преимущества Ogre 3d плагинов.

В нашей архитектуре плагинов плагины могут быть:

  • Видеоигры
  • Способы взаимодействия

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

Плагин загружается/выгружается динамически по требованию.

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

Это код для инициализации и выпуска OpenNI в нашем плагине.

  bool IPKinectPlugin::onInitialise()
  {
    mHandPointer.mId = "KinectHandPointer";
    mHandPointer.mHasAbsolute = true;
    mHandPointer.mHasRelative = false;

    XnStatus nRetVal = XN_STATUS_OK;

    nRetVal = gContext.InitFromXmlFile(String(this->getPluginInfo()-
  >getResPath() + "SamplesConfig.xml").c_str());
    CHECK_RC(nRetVal, bContext, "InitFromXml");

  #if SHOW_DEPTH
    nRetVal = gContext.FindExistingNode(XN_NODE_TYPE_DEPTH,gDepthGenerator);
    bDepthGenerator = (nRetVal != XN_STATUS_OK);
    if (bDepthGenerator)
    {
    nRetVal = gDepthGenerator.Create(gContext);
    CHECK_RC(nRetVal, bDepthGenerator, "Find Depth generator");
    }
  #endif


    nRetVal = gContext.FindExistingNode(XN_NODE_TYPE_USER, gUserGenerator);
    bUserGenerator = (nRetVal != XN_STATUS_OK);
    if (/*bUserGenerator*/false)
    {
    nRetVal = gUserGenerator.Create(gContext);
    CHECK_RC(nRetVal, bUserGenerator, "Find user generator");
    }

    nRetVal = gContext.FindExistingNode(XN_NODE_TYPE_GESTURE, gGestureGenerator);
    bGestureGenerator = (nRetVal != XN_STATUS_OK);
    if (bGestureGenerator)
    {
    nRetVal = gGestureGenerator.Create(gContext);
    CHECK_RC(nRetVal, bGestureGenerator, "Find gesture generator");

    XnCallbackHandle hGestureCallbacks;
    gGestureGenerator.RegisterGestureCallbacks(gestureRecognized, gestureProcess, 0,
        hGestureCallbacks);
    }

    nRetVal = gContext.FindExistingNode(XN_NODE_TYPE_HANDS,gHandsGenerator);
    bHandsGenerator = (nRetVal != XN_STATUS_OK);
    if (bHandsGenerator)
    {
    nRetVal = gHandsGenerator.Create(gContext);
    CHECK_RC(nRetVal, bHandsGenerator, "Find hands generator");

    XnCallbackHandle hHandsCallbacks;
    gHandsGenerator.RegisterHandCallbacks(handsNew, handsMove,handsLost, 0, hHandsCallbacks);
    }

    nRetVal = gContext.FindExistingNode(XN_NODE_TYPE_DEVICE, gDevice);
    bDevice = (nRetVal != XN_STATUS_OK);

    gContext.RegisterToErrorStateChange(onErrorStateChanged, NULL, hDummyCallbackHandle);

    //Preparo la textura para la webcam
    if (bGenerateRGBTexture)
    mWebcamTexture = KinectTools::createDepthTexture("KinectWebCamTexture", sPluginName);

    return true;
  }
  //-----------------------------------------------------------------------------

  bool IPKinectPlugin::onShutdown()
  {
    if (bContext)
    {
    if (bHandsGenerator)
    {
        gHandsGenerator.StopTrackingAll();
    }
    if (bGestureGenerator)
    {
        gGestureGenerator.RemoveGesture(GESTURE_TO_USE);
        gGestureGenerator.RemoveGesture(GESTURE_TO_START);
    }
    gContext.StopGeneratingAll();
    gContext.Shutdown();
    }

    return true;
  }

Любая идея об этой проблеме? Что-то не так с этим кодом?


person user560500    schedule 09.05.2012    source источник


Ответы (1)


Возможно, вы уже нашли решение за это время...

Обычно я работаю с Java Wrapper, но отличие от моего кода заключается в том, что я вызываю contect.startGeneratingAll() после создания генераторов (Depth, Hands и т. д.). У меня также были проблемы, когда я делал это несколько раз при запуске. Еще одно отличие состоит в том, что я использую context.release при завершении работы.

Моя процедура обычно:

  • Начальная конфигурация (лицензия, узлы, настройки)
  • Создать генераторы
  • Начать генерировать все
  • Запустите свой код...
  • Прекратить генерировать ВСЕ
  • Выпуск контекста

Из документации OpenNI

XN_C_API недействителен XN_C_DECL xnShutdown ( XnContext * pContext )

Закрывает контекст OpenNI, уничтожая все его узлы. Не вызывайте никаких функций этого контекста или любого связанного узла после вызова этого метода. ПРИМЕЧАНИЕ: эта функция уничтожает контекст и все узлы, которые она содержит, поэтому ее следует использовать очень осторожно. Обычно вы должны просто вызвать xnContextRelease()

person FSaccilotto    schedule 23.07.2012