我有一个图像,其中一个场景中有一个校准目标(已知的几何体)(假设一个简单的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))。
这是“正确”的方法吗?有没有更好的方法来计算投影变换,直接观察由已知在平面中的图像中的一组点定义的平面?
答案 0 :(得分:2)
在这种情况下,我只有一张图片,这是正确的做法,只需"化妆"一架飞机并强制对应到那架飞机上的某个任意位置?
是
请注意,getPerspectiveTransform
目前的实现只需要4个对应关系。它找到了一个3x3透视变换,它具有8个自由度([3,3]元素固定为1),因此它只需要4个非共线对应,任何这样的对应就足够了。相比之下,findHomography
使用RANSAC来处理不确定性,并且可以确定哪些对应应该可信哪些是异常值。如果您更喜欢坚持线性最小二乘,则可以采用getPerspectiveTransform
接受> = 4对。
但是,如果应用透视变换将一些扭曲的方形目标T
转换为完美的正方形,这只会使与T
共面的平面也行平行。其他平面(例如垂直于T
)在变换后将不是线平行的。
如果要删除透视图,即将投影更改为正交,则无法单独使用透视变换。您还需要知道场景中物体的深度,然后将其投影到没有透视的平面上。