[英]OpenCV, Python: Eliminating eventual narrowing when stitching images
很大程度上要感谢有关 stackoverflow 的一些出色答案( 此处、 此处和此处),我在对齐图像方面取得了一些不错的成功。 但是,有一个问题,如下所示。 当我将许多图像拼接在一起时,它们变得越来越小。
我关于为什么会这样的理论是相机并不完全垂直于地面,所以随着我添加越来越多的图像,相机不垂直于地面的自然视角导致远图像变得更小。 不过,这很可能是完全不正确的。
然而,即使当我转换第一张图像使其“好像”垂直于地面拍摄时(我认为),失真仍然发生。
出色的 stackoverflow 社区是否对我如何补救这种情况有任何想法?
goodFeaturesToTrack()
和calcOpticalFlowPyrLK()
查找每张图像和最后一张图像之间的共同特征findHomography()
查找两个图像之间的单应性。 然后,将该单应性与所有先前的单应性组合以得到“净”单应性随着相机的移动,马赛克必须一次构建一张图像。 我正在尝试在无人机飞行时创建实时地图,将每张图像与最后一张一张一张地拟合。
我关于为什么会发生这种情况的理论是相机并不完全垂直于地面。
这是一个很好的直觉。 如果相机是有角度的,那么当它移向一个物体时,该物体在画面中会变大。 因此,如果您将其拼接到前一帧,则当前帧需要缩小以适应前一帧中的对象。
完整的3x3
单应性包括x
和y
方向的失真,但2x3
仿射变换不包括。 为了坚持您当前的管道,您可以尝试找到仿射或欧几里得(刚性)变换。 它们之间的区别在于仿射扭曲允许在x
和y
方向分别进行剪切和拉伸,欧几里德变换仅进行平移、旋转和均匀缩放。 两者都保留平行线,而完整的单应性则不保留,因此您最终可能会得到一个方形图像变得更加梯形,并且重复这样做会缩小您的图像。 仿射扭曲仍然可以仅在一个方向上收缩,将正方形变成矩形,因此它仍然可能会收缩。 欧几里得变换只能缩放整个正方形,所以它仍然可能缩小。
当然,它们也不会像findHomography
那样完美匹配,但它们应该能够让您关闭匹配而不会过多地扭曲大小。 有两个选项可以使用 OpenCV 找到欧几里得或仿射变换:
estimateRigidTransform()
而不是warpPerspective()
来获得参数fullAffine=False
的刚性扭曲或fullAffine=True
的仿射扭曲。
findTransformECC()
与可选参数motionType=cv2.MOTION_EUCLIDEAN
或motionType=cv2.MOTION_AFFINE
(但仿射是默认值,因此无需指定)。
您可以在他们的文档页面上查看算法之间的差异,或者尝试两者以查看最适合您的算法。
如果这也不起作用,您可以尝试估计使框架完全垂直于地面的单应性。 如果你这样做,你可以先试试它适用于所有的帧,然后匹配的图像。 否则,您可能想要转向更高级的方法,而不仅仅是在每帧之间找到单应性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.