繁体   English   中英

OpenCV、Python:在拼接图像时消除最终变窄

[英]OpenCV, Python: Eliminating eventual narrowing when stitching images

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

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

然而,即使当我转换第一张图像使其“好像”垂直于地面拍摄时(我认为),失真仍然发生。

出色的 stackoverflow 社区是否对我如何补救这种情况有任何想法?

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

  1. 使用图像的角纬度/经度点的知识,扭曲使第一幅图像垂直于地面。 我用来做这个的单应性是“基础”单应性
  2. 使用goodFeaturesToTrack()calcOpticalFlowPyrLK()查找每张图像和最后一张图像之间的共同特征
  3. 使用findHomography()查找两个图像之间的单应性。 然后,将该单应性与所有先前的单应性组合以得到“净”单应性
  4. 应用转换并用我到目前为止所做的最终结果覆盖图像。

有一个主要限制

随着相机的移动,马赛克必须一次构建一张图像。 我正在尝试在无人机飞行时创建实时地图,将每张图像与最后一张一张一张地拟合。

在此处输入图片说明

我关于为什么会发生这种情况的理论是相机并不完全垂直于地面。

这是一个很好的直觉。 如果相机是有角度的,那么当它移向一个物体时,该物体在画面中会变大。 因此,如果您将其拼接到前一帧,则当前帧需要缩小以适应前一帧中的对象。

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

当然,它们也不会像findHomography那样完美匹配,但它们应该能够让您关闭匹配而不会过多地扭曲大小。 有两个选项可以使用 OpenCV 找到欧几里得或仿射变换:

  1. estimateRigidTransform()而不是warpPerspective()来获得参数fullAffine=False的刚性扭曲或fullAffine=True的仿射扭曲。

  2. findTransformECC()与可选参数motionType=cv2.MOTION_EUCLIDEANmotionType=cv2.MOTION_AFFINE (但仿射是默认值,因此无需指定)。

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

如果这也不起作用,您可以尝试估计使框架完全垂直于地面的单应性。 如果你这样做,你可以试试它适用于所有的帧,然后匹配的图像。 否则,您可能想要转向更高级的方法,而不仅仅是在每帧之间找到单应性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM