我在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点的投影矩阵的最简单方法是什么。我们对相机位置一无所知。

有帮助吗?

解决方案

这给你两组,每组三个变量中的三个方程式:

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之间的值,因此解算方程仍然是可行的。

其他提示

您的相机具有(至少)7个自由度 - 3个用于位置,3个用于方向,1个用于FOV。如果我错了,我肯定有人会纠正我,但似乎没有3分足够完整的解决方案。

对于此问题的一般解决方案,请在Graphics Gems II中查找“View Correlation”。

您正在寻找的是一种姿态估计算法。看看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算法,但这更需要设置并需要更多的点作为输入。但是它也会产生相机的失真信息和内在参数。

我认为没有足够的信息可以找到明确的解决方案。在不知道您的摄像机位置且不知道您的视平面的情况下,有无数个矩阵可以解决这个问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top