news 2026/10/1 16:22:15

基础矩阵与本质矩阵:对极几何、归一化八点法与位姿估计实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基础矩阵与本质矩阵:对极几何、归一化八点法与位姿估计实战

做视觉SLAM、三维重建或者双目立体匹配的朋友,几乎都会在对极几何这一关卡上一段时间。基础矩阵和本质矩阵这两个词,我第一次看到的时候脑子里冒出的第一个念头是"这不就是同一个东西的不同叫法吗"。直到后来做相机标定、跑运动恢复结构、调双目极线校正,被各种精度问题和退化场景反复教育之后,才把这两者的边界彻底分清楚。它们描述的都是同一件事——两张图像之间的对极约束,是恢复相机相对运动、做稠密重建绕不开的核心工具。区别说穿了就一句话:本质矩阵工作在归一化相机坐标下,基础矩阵工作在像素坐标下,两者之间隔着一个相机内参矩阵的换算。可就是这一句换算,会直接决定你标定出来的位姿准不准、三角化出来的点稳不稳,甚至决定整套重建流程能不能跑通。下面我把自己这些年在项目里推导过的公式、调过的代码、踩过的坑完整整理一遍,刚入门的学生和正在落地的工程同学应该都能找到能直接抄的东西。

1. 先搞清楚这两个矩阵到底在解决什么问题

1.1 从对极几何说起

同一台相机在两个不同位置拍同一个空间点,这个点在第一张图的投影位置,会约束它在第二张图里可能出现的区域。这个约束就是所谓的对极约束,那条线叫极线,两幅图里的对应点必须落在彼此的极线上。这个几何关系之所以重要,是因为它把"在整张图里找一个匹配点"这个二维搜索问题,压缩成了"在某条直线上找一个点"的一维搜索问题,匹配代价直接降了一个维度。极线几何的精髓在于,两台相机的中心、空间中的一个点,以及它在两张图像上的投影,这五个东西是共面的。正是这个共面条件,让空间点在被两个相机中心连线切割的平面里被约束住。我习惯把这个平面想象成一张纸:两个相机光心之间的连线是纸的折缝,空间点和它的两个投影都贴在这张纸上,怎么动都跑不出这张纸,数学上就写成了一个等式,矩阵就是这个等式的系数表达。

理解对极几何的直观价值在于,它不需要你知道空间点的三维坐标,也不需要你知道两个相机之间的准确运动,只需要点与点之间的对应关系就能建立起约束。这就是为什么它成了无标定、未知运动的视觉任务里的核心工具。你手里有相机,随便拍两张有重叠的照片,只要能找到足够多的匹配点,就能反推出相机之间的旋转和平移,以及这些点的空间位置。整个流程起点就是对极约束。但它有一个很关键的隐含条件:约束的建立依赖于两帧之间有足够的平移,如果相机只是原地转圈,这个约束会退化,后面会详细讲。

1.2 基础矩阵和本质矩阵的本质区别

把对极约束写成矩阵形式,根据你用的坐标单位不同,会得到两个不同的矩阵。如果你用的是归一化相机坐标,也就是把像素坐标先减去光心、再除以焦距之后得到的量,那么得到的矩阵就是本质矩阵,通常记作 E。如果你用的是原始像素坐标,那么得到的矩阵就是基础矩阵,记作 F。两者的关系非常干净:F 等于内参矩阵的转置逆、乘本质矩阵、再乘内参逆。反过来说,本质矩阵是基础矩阵剥离掉相机内参之后的纯净版本,它只包含两个相机之间的旋转和平移信息,跟相机自身的焦距、主点、像素尺度完全无关。

这个区别看似只是坐标变换,实际影响很大。本质矩阵只依赖外部几何,所以它可以直接用来做位姿估计,是视觉里程计和SLAM里的首选。基础矩阵包含了内参,所以它对相机的内参变化很敏感,标定不准会直接污染帧间估计。但因为基础矩阵直接作用在像素坐标上,不需要你提前知道相机内参,所以在完全未知内参的场合,比如随手拍的照片重建、互联网图片的位姿推断,基础矩阵反而是唯一可用的工具。工程上常见的做法是先用基础矩阵做粗估计收窄范围,等到内参标定完成或者有足够多帧数据后,再切换到本质矩阵做更精确的位姿求解。

两者还有一个很容易被忽略的差异:本质矩阵有五个自由度,基础矩阵有七个自由度。本质矩阵由三个旋转参数和两个平移方向参数组成,平移的长度无法从对极约束中恢复,这是单目视觉的尺度不确定性决定的。基础矩阵多出来的两个自由度来自相机内参,焦距和主点在多数场景下不会事先完全已知。自由度不同意味着最少需要的匹配点数也不同,解本质矩阵理论上五点就够了,解基础矩阵至少要七点,实际工程里为了数值稳定通常用八点甚至更多。

2. 数学推导与自由度分析

2.1 从共面约束推出本质矩阵

推导本质矩阵最干净的方式是从共面条件出发。设空间点 P 在两个相机坐标系下的坐标分别是 X1 和 X2,两个相机之间的旋转是 R,平移是 t,那么 X2 等于 R 乘 X1 加 t。把这两个相机中心、空间点构成的三个向量摆在一起,它们共面意味着三者的混合积为零。经过几步整理,可以得到 X2 转置、乘上平移反对称矩阵、再乘 R、最后乘 X1,整体等于零。把中间的组合整体记作 E,就是 E 等于平移反对称矩阵乘 R。

这里平移向量写成反对称矩阵这一步很关键。为什么要用反对称矩阵?因为我们要表达的是"叉乘"这个操作,而叉乘可以写成矩阵与向量的乘法形式,反对称矩阵就是叉乘算子的矩阵表示。第一次看到这个构造会觉得很巧妙,实际上它是把三维向量之间的几何关系转化为矩阵乘法的标准手段。理解了这一点,后面看到任何与叉乘相关的矩阵构造都不会再发懵。反对称矩阵有个很好的性质,它的秩是二,行列式为零,这直接决定了本质矩阵必然是奇异的,秩最多为二。

本质矩阵的另一个重要性质是它的两个非零奇异值相等。你可以对本质矩阵做奇异值分解,理论上会得到三个奇异值,其中两个相等、第三个为零。这个性质不是巧合,而是从 E 等于叉乘矩阵乘旋转矩阵这个结构直接推出来的。旋转矩阵是正交的,不改变奇异值,而叉乘矩阵的奇异值本身就是一个非零值加一个零的形态,组合之后就是两个相等奇异值加一个零。工程上这个性质被用作约束:当你通过含噪数据求出一个近似的本质矩阵时,会强制把它的奇异值投影到"两个相等、一个为零"的流形上,这一步能显著提升位姿精度。

2.2 内参矩阵如何把本质矩阵变成基础矩阵

归一化相机坐标和像素坐标之间隔着一个相机内参矩阵。像素坐标 p 等于内参矩阵乘归一化坐标 X。把这个关系代入本质矩阵的对极约束里,就能得到基础矩阵的对极约束。整理之后,基础矩阵等于内参矩阵的转置逆、乘本质矩阵、再乘内参矩阵的逆。注意这里两个相机的内参可以不同,所以严格写法是第一幅图内参的转置逆、乘本质矩阵、再乘第二幅图内参的逆,只有在两个相机完全一样时才能简化成对称形式。

推导过程里最容易搞混的是内参矩阵作用在哪一侧。我自己的记忆方法是这样的:本质矩阵作用在两个归一化坐标之间,一边一个。要把左边的归一化坐标换成像素坐标,就要乘上对应相机内参的逆;右边同理。转置的位置来自对极约束的对称结构,X2 转置乘 E 乘 X1 等于零,把 X2 替换掉的时候转置会跟着走。第一次推导建议老老实实把每一步写下来,把内参矩阵的下标标清楚,推过三遍之后就不会再错了。很多人在这一步出错,导致后面的位姿求解结果始终差一个转置,方向全反,白白浪费好几天。

这个换算关系还有一层实际意义:基础矩阵的精度严重依赖于内参的精度。如果内参标定有误差,比如焦距偏了百分之一,那么换算出来的位姿误差会被放大到几个像素对应的角度,在长基线或者大视场场景下会非常明显。所以只要条件允许,优先用本质矩阵做位姿估计,把内参的影响提前剥离掉。在做双目系统的时候,内参是离线标定好的固定值,这时候通常直接用本质矩阵,只有在快速原型验证阶段图省事才会用基础矩阵。

2.3 自由度与秩约束的关键细节

理解自由度对于选择求解方法和判断问题是否可解非常重要。一个三维旋转有三个自由度,一个三维平移有方向两个自由度加上长度一个自由度,但平移的长度在单目对极约束里是观测不到的,所以本质矩阵只有五个自由度。这意味着理论上你至少需要五个点对就能解出本质矩阵,而且这五个点还要满足一般位置条件,不能全落在一个平面上。五点法就是基于这个自由度设计的,它通过构造多项式方程组来求解,精度通常比八点法好,但实现复杂度高很多,计算成本也大。

基础矩阵有七个自由度,所以最少需要七个点对。七点法通过行列式为零这个约束构造三次方程,解出来可能有多个候选基础矩阵,通常会有三个实数解,需要额外用其他点对来筛选。八点法则更直接,八对点给出八个线性方程,解一个线性方程组就能得到基础矩阵,不需要处理多项式,实现简单、速度快,所以工程上用得最多。但八点法的弱点是数值敏感,直接拿原始像素坐标去解,坐标值动辄几百上千,矩阵条件数很差,解出来的结果可能完全不能用。这就是归一化八点法存在的原因。

秩约束是这两个矩阵都必须满足的硬性条件。基础矩阵和本质矩阵的行列式都为零,秩最多为二。如果你从含噪数据里求出的是一个接近满秩的矩阵,那么它对应的极线束会全部交汇在同一个点上,几何意义就错了。工程上必须强制施加秩约束,做法是对求出的矩阵做奇异值分解,把最小的那个奇异值置零,再重新组装回去。这一步看着简单,但不做的话,极线会明显偏离,三角化出来的深度误差会非常大。本质矩阵还多一个约束,就是两个非零奇异值要相等,这个在求解位姿前也要强制施加。

3. 八点法与归一化求解实操

3.1 线性求解的基本思路

八点法的核心思想是把对极约束展开成一个关于矩阵元素的线性方程。对于每一对匹配点,把它的像素坐标代入约束式,展开后能得到一个关于基础矩阵九个元素的一次齐次方程。九对点能提供九个方程,但因为基础矩阵存在尺度不确定性,只有八个自由度是有效的,所以八个点对就够解了。把所有点对对应的方程叠起来,形成一个系数矩阵,求这个矩阵的零空间向量,就是这个基础矩阵的九个元素。

求零空间最稳的方式是做奇异值分解,取最小奇异值对应的那个右奇异向量。为什么不直接用最小二乘正规方程去解?因为系数矩阵的维度是八乘九,本身是超定或者接近方阵的形态,直接用正规方程会把条件数平方,数值稳定性差很多。奇异值分解在数值上稳定得多,而且能顺便拿到奇异值分布,判断问题有没有退化。我是被正规方程的数值问题坑过一次之后才养成一律用奇异值分解的习惯的,这个习惯后来在无数场景里救过我。

但直接对原始像素坐标做上面这套流程,结果往往惨不忍睹。原因前面提过,像素坐标数值大,列与列之间尺度差异悬殊,系数矩阵条件数爆炸。解决办法就是 Hartley 提出的归一化,先把两幅图的点各自做一次平移和缩放,让所有点的质心移到坐标原点、平均距离归一到根号二,对归一化后的点求解,得到归一化坐标系下的基础矩阵,最后再把这个矩阵变换回原始坐标。这个操作看着只是预处理,实际效果是数量级的提升,是所有可靠的八点法实现里必须的一步。

3.2 归一化八点法的手工实现

下面这段代码是我在项目里反复用过的精简版本,用 numpy 实现,把归一化、求解、秩约束、反归一化四步都写清楚了,可以直接拿去跑。

import numpy as np def normalize_points(pts): # 计算质心 centroid = pts.mean(axis=0) # 平移到原点 shifted = pts - centroid # 计算平均距离 mean_dist = np.sqrt((shifted ** 2).sum(axis=1)).mean() scale = np.sqrt(2.0) / mean_dist # 构造归一化矩阵 T = np.array([ [scale, 0, -scale * centroid[0]], [0, scale, -scale * centroid[1]], [0, 0, 1] ]) # 应用到点上 pts_h = np.hstack([pts, np.ones((pts.shape[0], 1))]) pts_norm = (T @ pts_h.T).T[:, :2] return pts_norm, T def eight_point(pts1, pts2): # 归一化两组点 p1, T1 = normalize_points(pts1) p2, T2 = normalize_points(pts2) # 构造系数矩阵 n = p1.shape[0] A = np.zeros((n, 9)) for i in range(n): x1, y1 = p1[i] x2, y2 = p2[i] A[i] = [x2 * x1, x2 * y1, x2, y2 * x1, y2 * y1, y2, x1, y1, 1] # SVD 求零空间 _, _, Vt = np.linalg.svd(A) F = Vt[-1].reshape(3, 3) # 强制秩为 2 U, S, Vt2 = np.linalg.svd(F) S[2] = 0 F = U @ np.diag(S) @ Vt2 # 反归一化 F = T2.T @ F @ T1 return F

这段代码里有两个地方值得单独强调。一是归一化的那个尺度取根号二,这是 Hartley 原文里的推荐值,目的是让点的平均距离落到一个数值友好的量级,别用一或者别的值,那都是拍脑袋来的。二是强制秩约束放在反归一化之前,因为奇异值分解在归一化坐标系下做更稳定。我曾经把秩约束放到最后做,结果反归一化之后矩阵元素的尺度差异又把奇异值搞乱,秩约束形同虚设,极线偏得离谱,这个顺序问题排查了一整天才定位到。

代码里用 SVD 求零空间这一步,取的是最后一个右奇异向量,也就是最小奇异值对应的方向。这里可以用奇异值比值来判断解的可靠性,如果第二小的奇异值和最小奇异值数量级接近,说明约束不够,解不稳定,需要重新检查匹配点质量。这个判断我一般会在调试阶段打印出来看,正式跑的时候靠随机采样一致性来做鲁棒筛选。

3.3 强制秩约束与奇异值修正

秩约束这一步单独展开说一下,因为它在两个矩阵上的表现不太一样。对于基础矩阵,做完奇异值分解之后把最小的奇异值直接置零就行,两个非零奇异值是多少不用管,保留原值即可。但对于本质矩阵,光置零不够,还要求两个非零奇异值相等。正确的做法是把两个非零奇异值都设成它们的平均值,或者干脆都设成同一个固定值,因为本质矩阵本身存在尺度不确定性,具体值不重要,重要的是两者相等这个约束。

为什么本质矩阵有这个额外约束?回顾第一节的推导,本质矩阵等于反对称矩阵乘旋转矩阵,反对称矩阵的两个非零奇异值相等,旋转矩阵是正交阵不改变奇异值,所以乘出来的结果两个非零奇异值必然相等。这是从代数结构直接推出来的必然结果,不是近似。工程上如果你求出的本质矩阵两个非零奇异值差了百分之几,那说明数据里有噪声或者求解有问题,强制投影到正交流形上能把这部分误差抹掉,代价是引入一点偏差,但收益远大于损失。

我遇到过一种情况是两帧之间几乎是纯旋转,平移非常小,这时候本质矩阵接近退化成旋转相关的形态,奇异值分布会出现一个大的和两个接近零的。这种场景下无论怎么修正秩约束都救不回来,正确的做法是识别出这种退化,放弃用本质矩阵恢复平移,改用单应矩阵来处理纯旋转或者弱平移的情况,或者干脆等平移量积累够了再估计。识别的方法后面问题排查那节会讲。

4. 从矩阵中分解相机位姿

4.1 SVD分解得到四种可能解

拿到本质矩阵之后,下一步是把它分解成旋转和平移。这一步有标准解法,原理是把本质矩阵做奇异值分解,会得到两个正交矩阵和一个对角矩阵。因为本质矩阵的两个非零奇异值相等,对角矩阵可以归一化成对角线上是 1、1、0 的形式。然后利用那个固定的旋转结构,可以从两个正交矩阵里构造出旋转候选,从另一个正交矩阵里取出平移方向候选。

具体来说,平移有两个可能的方向,互为相反数,旋转也有两个可能的组合,这样一组合就得到四组解。这四组解里只有一组是物理上正确的,也就是能让所有匹配点都落在两个相机前方的那一组。这个物理约束叫手性约束或者正深度约束,是筛选正确解的唯一依据。平移的绝对长度在单目场景下无法确定,所以一般把平移向量归一化到单位长度,这在后续做尺度对齐的时候再统一处理。

代码实现的时候有几个细节。首先分解出来的旋转要检查行列式是不是正一,如果算出来是负一,说明构造过程中符号错了,需要取反修正。其次平移向量是从正交矩阵的第三列取出来的,取哪一列、正号还是负号,不同的推导路径会有差异,建议直接跑一遍用已知的真值验证一下符号约定,别死记硬背。我第一次实现的时候就是符号搞反了,重建出来的点全在相机后面,调了两天才反应过来是手性筛选没做对。

4.2 手性检验筛选唯一正确解

手性检验的操作很直接:对四组候选位姿,每一组都拿一部分匹配点做三角化,算出这些点在两个相机坐标系下的深度,然后统计有多少点的深度同时为正。物理上正确的解应该让绝大多数点都在两个相机的前方,错误解则会有一大半点落到后面。哪个解的正面点数最多,哪个就是答案。

这个检验看着简单,但实际项目里经常被忽略一个重要细节:应该用足够多的点来投票,而不是随便挑几个。我一般会随机抽一批点,大概几十到上百个,数量太少容易受个别错误匹配的影响,数量太多又浪费计算。另外在筛选之前最好先把明显的错误匹配剔掉,比如极线距离过大的点,否则这些点会污染投票结果。随机采样一致性框架里,这一步通常和模型拟合结合在一起,先用一致性集算出位姿,再用一致性集做手性检验。

还有一点,手性检验算深度的过程本身涉及三角化,三角化的精度又依赖于位姿估计的精度,这看起来有点像鸡生蛋的问题。实际处理顺序是先有候选位姿,用它三角化,再根据深度正负筛选位姿,筛选完成后再用选中的位姿重新三角化一次得到最终的点云。这个两阶段流程在工程上很常见,不要把两个环节揉在一起,那样误差会互相放大。

4.3 三角化验证与尺度问题

三角化本身也有很多细节值得说。给定两个相机的投影矩阵和一对匹配点,理论上两条射线会相交于空间中一点,但因为噪声存在,两条射线往往不相交,需要用最小二乘求一个近似交点。实现上有两种常见方法,一种是线性三角化,直接把约束写成线性方程求最小二乘解,简单但精度一般;另一种是重投影误差最小化,求解非线性优化问题,精度高但计算量大。多数SLAM系统里用线性方法做初值,再用非线性优化精修,兼顾速度和精度。

尺度问题是单目视觉绕不开的坎。从本质矩阵恢复出来的平移是单位长度的,重建出来的点云和真实世界之间差一个整体的缩放因子。你可以把重建结果整体放大缩小而不改变任何一张图像上的投影,所以单目重建天生就没有绝对尺度。要在工程里解决这个问题,通常靠外部信息引入尺度,比如已知某个物体的实际尺寸、用惯性测量单元提供的位移、或者双目基线长度。我在做单目里程计的时候,习惯是每隔一段距离用一次已知尺寸的地面标记物做一次尺度校正,防止长时间累积漂移。

三角化还有一个容易踩的坑是深度太远的点精度极差。当空间点距离相机很远的时候,两条射线的夹角很小,一点点像素噪声就会导致深度估计的巨大波动。工程上要设一个深度截断,超过某个距离的点直接丢弃,或者标记为低置信度。这个阈值要根据基线和成像分辨率来定,我通常的做法是统计深度分布,把深度特别大、置信区间特别宽的点过滤掉,宁可少一点也要保证质量。

5. 常见问题与排查技巧实录

5.1 退化配置的识别

退化配置是这类方法最隐蔽的杀手,因为它不会报错,只会给你一个看起来合理但实际完全错误的结果。最常见的退化是纯旋转,也就是两帧之间只有转动没有平移。这时候两幅图像之间的视差全部来自旋转,对极几何的约束会失效,基础矩阵和本质矩阵都退化成无意义的形式。识别方法是检查平移向量,如果通过某种方式估计出来的平移接近零,或者从基础矩阵解出的极线分布异常,就要警惕。另一种实用的判断是看匹配点的视差分布,纯旋转场景下视差几乎为零。

平面场景是另一种典型退化。当所有匹配点都落在一个空间平面上时,基础矩阵的求解会出现多个解,或者解不稳定。这是因为平面场景下的对应关系可以用单应矩阵完美描述,而基础矩阵和单应矩阵在这个情况下存在耦合。识别方法是看极线是否都汇聚到同一个点,或者检查求出的基础矩阵的奇异值分布。遇到平面场景,正确的做法是用单应矩阵分解来恢复位姿,而不是硬套基础矩阵。我在一个桌面物体重建的项目里就吃过这个亏,整个桌面基本是个平面,用基础矩阵估计位姿总是飘,换成单应矩阵之后立刻稳了。

还有一种退化是相机退化或者运动退化,比如所有相机中心共线,这会导致基础矩阵的求解空间维度增加,解不唯一。这种场景在车辆沿直线行驶的时候可能出现。识别和处理的思路是引入额外的约束,或者等到运动方向发生变化之后再估计。

5.2 数值问题速查表

实际调试的时候,很多错误都能归结为有限的几类数值问题。我把常见问题整理成一张表,方便对照排查。

现象可能原因排查方向处理办法
极线全都汇聚在一个点秩约束没施加检查奇异值分布强制把最小奇异值置零
位姿结果符号相反手性筛选缺失或错误统计正深度点数量用四组候选逐一做正深度投票
重建点云整体在后平移方向取反检查分解时的符号约定用真值验证符号
深度波动特别大三角化射线夹角太小统计深度分布设纵深截断,丢弃远点
求解结果每次都不同匹配点质量差检查匹配的极线距离用随机采样一致性筛选内点
位姿抖动明显数据点不足或退化检查点数和视差分布增加帧间间隔,或换用单应矩阵

这张表是我从多个项目里总结出来的,基本覆盖了八成以上的常见故障。排查的时候建议从现象倒推,先看数据质量,再看约束施加,最后看求解流程,按这个顺序走通常能比较快地定位问题。别一上来就怀疑算法本身,绝大多数时候问题都出在数据预处理和约束施加这些环节。

5.3 工程落地的经验技巧

跑通算法和在工程里稳定运行之间有很大距离,这里分享几个切实体会。第一是匹配点的质量远比数量重要。很多人喜欢多找点,觉得点越多越稳,实际上错误匹配会严重污染结果。我习惯的做法是先用严格的筛选条件过滤一遍,宁可要几十个高质量的点,也不要几百个混着错误的点。随机采样一致性框架能处理一部分外点,但外点比例超过一半之后,它的表现会急剧下降。

第二是归一化的尺度要谨慎选择。前面代码里用的是平均距离归一到根号二,这是通用做法,但在特定场景下可以调整。如果点集中在图像一角,强制把质心平移到原点、平均距离归一,会让某些坐标值被放大很多倍,反而引入数值误差。遇到这种情况,可以考虑用中位数代替均值,鲁棒性更好。这些细节在大规模数据处理里影响非常明显,值得多花时间调。

第三是尽量用本质矩阵而不是基础矩阵做位姿估计。基础矩阵把内参和位姿耦合在一起,一旦内参有误差,位姿就会被污染。本质矩阵剥离了内参,只保留位姿信息,精度和稳定性都更好。只有在完全不知道内参、或者内参标定不可靠的场景下,才退而求其次用基础矩阵。这个原则我在很多项目里反复验证过,但凡条件允许,本质矩阵是更优的选择。

6. 应用场景与影响范围

6.1 在SLAM与运动恢复结构中的角色

在视觉SLAM里,基础矩阵和本质矩阵是初始化阶段的核心。系统刚开始运行的时候,还没有地图,第一件事就是从最初两帧图像里估计相机运动并三角化出第一批三维点,这一步几乎都是靠对极几何完成的。初始化质量直接决定整个系统后续能不能稳定跟踪,如果初始位姿估计偏了,后面的优化会一直在错误的局部最优附近打转。我在调试SLAM系统的时候,经常花大量时间在初始化模块上,因为这是整个系统的地基。

运动恢复结构里它们同样关键。传统的增量式重建流程是先从一对图像估计位姿,然后三角化,再加入新图像做位姿估计,最后做全局优化。每一次加入新图像,都要用到对极约束来建立新图像和已有图像之间的几何关系。基础矩阵和本质矩阵在这里充当了帧间关联的桥梁,没有它们,就没法把零散的图像对应点组织成一致的三维结构。现代的深度学习重建方法虽然端到端,但很多方案的中间监督信号仍然用了对极约束,可见这个经典工具的根基有多深。

值得一提的是,随着特征匹配技术的进步,比如基于学习的匹配器和描述子,匹配点的质量比过去高了很多,对极几何估计的稳定性也水涨船高。但算法的核心逻辑没变,归一化、秩约束、手性检验这些关键步骤依然是必须的。工具在变,原理的骨架还在那里,理解了骨架,换什么工具都能快速上手。

6.2 双目视觉与深度估计

双目系统里,两个相机之间的相对位姿是标定好的固定值,所以本质上不太需要每次都重新估计本质矩阵。但基础矩阵和本质矩阵在双目系统的校正和验证环节依然有用。做极线校正的时候,需要保证校正后两幅图像的极线严格水平,这样才能把深度搜索简化成同一行上的一维搜索。校正的正确性可以通过检查基础矩阵来验证,如果校正后求出的基础矩阵接近理想形式,说明校正没问题。

深度估计环节更是直接依赖三角化,而三角化依赖相机位姿和匹配点。双目系统的基线是已知的,所以从匹配点的视差直接就能算出深度,不需要从本质矩阵反推尺度的过程。但是当双目系统的标定出现偏差,或者环境导致某些区域无法做极线校正时,仍然需要用对极几何来自适应地估计局部几何。我见过不少双目产品在出厂标定之后,运行久了因为温度变化导致基线微小变化,这时候动态估计基础矩阵就成了补偿手段。

在深度估计的精度上,对极几何的估计质量直接决定视差计算的准确度。极线如果偏了,匹配点就会落在错误的位置上,视差算错,深度就错了。所以在做高精度双目测距的时候,基础矩阵和本质矩阵的精度评估是必做环节,通常会用重投影误差来量化,把误差控制在一个像素以内才能满足大多数工业测量需求。

最后分享一个小技巧,判断你对这两个矩阵理解到不到位,有个试金石:随便拿一对图像,手动推导从匹配点列表出发,到最终重建出三维点云的完整链路,每一步的输入输出、单位、约束都写清楚。如果中间有哪一步你写不出来或者含糊,那就是理解还有漏洞的地方。这个方法我用过,比看十遍公式推导都管用,因为逼着你把每个环节都落到具体细节上。对极几何这套东西,看起来公式简单,真正做好要在数值细节和退化处理上花功夫,这些功夫在项目里是绕不过去的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 16:22:10

Transformer聊天机器人毕设全解析:从注意力机制到解码采样

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/1 16:21:51

PLC多机型程序复用:FB+ST实现一套代码适配八种设备

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/1 16:19:48

汽车传感器与执行器教材精讲:从感知到执行的工程实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/1 16:17:53

Python+OpenCV+YOLOv8:苹果叶病害识别检测系统实战解析

简介:这是一套面向毕业设计与智慧农业场景的苹果叶病害识别检测系统源码包,基于Python和OpenCV实现,可检测赤霉病、枯叶病、铁锈病等常见叶片病害,适合计算机视觉、深度学习方向的毕设项目参考与二次开发。压缩包共382个文件&…

作者头像 李华
网站建设 2026/10/1 16:17:00

从零开始做AI工程:从RAG到Agent的系统化实战指南

还记得前两年团队招聘的时候,简历上写"AI工程师"的候选人,十个里有八个聊下来其实是在调API,剩下两个是在跑开源模型的训练脚本。当时我就意识到,这个行业缺的从来不是会用某个模型的人,而是能把AI真正"…

作者头像 李华
网站建设 2026/10/1 16:16:40

LabVIEW 入门避坑:数据流、VI、串口通信与仪器同步采集

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华