我有一张图像,其中场景中有一个校准目标(已知几何形状)(假设桌子上有一个简单的 2" x 2" 正方形)。我想执行透视变换(使用warpPerspective()
),以便生成的图像是桌子的正交视图(就好像相机轴与桌子法线平行)。计算单应性的标准过程是从一个通用平面到另一个不同的通用平面,其中同一场景的两个图像中至少已知 4 个对应关系(使用getPerspectiveTransform()
)。在这种情况下,我只有一张图像,简单地“组成”一个平面并将对应关系强制到该平面上的某个任意位置是正确的做法吗?例如,在这种情况下,我只需在图像中检测到的 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) )。
这是执行此操作的“正确”方法吗?是否有更好的方法来计算直接查看由图像中已知位于平面中的一组点定义的平面的投影变换?
在这种情况下,我只有一张图像,简单地“组成”一个平面并将对应关系强制到该平面上的某个任意位置是正确的做法吗?
Yes.
注意getPerspectiveTransform
在目前的实现中,正好需要 4 个对应关系。它找到一个3x3的透视变换,它有8个自由度([3,3]元素固定为1),所以它只需要4个非共线对应,任何这样的对应就足够了。相比之下,findHomography
使用 RANSAC 来处理不确定性,并可以找出哪些对应关系应该是trusted以及哪些是outliers。如果您更喜欢坚持线性最小二乘,您可以采用getPerspectiveTransform
接受 >=4 对。
但是,如果您应用透视变换来转换一些扭曲的方形目标T
到一个完美的正方形上,这只会使平面与T
也是线平行的。其他平面(例如,垂直于T
) 变换后将不再是线平行的。
如果你想删除透视,即将投影更改为正字法,你不能单独使用透视变换来做到这一点。您还需要知道场景中对象的深度,然后将其投影到没有透视的平面上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)