OpenCV,Python:在拼接图像时消除最终的缩小

时间:2017-07-26 00:32:34

标签: python opencv image-processing image-stitching

在很大程度上要感谢stackoverflow(hereherehere)上的一些很棒的答案。我在对齐图像方面取得了相当不错的成功。但是,有一个问题,如下所示。当我将许多图像拼接在一起时,它们会变得越来越小。

我为什么会这样做的理论是相机并不完全垂直于地面,所以当我添加越来越多的图像时,相机不垂直于地面的自然视角会导致远处的图像变成小。不过,这可能完全不正确。

然而,即使我对第一张图像进行变换以使它“好像”它垂直于地面拍摄(我认为)仍会发生失真。

精彩的stackoverflow社区是否对如何纠正这种情况有任何想法?

这是我用来拼接图像的过程:

  1. 使用角落拉/长点图像的知识,使第一图像垂直于地面弯曲。我用来做这个的单应性是“基础”单应性
  2. 使用goodFeaturesToTrack()calcOpticalFlowPyrLK()
  3. 查找每个图片与最后一个图片之间的常用功能
  4. 使用findHomography()查找两张图片之间的单应性。然后,用所有先前的单应性构成单应性以得到“净”单应性
  5. 应用转换并使用我迄今为止所做的最终结果覆盖图像。
  6. 有一个主要约束

    当相机移动时,马赛克必须一次构建一个图像。我试图在无人机飞行时创建一个实时地图,将每个图像与最后一个图像逐个拟合。

    enter image description here

1 个答案:

答案 0 :(得分:3)

  

我为什么会这样做的理论是相机并不完全垂直于地面。

这是一个很好的直觉。如果摄像机是倾斜的,那么当它朝向物体移动时,该物体在框架中变大。因此,如果您将其拼接到前一帧,则当前帧需要缩小以适合前一帧中的对象。

完整的3x3单应性包括xy方向的扭曲,但2x3仿射变换不包含。要坚持使用当前的管道,您可以尝试寻找仿射或欧几里德(刚性)转换。它们之间的区别在于仿射扭曲允许在xy方向分别进行剪切和拉伸,欧几里德变换仅进行平移,旋转和均匀缩放。两者都保留平行线,而完整的单应性则没有,所以你最终会得到一个方形图像变得更加梯形,重复这会缩小你的图像。仿射经线仍然可以在一个方向收缩,将正方形变成矩形,因此它仍然可能缩小。欧几里德变换只能缩放整个方块,因此仍然可能缩小。

当然,它们也不会像findHomography那样完美匹配,但它们应该能够让你在不扭曲大小的情况下完成比赛。使用OpenCV有两种方法可以找到欧几里德或仿射变换:

  1. estimateRigidTransform()而非warpPerspective()使用参数fullAffine=False进行严格扭曲或使用fullAffine=True进行仿射扭曲。

  2. 带有可选参数motionType=cv2.MOTION_EUCLIDEANmotionType=cv2.MOTION_AFFINE
  3. findTransformECC()(但默认为仿射,因此无需指定)。

  4. 您可以在文档页面上查看算法之间的差异,或者尝试两者查看最适合您的算法。

    如果这也不成功,你可以尝试估算使框架完全垂直于地面的单应性。如果您这样做,可以尝试将其应用于所有帧 first ,然后匹配图像。否则,您可能希望转向更高级的方法,而不是仅在每个帧之间找到单应性。