OpenCV - 投影、单应矩阵和鸟瞰图



我想把单应矩阵拿到鸟瞰图上,我知道相机的投影矩阵。他们之间有什么关系吗?

谢谢。

投影矩阵被定义为相机的固有矩阵(例如焦距、主点等)和外在矩阵(旋转和平移)的乘积。问题是你的旋转和平移是什么?例如,我可以想象另一个相机或三维物体,相对于它们进行旋转和平移。否则,你的投影只是一个内在矩阵。

首先考虑获得鸟瞰图所需的信息:你至少需要知道相机相对于地面的方位。如果您还知道摄影机高程,则可以创建度量重建。但既然你提到了单应性,我假设你考虑了平面的鸟瞰图,因为单应性映射了两个平面上的点,在你的情况下,平面上的点将映射到平面传感器上的点。

让我们考虑一个针孔相机方程。它基本上说[u,v,1]T~A*[R|T][x,y,z,1]T,其中A是相机本征矩阵。现在,由于您处理的是地面平面,因此可以通过设置z=0将新坐标系与其对齐;R|t是从该坐标系到相机对齐系统的旋转和平移矩阵;

接下来,注意你的R|t是一个3x4矩阵,由于z=0,它失去了一个维度;它变为3x3或现在等于H=A*R'|t的单应性;好的,我们所做的只是证明在地面和传感器之间存在单应映射;

现在,你想要另一种单应性,它发生在纯相机旋转期间,并在旋转/缩放前后在传感器上的点之间缩放;也就是说,你想向下旋转相机,并可能缩小。再次,用针孔相机方程来思考:最初你有H1=a(这里我把R|T当作无关紧要的),然后你旋转相机,你有H2=AR;换句话说,H1是你现在制作图像的方式,H2是你想要的图像外观
两者之间的关系是你想要找到的,H12,它也是单应性,因为单应性是变换的(使用这个简单的启发式:在族中发生的事情留在族中)。由于同一表面可以用H1或H2生成图像,我们可以通过松开H1(回到地平面)并应用H2(从地面到传感器鸟瞰图)来组装H12;在某种程度上,这类似于向量运算,你只需要遵守矩阵应用程序从右到左的顺序
H12=H2*H1-1=a*R*a-1=P*a-1,其中我们用H1、H2的表达式替换,最后用投影矩阵(如果你有它的话)

这是您的答案,如果旋转R未知,则可以根据相机相对于地面的方向进行猜测,或者使用opeCV库中的solvePnP()进行计算。最后,当我在手机上这样做时,我只使用它的加速度计读数作为一个很好的近似值,因为当手机没有加速时,读数代表一个重力矢量,它给出了相对于平坦水平地面的旋转。

当你将鸟瞰图绘制为图像时,你会注意到它的边界从矩形变成了某种梯形(由于相机的截头体形状),并且在远处有一些洞(由于采样率不足)。您可以使用wrappePerspective()在孔内插值

最新更新