【问题标题】:hand tracking not working after a reload of openni dynamic library重新加载openni动态库后手部跟踪不起作用
【发布时间】:2012-07-23 13:26:17
【问题描述】:

我们的项目是 (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;
  }

对这个问题有任何想法吗?这段代码有问题吗?

【问题讨论】:

    标签: kinect openni


    【解决方案1】:

    也许您在此期间已经找到了解决方案...

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

    我的程序是正常的:

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

    来自 OpenNI 文档

    XN_C_API void XN_C_DECL xnShutdown (XnContext * pContext)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      相关资源
      最近更新 更多