4

我正在研究运动应用程序中的结构,并跟踪放置在对象上的一些标记以确定对象的刚性结构。如何处理来自运动优化/束调整的结构中缺失的数据

该应用程序本质上是对多个摄像机视图使用标准Levenberg-Marquardt优化,并最大限度地减少预期标记点与2D视图中从每个视图获取的标记点之间的差异。

对于每个标记点,并且每个查看下面的函数被最小化:

double diff = calculatedXY[index] - observedXY[index] 

凡calculatedXY值取决于许多需要通过优化被发现和observedXY是在标志点位置未知参数的2D。总的来说,我有(标记点*视图)函数的数量,如上面我想要最小化的函数。

我已经编码了一个模拟摄像机看到所有的标记点,但我想知道如何处理运行过程中的情况点是不可见的,由于照明,遮挡或只是不在相机视图。在应用程序的真实运行中,我将使用网络摄像头查看对象,因此很可能不是所有标记都会一次显示,并且取决于我的计算机视觉算法的稳健性,我可能无法检测到标记一直。

我想在设置diff值为0(西格玛平方差= 0)的情况下,标记点不能被观察到,但是这会扭曲结果吗?

我注意到的另一件事是,当呈现太多的视图时,算法不是很好。当提出太多观点时,更可能估计出一个糟糕的解决方案。这是捆绑调整的一个常见问题,因为在呈现太多视图时,由于遇到局部最小值的可能性增加了?

回答

1

通常的做法是忽略与缺失标记相对应的术语。 IE浏览器。如果术语没有observedXY,则不要尽量减少calculateXY-observedXY。没有必要将任何东西设置为零,你甚至不应该首先考虑这个术语 - 只是跳过它(或者,我想在你的代码中,它相当于将错误设置为零)。

如果您只是简单地在其上投射大量的观察值,束调整可能会非常糟糕。先解决一些视图,然后继续添加,逐步构建解决方案。

您可能想尝试某种“健壮”的方法。而不是使用最小二乘,使用“损失函数”1。即使有一些不正确的观察,这些也可以让您的优化生存下来。您仍然可以在Levenberg-Marquardt框架中执行此操作,您只需将损失函数的导数合并到雅可比行列式中即可。