OpenCV Transformationmatrix:仿射与透视扭曲

问题描述 投票:3回答:1

嗨,我现在正在进行图像转换,但有一点我不明白翘曲。即warpAffine()warpPerspective()之间的区别是什么?

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

或者什么时候使用一个,什么时候另一个?

opencv transform
1个回答
7
投票

Affine transformations可以被认为是所有可能的透视变换的一个子集,也就是homographies

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

Different transformations

从常规正方形开始,您可以看到平移和欧几里德变换(旋转,均匀缩放和平移)保持纵横比;申请的结果仍然是一个正方形。然而,仿射变换可以将正方形挤压成任意方向的矩形,并且它还可以向正方形提供剪切/倾斜。但请注意,应用仿射变换后的形状是平行四边形 - 两边仍然是平行的。使用单应性,不一定是这种情况。平行线可以弯曲,以便它们相交。因此,由单应性变换的矩形的结果是一般的四边形,而通过仿射变换变换的矩形的结果总是平行四边形。


函数warpAffine()warpPerspective()不一定需要是两个不同的函数。任何写成3x3矩阵的仿射变换都可以传递到warpPerspective()并进行相同的转换;换句话说,像warpPerspective这样的函数可以用来获取2x3和3x3矩阵。但是,由于附加行,透视变换会应用额外的步骤,因此执行此操作效率不高。此外,warpPerspective执行除法,因此操作中可能会出现更大的浮点错误,这对于仿射变换来说是不必要的。最后,可以在不创建3x3方阵并将其反转的情况下完成反转仿射变形。总而言之,将它们作为单独的函数保留是有意义的。

© www.soinside.com 2019 - 2024. All rights reserved.