Multiple View Geometry in Computer Vision (Second Edition) 学习笔记-1

第二节 投影几何和二维变换

2.2 The 2D projective plane

  1. 使用向量表示线段,如\((a,b,c)^T\)表示\(ax+by+c = 0\)

  2. \(IR^3 - (0,0,0)^T\)中的矢量等价类的集合组成射影空间\(IP^2\)(P即Project),即,\(IR^3\)中的每个矢量对应着\(IP^2\)中的一个点,其中\((0,0,0)^T\)不与任何直线对应,被排除在外。

  3. 当且仅当\(x^Tl = 0\)时,点\(x\)才在线\(l\)上。

  4. *度问题:为了指定一个点,必须提供两个值,即其x坐标和y坐标。 以类似的方式,一条线由两个参数(两个独立的比率{a:b:c})指定,因此具有两个*度。在非齐次表示中,可以选择这两个参数作为直线的梯度和y截距。

  5. 线段\(l\)和\(l'\)的交点\(x = l \times l'\)

    如 \(x = 1 \longrightarrow-1x+1 = 0 ~~~:~~~ l = (-1,0,1)^T\)

    ​ \(y = 1 \longrightarrow -1y + 1 = 0~~~:~~~ l' = (0,-1,1)^T\)

    ​ \(x = l\times l' = \left|\begin{matrix}i & j & k\\-1 & 0 & 1\\0 & -1 & 1\end{matrix}\right| = \left(\begin{matrix}1\\1\\1\end{matrix}\right)\)

  6. 过两个点\(x\)和\(x'\)的直线\(l = x \times x'\)

  7. 所有的理想点都表示为\((x_1, x_2, 0)^T\),其特定点由比率\(x_1:x_2\)指定。

  8. 无穷远线表示为\(l_\infty = (0,0,1)^T\),从而\((0,0,1)(x_1,x_2,0)^T = 0\)

  9. 非齐次表示中,\((b,-a)^T\)是与直线相切且与直线法线\((a,b)^T\)正交的向量,因此表示直线的方向。

  10. 在2D射影几何中,在射影变换下所有非退化圆锥都是等效的。

  11. 圆锥曲线方程

    非齐次:

    \[ax^2 + bxy + cy^2 + dx + ey + f = 0 \]

    齐次:\(x \longrightarrow x_1 / x_3, ~~~y \longrightarrow x_2 / x_3\)

    \[ax_1^2 + bx_1x_2 + cx_2^2 + dx_1x_3+ex_2x_3+fx_3^2 = 0 \]

    矩阵形式:

    \[x^TCx = 0 \]

    其中 \(C = \left[\begin{matrix}a & b/2 & d/2\\b/2 & c & e/2\\d/2 & e/2 & f\end{matrix}\right]\)

  12. \(C\)是圆锥的齐次表示,圆锥具有五个*度,可以将其视为比率{a:b:c:d:e:f}。

  13. 5个点确定一条圆锥曲线

  14. 在\(C\)上的点\(x\)处与\(C\)相切的直线\(l = Cx\)

2.3 Projective transformations

2D射影几何是对射影平面\(IP^2\)的属性的研究,这些属性在射影性的一组转换下是不变的。

  1. 投影性是从\(IP^2\)到其自身的可逆映射\(h\),使得当且仅当\(h(x_1),h(x_2),h(x_3)\)相同时,三个点\(x_1,x_2,x_3\)位于同一条线上。

  2. 映射\(h\):当且仅当存在一个非奇异的3×3矩阵\(H\),对于由向量\(x\)表示的\(IP^2\)中的任何点,\(h(x)= Hx\)都是正确的时候时,\(IP^2→IP^2\)才具有投影性。

  3. 平面投影变换是对由非奇异3×3矩阵表示的齐次3矢量的线性变换\(x' = H x\)

    该方程式中出现的矩阵\(H\)可以通过乘以任意非零比例因子而改变,而不改变投影变换。
    因此\(H\)是齐次矩阵,\(H\)的9个元素中有8个独立的比率,因此,投射变换具有8个*度。

  4. 平面之间的映射:如果在每个平面中定义了一个坐标系,并且点用齐次坐标表示,则中心投影映射可以表示为\(x = Hx\),其中\(H\)是非奇数3×3矩阵。它被称为透视性而不是完全投影性,并且可以通过具有六个*度的变换来表示。(单应变换)

  5. 在点的变换\(x' = Hx\)下,对应的圆锥曲线变换为\(C' = H^{-T}CH^{-1}\),双圆锥曲线变换为\(C^{*'} = HC^*H^{T}\)

2.4 A hierarchy of transformations

  1. 等距变换:保留欧几里德距离的平面\(IR^2\)的变换。

    \[\left( \begin{matrix} x'\\y'\\1 \end{matrix} \right)=\left[ \begin{matrix} \epsilon cos\theta & -sin\theta & t_x\\ \epsilon sin\theta & cos\theta & t_y\\ 0 & 0 & 1 \end{matrix} \right]\left( \begin{matrix} x\\y\\1 \end{matrix} \right) \]

    这里的\(\epsilon = \pm1\),表示方向(\(-1\)为反转方向)

    可以写作矩阵块的形式如:

    \[x' = H_Ex = \left[ \begin{matrix} R & t\\0^T & 1 \end{matrix} \right]x \]

    这里的\(R\)是\(2\times2\)的旋转矩阵(正交矩阵),\(t\)是一个\(2\times2\)的位移向量。

    平面欧几里得变换具有三个*度,一个用于旋转,两个用于平移。

    长度(两点之间的距离),角度(两线之间的角度)和面积是不变的。

  2. 相似变换:由各向同性缩放组成的等距映射。

    \[\left( \begin{matrix} x'\\y'\\1 \end{matrix} \right)=\left[ \begin{matrix} s~ cos\theta & -s~sin\theta & t_x\\ s~ sin\theta & s~cos\theta & t_y\\ 0 & 0 & 1 \end{matrix} \right]\left( \begin{matrix} x\\y\\1 \end{matrix} \right) \]

    可以写作矩阵块的形式如:

    \[x' = H_Sx = \left[ \begin{matrix} sR & t\\0^T & 1 \end{matrix} \right]x \]

    标量s代表各向同性标度。

    相似变换也称为等式变换,因为保留了“形状”。

    平面相似度变换具有四个*度(3 + s(1) = 4)

    线之间的角度不受旋转,平移或各向同性缩放的影响,相似性不变性也不受此影响。长度之比和面积之比是不变的。

  3. 仿射变换:仿射变换是“线性变换”+“平移”,保持二维图形的“平直性”(straightness,即变换后直线还是直线不会打弯,圆弧还是圆弧)和“平行性”(parallelness,其实是指保二维图形间的相对位置关系不变,平行线还是平行线,相交直线的交角不变。)

    \[\left( \begin{matrix} x'\\y'\\1 \end{matrix} \right)=\left[ \begin{matrix} a_{11} & a_{12} & t_x\\ a_{21} & a_{22} & t_y\\ 0 & 0 & 1 \end{matrix} \right]\left( \begin{matrix} x\\y\\1 \end{matrix} \right) \]

    可以写作矩阵块的形式如:

    \[x' = H_Ax = \left[ \begin{matrix} A & t\\0^T & 1 \end{matrix} \right]x \]

    这里的\(A\)是一个2 × 2的非奇异矩阵。

    平面仿射变换有6个*度,对应6个矩阵元素。由三个对应点计算。

    仿射矩阵\(A\)总是可以分解为

    \[A = R(\theta)R(-\phi)DR(\phi) \]

    其中\(R(\theta)\)和\(R(\phi)\)分别是\(\theta\)和\(\phi\)的旋转角度,\(D\)是是对角矩阵

    \[D = \left[\begin{matrix}\lambda_1 & 0\\0 & \lambda_2\end{matrix}\right] \]

    这个分解由SVD分解得到,\(A = UDV^{T} = (UV^{T})(VDV^{T}) = R(\theta)R(-\phi)DR(\phi)\),其中\(U\)和\(V\)都是正交矩阵。

    因此,仿射矩阵A可以理解为先进行角度的旋转然后再(旋转的)x和y方向上分别按λ1和λ2缩放,再依次进行\(-\phi\)角度的旋转和\(\theta\)角度的旋转。

    仿射变换有六个*度,(4 + 缩放方向的角度\(\phi\) + 缩放参数\(\lambda_1 : \lambda_2\)的比率)

    仿射变换不能保持原来的线段长度不变,也不能保持原来的夹角角度不变。

    仿射变换有三个不变性:(1)平行线(2)平行线段的长度之比(3)面积比

    根据\(det(A) = \lambda_1 \lambda_2\)的正负决定仿射保留原方向或反转。

  4. 投影变换:是齐次坐标的一般非奇异线性变换。

    \[x' = H_Px = \left[ \begin{matrix} A & t\\V^T & v \end{matrix} \right]x \]

    这里的\(v = (v_1, v_2)^T\)

    投影变换有8个*度(总是可以按比例缩放矩阵以使v成为单位 9 - 1 = 8,可以通过四个点的对应关系来计算两个平面之间的投影变换。

  5. 总结:投影和仿射变换之间的主要区别在于,对于投影变换,向量v不为null,这是投影变换非线性的原因。

    比较理想点\((x_1,x_2,0)^T\)在仿射和投影变换下的不同。

    仿射变换:

    \[\left[ \begin{matrix} A & t\\0^T & 1 \end{matrix} \right]\left( \begin{matrix} x_1 \\x_2\\0 \end{matrix} \right) = \left( \begin{matrix} A \left( \begin{matrix} x_1\\x_2 \end{matrix} \right)\\0 \end{matrix} \right) \]

    投影变换:

    \[\left[ \begin{matrix} A & t\\V^T & v \end{matrix} \right]\left( \begin{matrix} x_1 \\x_2\\0 \end{matrix} \right) = \left( \begin{matrix} A \left( \begin{matrix} x_1\\x_2 \end{matrix} \right)\\v_1x_1+v_2x_2 \end{matrix} \right) \]

    可以看到在仿射变化中,理想点保持理想状态(即无穷大)。 在投影变换中,它映射到一个有限点。

  6. 投影变换的分解:投影变换可以分解为链式的变换。

    \[H = H_SH_AH_P = \left[ \begin{matrix} sR & t\\0^T & 1 \end{matrix} \right]\left[ \begin{matrix} K & 0\\0^T & 1 \end{matrix} \right]\left[ \begin{matrix} I & 0\\V^T & v \end{matrix} \right] = \left[ \begin{matrix} A & t \\V^T & v \end{matrix} \right] \]

    其中\(A\)是由A \(= sRK + tv^T\)给出的非奇异矩阵,而\(K\)是归一化为\(det(K) = 1\)的上三角矩阵。如果\(v \neq 0\),则此分解有效,如果将s选择为正,则分解是唯一的。

  7. 函数无关(functionally independent )不变量的数目 \(\ge\) 配置(configuration)的*度数 \(-\) 变换(transformation)的*度数。

  8. Multiple View Geometry in Computer Vision (Second Edition) 学习笔记-1

  9. 一维的投影几何:

    使用\(\overline{x}\) 表示 二维向量\((x_1, x_2)^T\),线的投影变换由2×2齐次矩阵表示:

    \[\overline{x}' = H_{2\times 2} \overline{x} \]

    具有三个*度,可以从三个相应的点确定直线的投影变换。

    交叉比率:交叉比率是\(IP^1\)的基本投影不变量:

    \[Cross(\overline{x}_1,\overline{x}_2,\overline{x}_3,\overline{x}_4) = \frac{|\overline{x}_1\overline{x}_2| |\overline{x}_3\overline{x}_4|}{|\overline{x}_3\overline{x}_4||\overline{x}_2\overline{x}_4|} \]

    其中:

    \[|\overline{x}_i\overline{x}_j| = det \left[ \begin{matrix} x_{i1} & x_{j1}\\x_{i2} & x_{j2} \end{matrix} \right] \]

    (1)交叉比率的值不取决于使用哪个特定的齐次表示点\(x_i\),因为分子和分母的比抵消了尺度。

    (2)如果每个点\(\overline{x}_i\)都是有限点,并且选择齐次表示,使得\(x_2 = 1\),那么\(|\overline{x}_i\overline{x}_j|\)表示\(\overline{x}_i\)到\(\overline{x}_j\)的带符号的距离。

    (3)如果其中一个\(\overline{x}_i\)是理想点,则交叉比率的定义依然有效。

    (4)交叉比率的值在任何投影变换下不变。

    下图说明了具有相等交叉比率的线之间的许多投影变换。

  10. 共点线:线束交比由射影平面偶像性质得来。即“点”与“直线”为对偶元素,“过一点作一条直线”与“在一条直线上取一点”为对偶作图。

    共点的四条线也有交比,根据对偶,共线的四个点有交比。且有对应的四点与四线的交比相等,如图:

    Multiple View Geometry in Computer Vision (Second Edition) 学习笔记-1

  11. 投影平面的拓扑:

    射影平面\(IP^2\)可以看作是所有齐次三维向量的集合。\(x =(x1,x2,x3)^T\)可以通过乘任何非零因子变换得\(x_1^2 + x_2^2 + x_3^2 = 1\),这样的点位于\(IR^3\)的单位球面上。

    在\(IP^2\)中,\(x\)和\(-x\)表示一个点,尽管它们之间差了一个负号。因此,\(IR^3\)中的单位球面\(S2\)与投影平面\(IP^2\)之间存在二对一的对应关系。用拓扑学的语言来说,球体\(S^2\)是\(IP^2\)的双叶覆盖空间。

    \(IP^1\)在拓扑上等同于标识了两个端点的线段,即圆\(S^1\)

  12. 无限线:在投影变换下,理想点可以映射到有限点,因此无穷线可以映射到有限线。然而仿射变换不能做到将无穷映射到有限。

  13. 在投影变换\(H\)下,无穷远直线\(l_\infty\)为不动直线的充要条件是\(H\)为仿射变换。

  14. 圆点及其对偶:在任何相似变换下,\(l_\infty\)上有两个不动点(称为虚圆点)\(I,J\):

    \[I = \left( \begin{matrix} 1\\i\\0 \end{matrix} \right)~~~~~~~J = \left( \begin{matrix} 1\\-i\\0 \end{matrix} \right) \]

    圆点是一对复共轭理想点,

    \[\begin{aligned} I' &= H_sI \\ &= \left[ \begin{matrix} s~ cos\theta & -s~sin\theta & t_x\\ s~ sin\theta & s~cos\theta & t_y\\ 0 & 0 & 1 \end{matrix} \right]\left( \begin{matrix} 1\\i\\0 \end{matrix} \right) \\&= se^{-i\theta}\left( \begin{matrix} 1\\i\\0 \end{matrix} \right) = I \end{aligned} \]

    对于\(J\)来说是一样的证明方法。

    即:当且仅当\(H\)是相似变换时,圆点\(I,J\)是投影变换\(H\)下的不动点。

    之所以称为“圆点”,是因为每个圆在圆点处相交\(l_\infty\),在圆锥为圆的情况下:a = c和b = 0,将a和c设置为1,此圆锥在\(x_3=0\)的理想点处与\(l_\infty\)相交,即\(x_1^2 + x_2^2 = 0\),该方程的解就是\(I = (1,i,0)^T\)和\(J = (1,-i,0)^T\)

    与虚圆点对偶的二次曲线

    \[C_\infty^* = IJ^T + JI^T \]

    它由两个圆点组成。在欧几里得坐标系统中:

    \[C_\infty^* = \left( \begin{matrix} 1\\i\\0 \end{matrix} \right)\left( \begin{matrix} 1 & -i & 0 \end{matrix} \right) \left( \begin{matrix} 1\\-i\\0 \end{matrix} \right)\left( \begin{matrix} 1 & i & 0 \end{matrix} \right) = \left[ \begin{matrix} 1 & 0 & 0\\0 & 1 & 0\\0 & 0 & 0 \end{matrix} \right] \]

    即:当且仅当\(H\)是相似变换时,对偶二次曲线\(C^*_\infty\)在投影变换\(H\)下不变。

    (1)\(C_\infty^*\)有四个*度:(\(3\times 3\)的齐次对称矩阵(5) - \(det(C^*_\infty)\) (1) = 4)

    (2)\(l_\infty\)是\(C_\infty^*\)的空向量,从而\(C_\infty^* l_\infty = 0\)

  15. 投影平面上的角度:两条线之间的角度是根据其法线的点积计算得出的。对于线\(l=(l_1,l_2,l_3)^T\)和\(m = (m_1,m_2,m_3)^T\)的法线分别平行于\((l_1,l_2)^T,(m_1,m_2)^T\)。

    角度为:

    \[cos\theta = \frac{l_1m_1+l_2m_2}{\sqrt{(l_1^2+l_2^2)(m_1^2+m_2^2)}} \]

    由于\(l\)和\(m\)的前两个分量在投影变换下没有明确定义的变换属性,因此上式在平面的仿射或投影变换后无法应用。

    更换形式为:

    \[cos\theta = \frac{l^TC_\infty^* m}{\sqrt{(l^TC_\infty^*l)(m^TC_\infty^*m)}} \]

    其中\(C_\infty^*\)是圆点的圆锥对偶。一旦在投影平面上确定了圆锥\(C_\infty^*\),则欧几里德角可以由上式测量。

    如果\(l^T C_\infty^* m = 0\),则线\(l\)和\(m\)正交。

  16. 长度比率:\(d(b,c):d(a,c) = sin\alpha:sin\beta\),其中\(d(x,y)\)表示\(x\)和\(y\)之间的欧氏距离。使用上面的公式,对于任何指定了\(C_\infty^*\)的投影帧,\(cos\alpha\)和\(cos\beta\)可以由\(l' = a' \times b', m' = c' \times a', n' = b'\times c'\)计算而来。因此,可以从投影映射点确定\(sin\alpha,sin\beta\)以及比率\(d(a,b):d(c,a)\)。

  17. 如果点变换\(x' = Hx\),则\(C_\infty^*{'} = \left[\begin{matrix}KK^T & KK^Tv\\v^TKK^T & v^TKK^Tv\end{matrix}\right]\)

    显然,射影分量\((v)\)和仿射分量\((K)\)是直接从\(C_\infty^*\)的图像确定的,但相似度分量不能确定。

  18. 度量校正:假设已对图像进行仿射校正,则我们需要两个约束条件来指定圆点的2个*度,以便确定度量校正。这两个约束可以从世界平面上两个成像的直角获得。

  19. 假设仿射校正图像中的线\(l',m'\)对应于世界平面上的正交线对\(l,m\)。通过\(l'^TC_\infty^*{'}m' = 0\),并且根据上面的公式,使得\(v = 0\),可以得到:

    \[\left( \begin{matrix} l_1' & l_2' & l_3' \end{matrix} \right) \left[ \begin{matrix} KK^T & 0\\0^T & 0 \end{matrix} \right] \left( \begin{matrix} m_1'\\m_2'\\m_3' \end{matrix} \right) = 0 \]

    这是对\(2 \times 2\)矩阵\(S = KK^T\)的线性约束。 矩阵\(S = KK^T\)是对称的,具有三个独立元素,因此具有2个*度(因为总体缩放比例不重要)

    公式可以简化为:

    \[(l_1',l_2')S(m_1',m_2')^T = 0 \]

  20. 一个点\(x\)和一个曲线\(C\)定义了一条线\(l = Cx\),线\(l\)称为\(x\)相对于\(C\)的极点,点\(x\)是\(l\)相对于\(C\)的极点。

    相对于圆锥\(C\)的点\(x\)的极线\(l = Cx\)在两个点上相交于圆锥。在这些点处与\(C\)相切的两条线在\(x\)处相交。

Multiple View Geometry in Computer Vision (Second Edition) 学习笔记-1

​ 如果点\(x\)在\(C\)上,则极点是在x处与圆锥曲线的切线。

  1. 关联:从\(IP^2\)的点到\(IP^2\)的线的可逆映射。由3×3非奇异矩阵\(A\)表示为\(l = Ax\)

    共轭点:如果点\(y\)在线\(l = Cx\)上,则\(y^T l = y^T C x = 0\)。

    满足\(y^TCx = 0\)的任意两点相对于圆锥\(C\)是共轭的。

    如果\(x\)在\(y\)的极点上,则\(y\)在\(x\)的极点上。

第三节 投影几何和三维变换

3.1 点和投影变换

  1. 三维空间点的齐次表示形式\(X = (x_1,x_2,x_3,x_4)^T\),其中若\(x_4 = 0\)则为无穷点。

  2. 作用于\(IP^3\)的投影变换是对由非奇异4×4矩阵表示的齐次四维向量的线性变换:\(X' = HX\)

  3. 三维空间中的平面可以写成

    \[\pi_1X + \pi_2Y + \pi_3Z + \pi_4 = 0 \]

    只有三个独立的平面系数比率\(\{π1:π2:π3:π4\}\)有效,所以平面在三维空间中有三个*度。

    表示点在平面上:

    \[\pi^TX = 0 \]

    \(\pi\)的前三个分量对应于欧几里得几何的平面法线。

    使用非齐次表示为\(n \tilde{X} + d = 0\),其中\(n = (\pi_1,\pi_2,\pi_3)^T,\tilde{X} = (x,y,z)^T, x_4 = 1, d = \pi_4\),在这种形式下,\(d / ||n||\)表示平面到原点的距离。

  4. 假设三个点\(X_i\)在平面\(\pi\)上,每个点都满足\(\pi^TX_i = 0\),联立得到以下形式:

    \[\left[ \begin{matrix} X_1^T\\X_2^T\\X_3^T \end{matrix} \right]\pi = 0 \]

    由于\(X_1,X_2,X_3\)是线性独立的\(\longrightarrow\)由点作为行组成的3×4矩阵的秩为3。

  5. 定义矩阵\(M = [X,X_1,X_2,X_3]\)由一个普通点和三个在面\(\pi\)上的点\(X_i\)组成。

    当\(X\)在平面\(\pi\)上时,\(det(M) = 0\)

    \(det(M)\)如下:

    \[det(M) = x_1D_{234} - x_2D_{134} + x_3 D_{124} - x_4D_{123} \]

    其中\(D_{jkl}\)是由\(4×3\)矩阵\([X_1,X_2,X_3]\)的\(jkl\)行形成的行列式。

    对于平面上的点,\(det(M) = 0\),所以平面的系数为\(\pi = (D_{234},-D_{134},D_{124},-D_{123})^T\)

    例如:假设\(X_1 =\left(\begin{matrix}\tilde{X}_1\\1\end{matrix}\right)\) \(X_2 =\left(\begin{matrix}\tilde{X}_2\\1\end{matrix}\right)\) \(X_3 =\left(\begin{matrix}\tilde{X}_3\\1\end{matrix}\right)\),其中\(\tilde{X} = (x,y,z)^T\)

    计算\(D_{234} = \left|\begin{matrix}Y_1 & Y_2 & Y_3\\Z_1 & Z_2 & Z_3\\1 & 1 & 1\end{matrix}\right| = ((\tilde{X}_1 - \tilde{X}_3) \times (\tilde{X}_2 - \tilde{X}_3))_1\)

    对于其他的\(D_{jkl}\)计算类似,最终得到:

    \[\pi = \left( \begin{matrix} (\tilde{X}_1 - \tilde{X}_3) \times (\tilde{X}_2 - \tilde{X}_3)\\ -\tilde{X}_3^T(\tilde{X}_1 \times \tilde{X}_2) \end{matrix} \right) \]

    则平面法线为:

    \[(\tilde{X}_1 - \tilde{X}_3) \times (\tilde{X}_2 - \tilde{X}_3) \]

  6. 在点变换\(X' = HX\)下,平面的变换为:\(\pi' = H^{-T} \pi\)

  7. 一条线可以通过其与两个正交平面的交点来指定。 每个交叉点都有2个*度,这表明IP3中的一条线总共有4个*度。

    Multiple View Geometry in Computer Vision (Second Edition) 学习笔记-1
  8. 平面\(\pi\)上的点\(X\)可以表示为:

    \[X = Mx \]

    其中\(M\)是\(4 \times 3\)的矩阵,其列形成了\(\pi^T\)的秩为3的零空间。\(\pi^T M = 0\)

    \(M\)不是唯一的,假设平面\(\pi = (a,b,c,d)^T\),并且\(a\)是非零的向量,那么\(M^T = [p|I_{3\times 3}]\),其中\(p = (-b/a, -c/a, -d/a)^T\)

  9. 假设两条直线\(L, \hat{L}\)分别有点\(A,B\)和\(\hat{A},\hat{B}\),那么当且仅当这四个点共面的时候,两条线会相交,其充要条件为:

    \[det[A,B,\hat{A},\hat{B}] = ··· = (L|\hat{L}) \]

    所以,当且仅当\((L|\hat{L}) = 0\)时,\(L\)和\(\hat{L}\)才会相交(共面)。

  10. 二次曲面:

\[X^TQX = 0 \]

其中Q是对称4×4矩阵。

上一篇:Learning_the_bash_Shell_Third_Edition 1/n


下一篇:跟老齐学Python Django实战 2/n Second edition