4

我正在研究来自运动应用程序的结构,并且我正在跟踪放置在对象上的许多标记以确定对象的刚性结构。

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

对于每个标记点和每个视图,以下功能被最小化:

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

其中计算出的 XY 值取决于需要通过优化找到的许多未知参数,observedXY 是 2D 中的标记点位置。总的来说,我有(标记点 * 视图)我希望最小化的上述功能的数量。

我已经编写了一个摄像机的模拟代码,可以看到所有标记点,但我想知道如何处理在运行过程中由于光照、遮挡或不在摄像机视图中而导致点不可见的情况。在应用程序的实际运行中,我将使用网络摄像头查看对象,因此很可能并非所有标记都会立即可见,并且取决于我的计算机视觉算法的稳健程度,我可能无法检测到一直标记。

我想在无法观察到标记点的情况下将 diff 值设置为 0(sigma 平方差 = 0),但是这会扭曲结果吗?

我注意到的另一件事是,当呈现太多视图时,算法并没有那么好。当视图太多时,更有可能估计一个糟糕的解决方案。这是捆绑调整的一个常见问题,因为当呈现太多视图时会增加达到局部最小值的可能性?

4

1 回答 1

1

通常的做法是忽略与缺失标记相对应的术语。IE。calculateXY-observedXY如果没有observedXY术语,请不要尝试最小化。没有必要将任何东西设置为零,你甚至不应该首先考虑这个术语 - 只需跳过它(或者,我猜在你的代码中,它相当于将错误设置为零)。

如果您简单地对其进行大量观察,捆绑调整可能会非常失败。通过先解决几个视图然后继续添加来逐步构建您的解决方案。

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

于 2012-04-27T23:00:51.663 回答