3D到2D投影矩阵

16

我在3D空间中有3个点,它们的确切位置已知。假设它们是:(x0,y0,z0)(x1,y1,z1)(x2,y2,z2)

此外,我有一个相机,它正在观察这些3个点,并且我知道这三个点在相机视图平面上的2D位置。例如,(x0,y0,z0)将成为(x0',y0')(x1,y1,z1)将成为(x1',y1')(x2,y2,z2)将成为(x2',y2')从相机的角度看。

找到最简单的方法来查找投影矩阵,将这些3D点投影到相机视图平面上的2D点。我们对相机的位置一无所知。


1
这不是我的作业! - ehsan baghaki
4个回答

12

这会给你两组每组三个三元方程:

a*x0+b*y0+c*z0 = x0'
a*x1+b*y1+c*z1 = x1'
a*x2+b*y2+c*z2 = x2'

d*x0+e*y0+f*z0 = y0'
d*x1+e*y1+f*z1 = y1'
d*x2+e*y2+f*z2 = y2'

在您的情况下,只需使用最简单的解决同时方程的方法(甚至不用手算也不难)。然后您的转换矩阵就是((a,b,c)(d,e,f))。

...

实际上,这过于简化了,假设有一个针对您的三维坐标系原点的相机和透视效果,则转换矩阵的工作方式更像是:

               ( a, b, c, d )   ( xt )
( x, y, z, 1 ) ( e, f, g, h ) = ( yt )
               ( i, j, k, l )   ( zt )

( xv, yv ) = ( xc+s*xt/zt, yc+s*yt/zt ) if md < zt;

但是4x3矩阵比12个自由度更受限制,因为我们应该有

a*a+b*b+c*c = e*e+f*f+g*g = i*i+j*j+k*k = 1
a*a+e*e+i*i = b*b+f*f+j*j = c*c+g*g+k*k = 1

为了覆盖相机位置、角度和 2-D 视图点的缩放这 6 个变量,你需要有 4 个点来获得 8 个方程。再加上一个用于消除“中心”坐标 (xc, yc)。

如果你有 4 个点,并将 2-D 视图点转换为相对于显示屏中心的坐标系,则可以得到 14 个关于 13 个变量的方程组,并进行求解。

不幸的是,其中六个方程不是线性方程。但幸运的是,这些方程中的所有变量都被限制在 -1 到 1 的值之间,因此解方程仍然可能是可行的。


你的解决方案可能是我找到的问题最好的答案。请进一步描述解决方案的第二部分。xv和yv是什么,还有md,zt,xt,yt,zt等等。 非常感谢! - ehsan baghaki

3
你的相机至少有7个自由度——3个用于位置,3个用于方向和1个用于视场角。如果我错了,我相信会有人纠正,但似乎3个点不足以提供完整的解决方案。
要解决这个问题,可以查看《图形宝石II》中的“视图相关性”一章,以获得通用解决方案。

通常情况下,7是正确的,但有些系统允许FOV使用两个参数:垂直和水平。通常它们彼此成比例(例如4:3屏幕= 4:3 FOV比率),但在某些情况下,如果用户愿意,这些比例可能会被扭曲。 - Neil N

2
您需要的是一种姿态估计算法。可以看看OpenCV中的POSIT实现:http://opencv.willowgarage.com/documentation/c/calib3d_camera_calibration_and_3d_reconstruction.html#posit。您需要四个或更多点,它们可能不在同一个平面上。
这个实现的教程在这里:http://opencv.willowgarage.com/wiki/Posit。请注意:在教程中使用了一个正方形视口,所以所有视图坐标都在-1,-1到1,1范围内。这会让人误以为这些坐标应该在相机坐标系中(在纵横比校正之前)。但事实并非如此,如果您使用一个4:3的视口,则输入坐标应在-1.3333,-1到1.3333,1范围内。
顺便说一下,如果您的点必须位于同一个平面上,那么您也可以查看OpenCV中的CameraCalibration算法,但这需要更多的输入点并且设置更加复杂。然而,它也将为您提供摄像机的畸变信息和内部参数。

0

我认为没有足够的信息来找到一个明确的解决方案。如果不知道您的相机位置和视平面,那么可以解决此问题的矩阵数量是无限的。


不,他的意思是对于给定的一组点,有无限多个矩阵可以完成你所要求的操作。你需要更多的点或者更少的自由度(例如,固定相机的视野)来解决这个问题。 - Mike F
1
如果您知道相机视图平面(相机与物体之间的Z距离),那么使用这些点,您可以计算出相机的位置,因为它只是三条线的交点。然后,我认为可能可以计算矩阵的轴。 - Jim Buck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接