网站开发实例视频教程,做网站应选那个主题,品牌logo设计说明,视频黄台在线观看1 八点法计算F矩阵#xff08;基础矩阵#xff09;
基础矩阵用于描述两个视图之间的几何关系 基础矩阵#xff1a;基础矩阵 F F F 是描述两个视图之间相机投影关系的矩阵。对于两个对应的图像坐标点 ( x , y , 1 ) (x, y, 1) (x,y,1) 和 ( u , v , 1 ) (u, v, 1) (u,v,1…1 八点法计算F矩阵基础矩阵
基础矩阵用于描述两个视图之间的几何关系 基础矩阵基础矩阵 F F F 是描述两个视图之间相机投影关系的矩阵。对于两个对应的图像坐标点 ( x , y , 1 ) (x, y, 1) (x,y,1) 和 ( u , v , 1 ) (u, v, 1) (u,v,1) 在两个视图上基础矩阵满足以下方程 这个方程即对极约束描述了图像中对应点的投影关系 [ u v 1 ] T ⋅ F ⋅ [ x y 1 ] 0 \begin{bmatrix} u \\ v \\ 1 \end{bmatrix}^T \cdot F \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} 0 uv1 T⋅F⋅ xy1 0 线性系统对于多对对应点可以构建一个线性方程系统 A f 0 Af 0 Af0 其中 A A A 是由对应点生成的矩阵 f f f 是基础矩阵的扁平形式 上述方程即 [ u v 1 ] ⋅ [ f 11 f 12 f 13 f 21 f 22 f 23 f 31 f 32 f 33 ] ⋅ [ x y 1 ] 0 \begin{bmatrix} u v 1 \end{bmatrix} \cdot \begin{bmatrix} f_{11} f_{12} f_{13} \\ f_{21} f_{22} f_{23} \\ f_{31} f_{32} f_{33} \end{bmatrix} \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} 0 [uv1]⋅ f11f21f31f12f22f32f13f23f33 ⋅ xy1 0
展开得到 [ u x v x x u y v y y u v 1 ] ⋅ [ f 11 f 12 f 13 f 21 f 22 f 23 f 31 f 32 f 33 ] 0 \begin{bmatrix} uxvxxuyvyyuv1 \end{bmatrix}\cdot \begin{bmatrix}f_{11} \\ f_{12} \\ f_{13} \\ f_{21} \\ f_{22} \\ f_{23} \\ f_{31} \\ f_{32} \\ f_{33} \\ \end{bmatrix} 0 [uxvxxuyvyyuv1]⋅ f11f12f13f21f22f23f31f32f33 0
这个矩阵方程可以表示为 A i f 0 A_if 0 Aif0
为了解出这个9个未知数的 f f f 我们至少需要8对点所以叠加 A i A_i Ai 得到 A A A 矩阵 A [ x 1 u 1 x 1 v 1 x 1 y 1 u 1 y 1 v 1 y 1 u 1 v 1 1 x 2 u 2 x 2 v 2 x 2 y 2 u 2 y 2 v 2 y 2 u 2 v 2 1 ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮ x 8 u 8 x 8 v 8 x 8 y 8 u 8 y 8 v 8 y 8 u 8 v 8 1 ] A \begin{bmatrix} x_1u_1 x_1v_1 x_1 y_1u_1 y_1v_1 y_1 u_1 v_1 1 \\ x_2u_2 x_2v_2 x_2 y_2u_2 y_2v_2 y_2 u_2 v_2 1 \\ \vdots \vdots \vdots \vdots \vdots \vdots \vdots \vdots \vdots \\ x_8u_8 x_8v_8 x_8 y_8u_8 y_8v_8 y_8 u_8 v_8 1 \end{bmatrix} A x1u1x2u2⋮x8u8x1v1x2v2⋮x8v8x1x2⋮x8y1u1y2u2⋮y8u8y1v1y2v2⋮y8v8y1y2⋮y8u1u2⋮u8v1v2⋮v811⋮1 最小二乘法通过奇异值分解SVD取 V T V^T VT 的最后一列作为估计矩阵 A A A 的最小二乘解即 f f f 方程的最小二乘解有一个既定的结论即对 A A A 进行SVD分解得到的 V T V^T VT 的最后一行 即是 f f f 的解 基础矩阵还原将 f f f reshape 为 3 × 3 3 \times 3 3×3 的矩阵然后通过奇异值分解SVD对矩阵进行调整以确保基础矩阵的秩为2 SVD分解 对矩阵 F F F 进行奇异值分解 F U Σ V T F U \Sigma V^T FUΣVT 其中 U U U 和 V V V 是正交矩阵 Σ \Sigma Σ 是对角矩阵 秩-2约束 将奇异值矩阵 Σ \Sigma Σ 调整为仅保留前两个奇异值将第三个奇异值设为0以确保基础矩阵的秩为2 重构基础矩阵 F U Σ ′ V T F U \Sigma V^T FUΣ′VT F f.reshape((3, 3))# 对F进行SVD分解
U, S, Vt np.linalg.svd(F)# 将奇异值矩阵Sigma调整为仅保留前两个奇异值第三个设为0
S[2] 0# 重构基础矩阵F
F np.dot(U, np.dot(np.diag(S), Vt))归一化对基础矩阵进行归一化以确保尺度的一致性
2 标准化八点算法
对普通的八点算法进行了改进通过标准化输入数据提高了算法的稳健性和准确性 我们首先将对应点标准化为零均值和单位方差以消除尺度的影响 mean1 np.mean(keypoints1, axis0)
mean2 np.mean(keypoints2, axis0)
std1 np.std(keypoints1, axis0)
std2 np.std(keypoints2, axis0)
# 防止除0由于齐次坐标标准差std算得最后一项为0
std1[2] 1
std2[2] 1
nomalized_points1 (keypoints1 - mean1) / std1
nomalized_points2 (keypoints2 - mean2) / std2x ˉ x − μ x ˉ σ x \bar{x} \frac{x - \bar{\mu_x}}{\sigma_x} xˉσxx−μxˉ
也等于左乘一个转换矩阵 T T T T [ 1 σ x 0 − μ x σ x 0 1 σ y − μ y σ y 0 0 1 ] T \begin{bmatrix} \frac{1}{\sigma_x} 0 -\frac{\mu_x}{\sigma_x} \\ 0 \frac{1}{\sigma_y} -\frac{\mu_y}{\sigma_y} \\ 0 0 1 \end{bmatrix} T σx1000σy10−σxμx−σyμy1 在这些标准化点上运行八点算法 最后对得到的基本矩阵进行反变换在计算基础矩阵后需要将其进行撤销标准化处理以获得最终的基础矩阵 F T 2 − 1 ⋅ F n o r m a l i z e d ⋅ T 1 F T_2^{-1} \cdot F_{normalized} \cdot T_1 FT2−1⋅Fnormalized⋅T1
3 三角测量
我们有两个相机它们的c分别为 P 1 P_1 P1 和 P 2 P_2 P2 3 × 4 3 \times 4 3×4 矩阵。 P K [ R ∣ t ] P K\begin{bmatrix}R|t\end{bmatrix} PK[R∣t]
对于一个在相机1和相机2中分别观察到的同一物体的对应点 x ~ 1 \tilde x_1 x~1 和 x ~ 2 \tilde x_2 x~2 齐次坐标 3 × 1 3 \times 1 3×1 向量 我们可以得到以下方程其中 X ~ \tilde X X~ 齐次坐标 4 × 1 4 \times 1 4×1 向量是物体在三维空间中的坐标 P 1 X ~ x ~ 1 P 2 X ~ x ~ 2 P_1 \tilde X \tilde x_1\\ P_2 \tilde X \tilde x_2 P1X~x~1P2X~x~2
将 P P P 分解为三个向量 P i [ P i 1 P i 2 P i 3 ] P i 1 [ p 11 , p 12 , p 13 , p 14 ] P i 2 [ p 21 , p 22 , p 23 , p 24 ] P i 3 [ p 31 , p 32 , p 33 , p 34 ] P_i \begin{bmatrix}P_{i1}\\ P_{i2} \\ P_{i3} \end{bmatrix} \\ P_{i1} [p_{11}, p_{12}, p_{13}, p_{14}] \\ P_{i2} [p_{21}, p_{22}, p_{23}, p_{24}] \\ P_{i3} [p_{31}, p_{32}, p_{33}, p_{34}] \\ Pi Pi1Pi2Pi3 Pi1[p11,p12,p13,p14]Pi2[p21,p22,p23,p24]Pi3[p31,p32,p33,p34]
这样原等式就变为 [ P i 1 X ~ P i 2 X ~ P i 3 X ~ ] [ x i y i 1 ] \begin{bmatrix}P_{i1}\tilde X \\ P_{i2}\tilde X \\ P_{i3}\tilde X\end{bmatrix} \begin{bmatrix}x_i \\ y_i \\ 1\end{bmatrix} Pi1X~Pi2X~Pi3X~ xiyi1
将左边向量齐次化除以第三个元素与右边向量元素一一对应 P i X ~ [ P i 1 X ~ P i 3 X ~ P i 2 X ~ P i 3 X ~ 1 ] [ x i y i 1 ] x ~ i x i P i 1 X ~ P i 3 X ~ ⇒ x i P i 3 X ~ − P i 1 X ~ 0 y i P i 2 X ~ P i 3 X ~ ⇒ y i P i 3 X ~ − P i 2 X ~ 0 P_i \tilde X \begin{bmatrix} \frac{P_{i1} \tilde X}{P_{i3}\tilde X} \\ \frac{P_{i2} \tilde X}{P_{i3} \tilde X} \\ 1 \end{bmatrix} \begin{bmatrix}x_i \\ y_i \\ 1 \end{bmatrix} \tilde x_i \\ x_i \frac{P_{i1} \tilde X}{P_{i3} \tilde X} \Rightarrow x_iP_{i3} \tilde X-P_{i1} \tilde X 0 \\ y_i \frac{P_{i2} \tilde X}{P_{i3} \tilde X} \Rightarrow y_iP_{i3} \tilde X-P_{i2} \tilde X 0 PiX~ Pi3X~Pi1X~Pi3X~Pi2X~1 xiyi1 x~ixiPi3X~Pi1X~⇒xiPi3X~−Pi1X~0yiPi3X~Pi2X~⇒yiPi3X~−Pi2X~0
由于我们知道 x 1 x_1 x1 、 x 2 x_2 x2 和 P 1 P_1 P1 、 P 2 P_2 P2 我们可以将其转化为一个齐次线性方程组 A 1 [ x 1 P 13 − P 11 y 1 P 13 − P 12 ] A 2 [ x 2 P 23 − P 21 y 2 P 23 − P 22 ] A [ A 1 A 2 ] A X ~ 0 A_1 \begin{bmatrix} x_1 P_{13} - P_{11} \\ y_1 P_{13} - P_{12} \end{bmatrix} \\ A_2 \begin{bmatrix} x_2 P_{23} - P_{21} \\ y_2 P_{23} - P_{22} \end{bmatrix} \\ A \begin{bmatrix}A_1 \\ A_2 \end{bmatrix} \\ A\tilde X 0 A1[x1P13−P11y1P13−P12]A2[x2P23−P21y2P23−P22]A[A1A2]AX~0
A np.array([keypoint1[0] * P1[2] - P1[0],keypoint1[1] * P1[2] - P1[1],keypoint2[0] * P2[2] - P2[0],keypoint2[1] * P2[2] - P2[1]]
)这样我们就可以使用最小二乘法或其他方法来解决这个线性方程组从而找到物体的三维位置 X X X
# DLT算法解决最小二乘法
_, _, Vt np.linalg.svd(A)
x_w Vt[-1]
x_w x_w / x_w[3] # 齐次坐标