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

相关推荐
hahaha60161 小时前
HLS高层次综合设计技巧--数组
开发语言·嵌入式硬件·算法·fpga开发
不会就选b1 小时前
算法日常・每日刷题--<贪心>10
算法
南京兴帝文化传媒有限公司1 小时前
本地生活服务商户GEO优化技术实践:AI大模型收录机制与地图POI权重算法拆解
大数据·人工智能·算法·生活·geo优化实操·csdn运营技巧·ai内容收录
linx2952 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
布莱克6052 小时前
C++ 七大排序算法详解:选择、冒泡、插入、计数、堆、快速与归并排序
数据结构·c++·算法·排序算法
shehuiyuelaiyuehao3 小时前
算法44,模拟算法,数青蛙
算法·哈希算法·散列表
hanlin033 小时前
刷题笔记:力扣第287题-寻找重复数
笔记·算法·leetcode
kevin_kang3 小时前
第02章 对话时间线与延迟分析
算法
科学实验家3 小时前
最小生成树:Prim,kruskal
数据结构·c++·算法
学习智者3 小时前
《玄》IDE v3.6.3重磅发布:全功能修复与性能飞跃
开发语言·c++·ide·算法·中文语言 玄