我们的项目是(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;
}
关于这个问题的任何想法?这段代码有什么问题吗?
答案 0 :(得分:0)
也许你已经找到了解决方案......
我通常使用Java Wrapper,但我认为与我的代码不同的是我在创建生成器(Depth,Hands等)之后调用了contect.startGeneratingAll()。当我在启动时多次这样做时,我也遇到了问题。另一个不同之处是我在关机时使用了context.release。
我的程序通常是:
来自OpenNI文档
XN_C_API void XN_C_DECL xnShutdown(XnContext * pContext)
关闭OpenNI上下文,销毁其所有节点。不要打电话 调用此函数后,此上下文的任何函数或任何相关节点 方法。注意:此函数会破坏上下文及其所有节点 等等,应该非常小心地使用。通常你应该 调用xnContextRelease()