可以从播放中更改AlternateViewPointCap或MirrorCap

Possible to change AlternateViewPointCap or MirrorCap from playback

本文关键字:AlternateViewPointCap MirrorCap 播放      更新时间:2023-10-16

我正在处理另一个人使用OpenNI记录器模块记录的一些数据。不幸的是,他们在录制过程中不小心将镜像功能设置为打开,所以我遇到了一些问题1。使用MirrorCap和2。使用AlternateViewPointCap将深度与rgb对齐。我尝试从我的深度节点访问这些功能,如下所示:

xn::Context ni_context;
xn::Player player;
xn::DepthGenerator g_depth;
xn::ImageGenerator g_image;
ni_context.Init();
ni_context.OpenFileRecording(oni_filename, player);
ni_context.FindExistingNode(XN_NODE_TYPE_DEPTH, g_depth);
ni_context.FindExistingNode(XN_NODE_TYPE_IMAGE, g_image); 
g_depth.GetMirrorCap().SetMirror(false);
g_depth.GetAlternativeViewPointCap().SetViewPoint(g_image);

然而,这并没有奏效。即使在我将镜像设置为false之后,g_depth上的IsMirrored()命令仍然返回true,alternativeviewpointcap也不会更改我从生成器接收到的depthmap。

我还尝试通过一个模拟节点:

xn::MockDepthGenerator m_depth;
m_depth.CreateBasedOn(g_depth);
m_depth.GetMirrorCap().SetMirror(false);
m_depth.GetAlternativeViewPointCap().SetViewPoint(g_image);
xn::DepthMetaData temp;
g_depth.GetMetaData(temp);
m_depth.SetMetaData(temp);

这也不会影响我从m_depth获得的深度图。我非常感谢任何关于如何使我的颜色和深度信息保持一致的建议,无论多么糟糕。这些数据很难记录,我需要以某种方式使用它。

我目前的解决方案是创建mock深度节点,并使用我自己的例程翻转所有像素,然后使用SetMetaData函数进行设置。然后,我使用OpenCV通过让用户单击4个点来创建从RGB图像到深度图像的透视变换。然后,我将此变换应用于rgb帧,以使值对齐。它并不完美,但它是有效的——然而,为了其他可能需要使用这些数据的人,我想做一个更合适的修复。

不幸的是,OpenNI中的一些设计决策显然受到Primesense SoC的影响,特别是SoC可以在硬件中进行深度->RGB注册和镜像。不幸的是,这意味着录制时生成器的输出就是您所拥有的。很抱歉

从Primesense驱动程序中的代码来看,他们是如何注册的(XnDeviceSensorV2/registration.cpp),他们似乎没有以您可以从OpenNI访问的方式导出镜头参数,这很不幸。我看到的唯一一个棘手的解决方案是修改和重新编译驱动程序以导出数据(注意,这是用户模式代码,所以没有那么糟糕。你可能想要分叉Avin2的SensorKinect)。

此外,仅供参考——mock生成器本身不做任何处理——NiRecordSynthetic示例显示了如何使用mock节点的示例。

除了Roee的答案之外,你还可以使用OpenNI从Kinect访问镜头数据,这有点棘手:你必须知道你想要的东西的名称和类型。例如,该代码提取深度生成器的ZeroPlanePixelSize和ZeroPlaneDance,这些深度生成器稍后用于将投影点转换为真实世界的点(它们随着设备的不同而变化)。

XnUInt64 zpd;
XnDouble zpps;
g_DepthGenerator.GetIntProperty("ZPD", zpd);
g_DepthGenerator.GetRealProperty("ZPPS", zpps);

通过查看Avin2Sensor文件并找到深度到RGB视点转换的实际位置,您可能可以获得所需的算法和运动学参数。

相关文章:
  • 没有找到相关文章