双目立体视觉 数学推导(从 F → E → R,T)

目标定的数学推导链条:
从点的匹配 → 基础矩阵 F → 本质矩阵 E → 分解得到 R, T。

内容是数学推导 + 工程注意点,是视觉几何最核心部分。

1、整体流程(一张图看懂)

匹配点对

→ 解 基础矩阵 F

→ 用内参去掉像素坐标影响得到 本质矩阵 E = Kᵀ F K

→ 对 E 做 SVD 分解

→ 由 E 提取出两个旋转 R 和一个平移方向 T

→ 根据三角化取正确解(4 种组合取唯一物理解)

1. 从点匹配到基础矩阵 F(Fundamental Matrix)

给定多组同名点:

1. 极线约束来自极平面

任意 3D 点 X 在两个相机中成像为 x₁, x₂:

极平面经过 C1、C2 和 X,导致 x₁, x₂, T 三向量共面:

这正是极线约束。

2. DLT 八点法构建 F

对点对 (x1,x2)

展开得线性方程:

通过 SVD 最小奇值对应向量 得到 F,再强制 rank=2。

cpp 复制代码
function F = eight_point_F(pts1, pts2)
    % pts1, pts2: Nx2 对应点坐标 (N>=8)

    % --- 1. 归一化 ---
    [pts1_n, T1] = normalizePoints(pts1);
    [pts2_n, T2] = normalizePoints(pts2);

    N = size(pts1_n,1);
    x1 = pts1_n(:,1);  y1 = pts1_n(:,2);
    x2 = pts2_n(:,1);  y2 = pts2_n(:,2);

    % --- 2. 构建 A ---
    A = [x2.*x1, x2.*y1, x2, ...
         y2.*x1, y2.*y1, y2, ...
         x1,      y1,     ones(N,1)];

    % --- 3. SVD 求 f ---
    [~,~,V] = svd(A);
    F_n = reshape(V(:,end), 3,3)';

    % --- 4. rank-2 约束 ---
    [U,S,V] = svd(F_n);
    S(3,3) = 0;
    F_n = U * S * V';

    % --- 5. 反归一化 ---
    F = T2' * F_n * T1';
end


function [pts_n, T] = normalizePoints(pts)
    centroid = mean(pts,1);
    pts_c = pts - centroid;
    dist = mean(sqrt(sum(pts_c.^2,2)));
    s = sqrt(2) / dist;

    T = [s 0 -s*centroid(1);
         0 s -s*centroid(2);
         0 0 1];

    pts_h = [pts, ones(size(pts,1),1)]';
    pts_n_h = T * pts_h;
    pts_n = pts_n_h(1:2,:)' ;
end
cpp 复制代码
% 随机 8 对点
pts1 = rand(8,2) * 1000;
pts2 = rand(8,2) * 1000;

F = eight_point_F(pts1, pts2)

2. 由 F 得到本质矩阵 E

像素点满足 F,但 F 受到相机内参与像素坐标的影响。

而两相机在 归一化相机坐标系 下满足:

归一化坐标:

带人到极线约束中

所以本质矩阵为:

https://blog.csdn.net/weixin_39354845/article/details/158013357?sharetype=blogdetail&sharerId=158013357&sharerefer=PC&sharesource=weixin_39354845&spm=1011.2480.3001.8118

3. 本质矩阵 E 的结构特点

E 的理想结构:

https://blog.csdn.net/weixin_39354845/article/details/158010045?sharetype=blogdetail&sharerId=158010045&sharerefer=PC&sharesource=weixin_39354845&spm=1011.2480.3001.8118

4. 分解 E:SVD

对 E 做 SVD:

5. 提取旋转矩阵 R

6. 提平移方向 T

即 U 的第三列(对应零奇异值)是平移方向。

注意:

T 只有 方向,没有尺度(基线长度无法从图像求得)。

7. 四种组合(4 solutions)

8. 选出正确解:三角化(正深度约束)

总结:

✔ Step1. 八点法求 F

线性最小二乘 + rank2

✔ Step2. E = Kᵀ F K

https://blog.csdn.net/weixin_39354845/article/details/158013357?sharetype=blogdetail&sharerId=158013357&sharerefer=PC&sharesource=weixin_39354845&spm=1011.2480.3001.8118

将像素约束转成归一化坐标

✔ Step3. E = [T]× R

https://blog.csdn.net/weixin_39354845/article/details/158010045?sharetype=blogdetail&sharerId=158010045&sharerefer=PC&sharesource=weixin_39354845&spm=1011.2480.3001.8118

极平面几何必然给出

✔ Step4. 从 E 分解出 R,T(4 解)

✔ Step5. 三角化选唯一正确解

相关推荐
程序员夏末20 分钟前
【LeetCode | 第七篇】算法笔记
笔记·算法·leetcode
csdn_aspnet1 小时前
C/C++ 两个凸多边形之间的切线(Tangents between two Convex Polygons)
c语言·c++·算法
数据皮皮侠1 小时前
中国城市间地理距离矩阵(2024)
大数据·数据库·人工智能·算法·制造
3GPP仿真实验室1 小时前
深度解析基站接收机核心算法:从 MRC 到 IRC 的空间滤波演进
算法
Boop_wu1 小时前
[Java 算法] 动态规划(1)
算法·动态规划
WolfGang0073211 小时前
代码随想录算法训练营 Day18 | 二叉树 part08
算法
hanlin033 小时前
刷题笔记:力扣第43、67题(字符串计算)
笔记·算法·leetcode
yang_B6213 小时前
最小二乘法 拟合平面
算法·平面·最小二乘法
放下华子我只抽RuiKe53 小时前
深度学习全景指南:硬核实战版
人工智能·深度学习·神经网络·算法·机器学习·自然语言处理·数据挖掘
吴秋霖3 小时前
【某音电商】protobuf聊天协议逆向
python·算法·protobuf