基础矩阵与本质矩阵:对极几何、归一化八点法与位姿估计实战
做视觉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(axis0) # 平移到原点 shifted pts - centroid # 计算平均距离 mean_dist np.sqrt((shifted ** 2).sum(axis1)).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 双目视觉与深度估计双目系统里两个相机之间的相对位姿是标定好的固定值所以本质上不太需要每次都重新估计本质矩阵。但基础矩阵和本质矩阵在双目系统的校正和验证环节依然有用。做极线校正的时候需要保证校正后两幅图像的极线严格水平这样才能把深度搜索简化成同一行上的一维搜索。校正的正确性可以通过检查基础矩阵来验证如果校正后求出的基础矩阵接近理想形式说明校正没问题。深度估计环节更是直接依赖三角化而三角化依赖相机位姿和匹配点。双目系统的基线是已知的所以从匹配点的视差直接就能算出深度不需要从本质矩阵反推尺度的过程。但是当双目系统的标定出现偏差或者环境导致某些区域无法做极线校正时仍然需要用对极几何来自适应地估计局部几何。我见过不少双目产品在出厂标定之后运行久了因为温度变化导致基线微小变化这时候动态估计基础矩阵就成了补偿手段。在深度估计的精度上对极几何的估计质量直接决定视差计算的准确度。极线如果偏了匹配点就会落在错误的位置上视差算错深度就错了。所以在做高精度双目测距的时候基础矩阵和本质矩阵的精度评估是必做环节通常会用重投影误差来量化把误差控制在一个像素以内才能满足大多数工业测量需求。最后分享一个小技巧判断你对这两个矩阵理解到不到位有个试金石随便拿一对图像手动推导从匹配点列表出发到最终重建出三维点云的完整链路每一步的输入输出、单位、约束都写清楚。如果中间有哪一步你写不出来或者含糊那就是理解还有漏洞的地方。这个方法我用过比看十遍公式推导都管用因为逼着你把每个环节都落到具体细节上。对极几何这套东西看起来公式简单真正做好要在数值细节和退化处理上花功夫这些功夫在项目里是绕不过去的。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →