从3个静态摄像机获得一个角度,该如何恢复3D空间中的位置?

时间:2019-01-05 04:18:27

标签: image algorithm opencv camera

我们有相同的rectangle position relative to 3 same type of staticly installed web cameras,不在同一行。在平坦的篮球场上说。因此,我们将所有内容都放在一个3d空间中,并为它们设置(x, y, z); (ax, ay, az);的位置和方向。

我们有一个球形,我们在所有3张图像im1, im2, im3中都找到了它的位置。现在,它在2d帧(p1x, p1y);(p2x, p2y);(p3x, p3y)上的位置以及摄影机的位置如何在3d空间中获得球的位置?

1 个答案:

答案 0 :(得分:1)

  1. 您需要将2D屏幕坐标取消投影为空间中的3D坐标。
  2. 您需要解决方程组,才能从第一步获得的3条光线中找到3D的真实点。

您可以找到gluUnProject here的源代码。我还在这里提供我的代码:

public Vector4 Unproject(float x, float y, Matrix4 View)
{
    var ndcX = x / Viewport.Width * 2 - 1.0f;
    var ndcY = y / Viewport.Height * 2 - 1.0f;
    var invVP = Matrix4.Invert(View * ProjectionMatrix);
    // We don't z-coordinate of the point, so we choose 0.0f for it.
    // We are going to find out it later.
    var screenPos = new Vector4(ndcX, -ndcY, 0.0f, 1.0f);
    var res = Vector4.Transform(screenPos, invVP);
    return res / res.W;
}

Vector3 ComputeRay(Camera camera, Vector2 p)
{
    var worldPos = Unproject(p.X, p.Y, camera.View);
    var dir = new Vector3(worldPos) - camera.Eye;
    return new Ray(camera.Eye, Vector3.Normalize(dir));
}

现在,您需要找到三种射线的交点。从理论上讲,仅使用两条光线就足够了。这取决于相机的位置。

如果我们具有无限精度的浮点算法,并且输入没有噪声,那将是微不足道的。但是实际上,您可能需要利用一些简单的数值方案来找到具有适当精度的点。