2

我在 Blender 中有一个校准的(虚拟)相机,可以查看大致平面的物体。我从第一个相机姿势 P0 制作图像并将相机移动到新姿势 P1。所以我有两个视图的 4x4 相机矩阵,我可以从中计算相机之间的转换,如下所示。我也知道内在矩阵 K。使用这些,我想将 P0 图像中的点映射到从 P1 看到的新图像(当然,我有要比较的基本事实,因为我可以在相机完成后在 Blender 中渲染移至 P1)。如果我只在 P0 和 P1 之间旋转相机,我可以完美地计算单应性。但是如果有平移,则计算出的单应矩阵不会考虑到这一点。理论说,在计算出 M10 之后,对于平面场景,应该删除最后一行和最后一列。但是,当我检查 M10 时,我看到翻译值在最右边的列中,我将其删除以获得 3x3 单应矩阵 H10。然后,如果没有旋转,H10 等于单位矩阵。这里出了什么问题?

编辑:我知道这些图像是通过单应性相关的,因为给定来自 P0 和 P1 的两个图像,我可以找到一个单应性(通过特征匹配),它可以完美地将 P0 的图像映射到 P1 的图像,即使存在平移相机运动。

在此处输入图像描述

4

1 回答 1

0

在阅读了另外两本书后,这个理论对我来说变得更加清晰:Hartley 和 Zissermann 的“Multiple View Geometry”(示例 13.2),尤其是“An Invitation to 3-D Vision: From Images to Geometric Models”(第 5.3.1 节,平面单应性)。以下是大纲,请查看上述来源以获得详尽的解释。

p考虑在 3D 空间中2D 平面上的两幅点图像,P两个相机帧之间的变换可以写为:X2 = R*X1 + T(1) 其中X1和分别是相机帧 1 和 2 中X2世界点的坐标,旋转和两个相机帧之间的平移。将平面到第一个相机帧的单位法向量表示为 ,将平面到第一个相机的距离表示为,我们可以使用平面方程来写(表示转置 ),或者等价地(2) 表示平面上的所有。将 (2) 代入 (1) 给出pRTPNPdN.T*X1=d.T(1/d)*N.T*X1=1X1PX2 = R*X1+T*(1/d)*N.T*X1 = (R+(1/d)*T*N.T)*X1. 因此,平面单应矩阵 (3x3) 可以提取为H=R+(1/d)*T*N.T,即X2 = H*X1X1这是从到的线性变换X2

距离d可以计算为平面法线与平面上的点之间的点积。K然后,应该使用相机内在矩阵来计算投影单应性G = K * R+(1/d)*T*N.T * inv(K)。如果您使用的是 Blender 或 Unity 等软件,您可以自己设置相机内在函数,从而获得K. 对于 Blender,这个出色的答案中给出了一个很好的代码片段。

OpenCV 在教程中有一些很好的代码示例;请参阅“演示 3:相机位移的单应性”。

于 2021-11-19T16:47:34.147 回答