透视变换原理实例代码详解

Posted 修炼之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了透视变换原理实例代码详解相关的知识,希望对你有一定的参考价值。

导读

在上篇文章中,我们介绍了仿射变换,我们只需要通过一个两行三列的变换矩阵M就能够对图像实现平移缩放翻转旋转操作。我们发现这些变换其实都属于平面变换,如果我们想要进行空间变换呢?

将上图的扑克牌单独提取出来,如下图所示

这时候我们应该如何来实现这个功能呢?这个其实就涉及到了图像的一个空间变换,就需要用到我们所说的透视变换了。

透视变换

透视变换(Perspective Transformation)是指利用透视中心像点目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。简而言之,就是将一个平面通过一个投影矩阵投影到指定平面上

  • 原理解析
    透视变换通用的变换公式:
    [ x ′ y ′ ω ′ ] = [ u v ω ] [ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] \\left[ \\beginmatrix x' &y'&\\omega' \\\\ \\endmatrix \\right] = \\left[ \\beginmatrix u &v&\\omega \\\\ \\endmatrix \\right] \\left[ \\beginmatrix a_11 & a_12 & a_13 \\\\ a_21 & a_22 & a_23 \\\\ a_31 & a_32 & a_33 \\\\ \\endmatrix \\right] [xyω]=[uvω]a11a21a31a12a22a32a13a23a33
    u u u v v v是原始图片,参数 ω \\omega ω等于1,通过透视变换后得到的图片坐标 x x x, y y y,其中
    x = x ′ ω ′ y = y ′ ω ′ x = \\fracx'\\omega'\\\\ y = \\fracy'\\omega' x=ωxy=ωy
    上式中的变换矩阵,可以将其拆成四个部分,第一部分表示线性变换
    [ a 11 a 12 a 21 a 22 ] \\left[ \\beginmatrix a_11 & a_12\\\\ a_21 & a_22\\\\ \\endmatrix \\right] [a11a21a12a22]
    这部分矩阵主要用于图像的缩放旋转操作,在仿射变换中我们也介绍过。第二部分用来进行平移操作 [ a 31 a 32 ] \\left[\\beginmatrixa_31 & a_32\\endmatrix\\right] [a31a32],第三部分用来产生透视变换 [ a 13 a 23 ] \\left[\\beginmatrix a_13 & a_23\\endmatrix\\right] [a13a23],第四部分参数 a 33 a_33 a33等于1。
    在上篇文章中我们介绍的仿射变换矩阵一共有6个参数,所以我们只需要3个坐标对(6个方程)就能求解,而透视变换矩阵一共有8个参数,所以需要4个坐标对(8个方程)才能求解,其实仿射变换也是透视变换的一种特殊形式。
    所以变换后 x x x y y y的表达式为
    x = x ′ ω ′ = a 11 ∗ u + a 21 ∗ v + a 31 ∗ 1 a 13 ∗ u + a 23 ∗ v + 1 ∗ 1 y = y ′ ω ′ = a 12 ∗ u + a 22 ∗ v + a 32 ∗ 1 a 13 ∗ u + a 23 ∗ v + 1 ∗ 1 x=\\fracx'\\omega'=\\fraca_11*u+a_21*v+a_31*1a_13*u+a_23*v+1*1\\\\ y=\\fracy'\\omega'=\\fraca_12*u+a_22*v+a_32*1a_13*u+a_23*v+1*1 x=ωx=a13u+a23v+11a11u+a21v+a311y=ωy=a13u+a23v+11a12u+a22v+a321
    接下来我们看一个例子,原始图像的四个点的坐标分别为 ( 0 , 0 ) 、 ( 1 , 0 ) 、 ( 1 , 1 ) 、 ( 0 , 1 ) (0,0)、(1,0)、(1,1)、(0,1) (0,0)(1,0)(1,1)(0,1)与之对应变换后的四个点坐标分别为 ( x 1 , y 1 ) 、 ( x 2 , y 2 ) 、 ( x 3 , y 3 ) 、 ( x 4 , y 4 ) (x_1,y_1)、(x_2,y_2)、(x_3,y_3)、(x_4,y_4) 以上是关于透视变换原理实例代码详解的主要内容,如果未能解决你的问题,请参考以下文章

    opencv 图像变换原理详解 图像平移 图像旋转 图像缩放

    图像透视变换原理与实现

    图像透视变换原理与实现

    透视投影详解转

    OpenCV图像变换(仿射变换与透视变换)

    OpenCV中的透视变换介绍