本文介绍了OpenCV变换矩阵:仿射与透视扭曲的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,我目前正在进行图像转换,但有一件事我对扭曲不理解。即warpAffine()warpPerspective()有什么区别?

我的意思并不是说转型有什么不同。我的问题是,为什么我可以在上述两个函数中使用相同的变换矩阵(3x3)?并且输出是否相同(如果使用相同的变换矩阵运行)

或何时使用其中一个,何时使用另一个?

推荐答案

Affine transformations可以视为所有可能的透视变换的子集,也称为homographies

它们之间的主要功能差异是仿射变换总是将平行线映射到平行线,而单应可以将平行线映射到相交线,反之亦然。

从规则正方形开始,您可以看到平移变换和欧几里得变换(旋转、均匀缩放和平移)保持纵横比;应用时的结果仍然是正方形。但是,仿射变换可以在任一方向上将正方形挤压成矩形,它还可以为正方形提供剪切/倾斜。但请注意,应用仿射变换后的形状是一个平行四边形-边仍然是平行的。有了单应字,情况就不一定是这样了。平行线可以弯曲,这样它们就会相交。因此,通过单应变换得到的矩形的结果是一般的四边形,而通过仿射变换变换的矩形的结果总是平行四边形。


函数warpAffine()warpPerspective()不一定需要是两个不同的函数。任何写成3x3矩阵的仿射变换都可以传递给warpPerspective()并进行同样的变换;换句话说,可以使warpPerspective这样的函数接受2x3和3x3矩阵。但是,透视转换会应用额外的步骤,因为需要额外的行,所以这样做效率不高。此外,warpPerspective执行除法,因此在操作中可能会引入更大的浮点错误,而这对于仿射转换来说是不必要的。最后,无需创建3x3方阵并将其反转,即可反转仿射扭曲。因此,总而言之,将它们作为单独的函数保留是有意义的。

这篇关于OpenCV变换矩阵:仿射与透视扭曲的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-18 15:01