双目立体视觉 数学推导(从 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. 三角化选唯一正确解

相关推荐
得物技术19 小时前
得物社区搜推公式融合调参框架-加乘树3.0实战
算法
会员源码网2 天前
使用`mysql_*`废弃函数(PHP7+完全移除,导致代码无法运行)
后端·算法
木心月转码ing2 天前
Hot100-Day10-T438T438找到字符串中所有字母异位词
算法
HelloReader2 天前
Wi-Fi CSI 感知技术用无线信号“看见“室内的人
算法
颜酱2 天前
二叉树分解问题思路解题模式
javascript·后端·算法
qianpeng8972 天前
水声匹配场定位原理及实验
算法
董董灿是个攻城狮2 天前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员3 天前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish3 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱3 天前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法