在很大程度上要感谢stackoverflow(here,here和here)上的一些很棒的答案。我在对齐图像方面取得了相当不错的成功。但是,有一个问题,如下所示。当我将许多图像拼接在一起时,它们会变得越来越小。
我为什么会这样做的理论是相机并不完全垂直于地面,所以当我添加越来越多的图像时,相机不垂直于地面的自然视角会导致远处的图像变成小。不过,这可能完全不正确。
然而,即使我对第一张图像进行变换以使它“好像”它垂直于地面拍摄(我认为)仍会发生失真。
精彩的stackoverflow社区是否对如何纠正这种情况有任何想法?
答案 0 :(得分:3)
我为什么会这样做的理论是相机并不完全垂直于地面。
这是一个很好的直觉。如果摄像机是倾斜的,那么当它朝向物体移动时,该物体在框架中变大。因此,如果您将其拼接到前一帧,则当前帧需要缩小以适合前一帧中的对象。
完整的3x3
单应性包括x
和y
方向的扭曲,但2x3
仿射变换不包含。要坚持使用当前的管道,您可以尝试寻找仿射或欧几里德(刚性)转换。它们之间的区别在于仿射扭曲允许在x
和y
方向分别进行剪切和拉伸,欧几里德变换仅进行平移,旋转和均匀缩放。两者都保留平行线,而完整的单应性则没有,所以你最终会得到一个方形图像变得更加梯形,重复这会缩小你的图像。仿射经线仍然可以在一个方向收缩,将正方形变成矩形,因此它仍然可能缩小。欧几里德变换只能缩放整个方块,因此仍然可能缩小。
当然,它们也不会像findHomography
那样完美匹配,但它们应该能够让你在不扭曲大小的情况下完成比赛。使用OpenCV有两种方法可以找到欧几里德或仿射变换:
estimateRigidTransform()
而非warpPerspective()
使用参数fullAffine=False
进行严格扭曲或使用fullAffine=True
进行仿射扭曲。
motionType=cv2.MOTION_EUCLIDEAN
或motionType=cv2.MOTION_AFFINE
的 findTransformECC()
(但默认为仿射,因此无需指定)。
您可以在文档页面上查看算法之间的差异,或者尝试两者查看最适合您的算法。
如果这也不成功,你可以尝试估算使框架完全垂直于地面的单应性。如果您这样做,可以尝试将其应用于所有帧 first ,然后匹配图像。否则,您可能希望转向更高级的方法,而不是仅在每个帧之间找到单应性。