300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 二维透视投影变换

二维透视投影变换

时间:2019-10-19 17:20:05

相关推荐

二维透视投影变换

如下图,位于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)

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。