本文介绍了OpenCV变换矩阵:仿射与透视扭曲的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
您好,我目前正在进行图像转换,但有一件事我对扭曲不理解。即warpAffine()
和warpPerspective()
有什么区别?我的意思并不是说转型有什么不同。我的问题是,为什么我可以在上述两个函数中使用相同的变换矩阵(3x3)?并且输出是否相同(如果使用相同的变换矩阵运行)
或何时使用其中一个,何时使用另一个?
推荐答案
Affine transformations可以视为所有可能的透视变换的子集,也称为homographies。
它们之间的主要功能差异是仿射变换总是将平行线映射到平行线,而单应可以将平行线映射到相交线,反之亦然。
从规则正方形开始,您可以看到平移变换和欧几里得变换(旋转、均匀缩放和平移)保持纵横比;应用时的结果仍然是正方形。但是,仿射变换可以在任一方向上将正方形挤压成矩形,它还可以为正方形提供剪切/倾斜。但请注意,应用仿射变换后的形状是一个平行四边形-边仍然是平行的。有了单应字,情况就不一定是这样了。平行线可以弯曲,这样它们就会相交。因此,通过单应变换得到的矩形的结果是一般的四边形,而通过仿射变换变换的矩形的结果总是平行四边形。函数warpAffine()
和warpPerspective()
不一定需要是两个不同的函数。任何写成3x3矩阵的仿射变换都可以传递给warpPerspective()
并进行同样的变换;换句话说,可以使warpPerspective
这样的函数接受2x3和3x3矩阵。但是,透视转换会应用额外的步骤,因为需要额外的行,所以这样做效率不高。此外,warpPerspective
执行除法,因此在操作中可能会引入更大的浮点错误,而这对于仿射转换来说是不必要的。最后,无需创建3x3方阵并将其反转,即可反转仿射扭曲。因此,总而言之,将它们作为单独的函数保留是有意义的。
这篇关于OpenCV变换矩阵:仿射与透视扭曲的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!