我们有相同的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空间中获得球的位置?
答案 0 :(得分:1)
您可以找到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));
}
现在,您需要找到三种射线的交点。从理论上讲,仅使用两条光线就足够了。这取决于相机的位置。
如果我们具有无限精度的浮点算法,并且输入没有噪声,那将是微不足道的。但是实际上,您可能需要利用一些简单的数值方案来找到具有适当精度的点。