我在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')
从相机的角度来看。< / p>
找到将这些3D点投影到摄像机视图平面上的2D点的投影矩阵的最简单方法是什么。我们对相机位置一无所知。
答案 0 :(得分: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))。
...
实际上,这是过度简化的,并假设相机指向3D坐标系的原点而没有透视。
对于透视图,转换矩阵更像是:
( 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
所以你应该有4个点可以得到8个方程来覆盖6个变量的摄像机位置和角度,还有1个用于缩放2-D视点,因为我们将能够消除“中心”坐标( XC,YC)。
因此,如果您有4个点并将2-D视点转换为相对于显示器的中心,那么您可以在13个变量中获得14个联立方程并求解。
不幸的是,六个方程不是线性方程。幸运的是,这些方程中的所有变量都被限制在-1和1之间的值,因此解算方程仍然是可行的。
答案 1 :(得分:3)
您的相机具有(至少)7个自由度 - 3个用于位置,3个用于方向,1个用于FOV。如果我错了,我肯定有人会纠正我,但似乎没有3分足够完整的解决方案。
对于此问题的一般解决方案,请在Graphics Gems II中查找“View Correlation”。
答案 2 :(得分: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算法,但这更需要设置并需要更多的点作为输入。但是它也会产生相机的失真信息和内在参数。
答案 3 :(得分:0)
我认为没有足够的信息可以找到明确的解决方案。在不知道您的摄像机位置且不知道您的视平面的情况下,有无数个矩阵可以解决这个问题。