从 3D 平面到平行于图像平面的平面的单应性

Homography from 3D plane to plane parallel to image plane

我有一张图像,其中场景中有一个校准目标(已知几何形状)(假设一个简单的 2" x 2" 正方形位于 table 上)。我想执行透视变换(使用 warpPerspective()),以便生成的图像是 table 的正交视图(就好像相机轴与 table 法线平行)。计算单应性的标准程序是从一个通用平面到另一个不同的通用平面,其中在同一场景的两个图像中至少已知 4 个对应关系(使用 getPerspectiveTransform())。在这种情况下,我只有一个图像,简单地 "make up" 一个平面并将对应关系强制到该平面上的某个任意位置是否正确?例如,在这种情况下,我会简单地在图像中检测到的 4 个角(A、B、C、D)与我选择的四个点(本质上只是定义像素->真实世界比例)之间建立对应关系。例如, 我可以选择 A' = (0,0), B' = (20,20), C' = (0,20), D' = (20,0) 来表示在生成的图像中有 10 个像素英寸。当然我可以在这里选择任何比例,我也可以选择方形目标落在输出中的任何位置(即 A' = (100,100), B' = (120,120), C' = (100,120), D' = (120,100) ).

这是 "correct" 的方法吗?有没有更好的方法来计算投影变换,该投影变换直接查看由已知位于平面中的图像中的一组点定义的平面?

In this case where I only have one image, is the correct thing to do to simply "make up" a plane and force the correspondences to some arbitrary position on that plane?

是的。

请注意,getPerspectiveTransform 在其当前实现中需要恰好 4 个对应关系。它找到一个 3x3 的透视变换,它有 8 个自由度([3,3] 元素固定为 1),所以它只需要 4 个非共线对应关系,任意一个这样的对应关系就足够了。相比之下,findHomography 使用 RANSAC 来处理不确定性,并且可以找出哪些对应关系应该是 trusted,哪些是 outliers。如果您更喜欢使用线性最小二乘法,您可以采用 getPerspectiveTransform 来接受 >=4 对。

但是,如果您应用透视变换将一些扭曲的正方形目标 T 转换为完美的正方形,这只会使与 T 共面的平面也成为线平行。其他平面(例如,垂直于T)在变换后将不平行。

如果你想移除透视,即将投影更改为正交,你不能单独使用透视变换来完成。您还需要知道场景中物体的深度,然后将其投影到没有透视的平面上。