重新加载openni动态库后,手跟踪无法正常工作

时间:2012-05-09 11:05:00

标签: kinect openni

我们的项目是(http://www.play4health.com/p4h_eng/)使用Ogre 3D 超过Ubuntu 11.04。除核心服务外,所有内容均基于利用Ogre 3d插件工具的插件架构。

在我们的插件架构中,插件可以是:

  • 视频游戏
  • 互动方法

用户配置他们的会话创建元组(视频游戏,交互 方法)。流程是一个会话是:  *用户加载他的会话。  *用户点击会话的其中一个元组并播放 具有特定交互方法的视频游戏。  *重复它直到结束会话的所有活动。

插件按需要动态加载/卸载。

其中一种交互方法是使用openni进行手动跟踪。什么是 问题?  * openni插件正在加载所有工作的完美时间。  *下次那个插件openni必须加载系统能够 检测手势但不进行手部跟踪。请注意,所有插件都是 在同一个过程中执行。现在只有解决方案是重启 平台。

这是我们的插件中的init和release 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;
  }

关于这个问题的任何想法?这段代码有什么问题吗?

1 个答案:

答案 0 :(得分:0)

也许你已经找到了解决方案......

我通常使用Java Wrapper,但我认为与我的代码不同的是我在创建生成器(Depth,Hands等)之后调用了contect.startGeneratingAll()。当我在启动时多次这样做时,我也遇到了问题。另一个不同之处是我在关机时使用了context.release。

我的程序通常是:

  • 初始化配置(许可证,节点,设置)
  • 创建生成器
  • 开始全部生成
  • 运行您的代码......
  • 停止生成所有
  • 上下文发布

来自OpenNI文档

  

XN_C_API void XN_C_DECL xnShutdown(XnContext * pContext)

     

关闭OpenNI上下文,销毁其所有节点。不要打电话   调用此函数后,此上下文的任何函数或任何相关节点   方法。注意:此函数会破坏上下文及其所有节点   等等,应该非常小心地使用。通常你应该   调用xnContextRelease()