二维透视投影变换

来源:互联网 发布:stussy淘宝哪家正 编辑:程序博客网 时间:2024/06/15 18:27

如下图,位于XY平面的单位正方形投影到任意平面P上后,变成了不规则的四边形ABCD,我们能根据正方形的四个顶点投影前后的坐标,计算出平面XY上任意点 (x,y) 投影到平面P 上之后的坐标 (x', y') 吗?


我们注意到正方形的四个边投影到平面P之后,分别变为线段AB,BC,CD,DA,也就是说投影前位于一条直线上的点,投影后仍然位于一条直线上,对于直线来说,这种变换是线性的;但投影前平行的两条直线,投影后不再平行,对于平面而言,这种变换不是线性的。不过,虽然这种变换不能表示成线性变换,但可以表示成两个线性变换相除,于是就有了齐次坐标,


齐次坐标的好处是,可以把投影变换转化成线性变换,从而使用矩阵运算来对问题求解。

使用齐次坐标,可以有以下变换


写成方程式表达:

x' = Ax + By + Cw

y' = Dx + Ey + Fw

w'= Gx + Hy + Iw


其中 (x,y,w) 是变换前的坐标,(x',y',w')是变换后的坐标,(A B C ...)是变换矩阵


根据上面的讨论,我们已知四边形四个顶点变换前后的二维坐标,每个点可以写出三个方程式,总共有12个方程式,而变换矩阵共有9个未知数,再加上变换之后的坐标w也是未知数,总共有13个未知数,于是这个方程组有无限多组解,但是在投影平面上,每个点的齐次坐标本身就可以有无数个表达,我们只要把w规则化为1,就可以求出x, y


根据仿射变换理论,系数C,F表示变换前后的原点位移(平移变换),为了简化计算,我们假定C,F都等于0(即变换前后原点没有位移),并且把系数I 调整成1,于是有


其中 p是比例因子

写成方程式

px' = Ax + By                     (1)

py' = Dx + Ey                     (2)

p   = Gx + Hy + 1               (3)

用式3消去式1和式2中的p,就得到2个方程式

 Ax + By - Gxx' - Hyx' = x'      (4)

 Dx + Ey - Gxy' - Hyy' = y'       (5 )

我们假定由点(0,0)(1,0)(0,1)(1,1)四个点组成的单位正方形区域映射到目标平面后的坐标分别是 (0,0) (x1',y1') (x2', y2') (x3', y3'),  原点(0,0)映射到 (0,0)不在计算之列,把其它三个点分别代入式(4),式(5),一共得到六个方程式


A - Gx1'  =  x1'                               (6)
B - Hx2'  =  x2'                               (7)
A + B - Gx3' - Hx3' = x3'               (8)
D - Gy1'  =  y1'                               (9)
E - Hy2'  =  y2'                               (10)
D + E - Gy3' - Hy3' = y3'              (11)

把式(6)(7)(10)(11)变换,得到
A = x1’ + Gx1’                            (12)
B = x2’ + Hx2'                            (13)
D = y1’ + Gy1’                           (14)
E = y2’ + Hy2'                            (15)

然后代入式(8)(11),得到
x1' + Gx1' + x2' + Hx2' - Gx3' - Hx3' = x3'
y1' + Gx1' + y2' + Hy2' - Gy3' - Hy3' = y3'


整理后为
G(x3' - x1') + H(x3' - x2') = x1' - (x3' - x2')
G(y3' - y1') + H(y3' - y2') = y1' - (y3' - y2')


令 dx31 = x3' - x1'
dx32 = x3' - y2'
dy31 = y3' - y1'
dy32 = y3' - y2'


从以下 开始,为书写方便,去掉了x,y后面的撇号


dx31G + dx32H = x1 - dx32
dy31G + dy32H = y1 - dy32

求解此方程

系数矩阵 M =

dx31 dx32
dy31 dy32

det(M) = dx31dy32 - dy31dx32

逆矩阵M-1 = 1 / det(M)*

dy32  -dx32
-dy31 dx31

于是G * det(M) = dy32 * (x1 - dx32) - dx32 * (y1 - dy32)  
                                   = x1 * dy32  - dx32 * dy32 - y1 * dx32 + dx32 * dy32 
                                   = x1 * dy32 - y1 * dx32

H * det(M) = -dy31 * (x1 - dx32)  + dx31 * (y1 - dy32)
注意到x1 - dx32 = x2 - dx31, y1 - dy32 = x2 - dy31, 于是
 
               H * det(M)   = -dy31 *(x2 - dx31) + dx31 *(y2 - dy31)
                                    = -x2*dy31 + dy31*dx31 + y2*dx31 - dx31*dy31
                                    = y2*dx31 - x2 * dy31


把 G,H 分别代入(12)(13)(14)(15)
就可以求出A,B,C,D
A =  x1 * (1 + G)
B = x2 * (1 + H)
D = y1 * (1 + G)
E = y2 * ( 1 + H)

这样就求出了变换矩阵的全部系数。
















0 0