描述子匹配与极线几何
本章的未知量不是三维坐标,而是“哪个图像观测对应同一物理标记”。第一张图第零个分量与第二张图第零个分量没有天然关系,因为扫描顺序会受投影位置与遮挡改变。我们先用归一化颜色描述子提出候选,再用相机几何拒绝不可能的候选。身份判断与位置估计要分层记录,否则三角化给出一个数便容易被误当成匹配已获证明。
设左图有 n 个描述子、右图有 m 个,均为单位三维颜色向量。距离矩阵每项是两向量差的欧氏长度。枚举所有对需要 n 乘 m 次常维运算和相应存储,小标记场景足够;大图像检索可以换近邻索引,但近似搜索可能漏掉真实最近项,必须保留可测精度边界。单位向量距离平方等于二减二倍内积,所以这里按距离与按余弦相似度排序完全一致。
筛选有三道描述子条件。最近距离必须小于固定上限;最近距离还要小于第二近距离乘比值阈值,要求最好候选有足够优势;最后左右互为最近,限制多人同时挤向一个右图点。项目上限零点零八、比值零点八均预先固定。若最近和第二近都为零,比值严格不等式不成立,歧义被拒绝。这比把零除零变成一个任意数更符合信息含义,但也可能拒绝颜色确实重复的真对应。
算例一:互为最近不能代替歧义检验
假设一个左描述子到右图两点的距离为零点零一和零点零二,零点零一小于零点八乘零点零二,优势筛选通过;若右点也把它作为最近且距离低于上限,就接受候选。另一左点的距离为零点零一九和零点零二,比值零点九五,虽然绝对距离很小,却缺少辨别能力,应拒绝。若两候选完全同色,距离都为零,也要拒绝而非以较小数组编号判正确。
这些规则可以减少局部歧义,却不能杜绝错配。两个不同珠子恰好具有相同或很接近的色彩,真实对应又被遮挡时,剩下的错点可能成为唯一优胜。互为最近只是对现有候选的双向一致,不是对现实身份的双向证明。因此还要引入独立的几何必要条件。为了不把图像轴对齐当成默认,我们从一般相机矩阵推导极线,而不是只检查左右两点纵坐标相等。
一张图像点在世界中定义一条经过相机中心的射线。该射线上的任何三维点与第二相机中心共同落在一张平面内,这张平面与第二图像平面相交成一条极线。于是正确对应必须位于这条线。若两相机中心相同只有纯旋转,射线不再提供通常的双目基线深度信息;即使还能建立像素映射,也不能把它当有视差的三角测量。
用齐次线性代数表达上述关系。左相机矩阵 P 一的中心齐次向量 C 一位于它的零空间;第二图像里的极点 e 二是 P 二乘 C 一。给定左像素 x 一,伪逆 P 一加号乘 x 一给射线上的一个代表点;再投影到右图得到 q 二。右极线经过 e 二和 q 二,因此齐次线向量是二者叉乘。叉乘可写成三乘三反对称矩阵乘向量,从而得到基础矩阵 F。
伪逆作为数值工具导入,它给一个最小范数代表;沿左相机中心方向加任意倍数不改变左投影。投影到右图后只改变极点方向分量,与极点叉乘会消掉该差异,所以同一条极线不依赖具体射线代表。F 也允许整体比例,项目按矩阵范数归一。它的秩在一般非零基线条件下为二;基础矩阵是像素坐标对象,已经包含内参,不要和只作用于归一化坐标的本质矩阵混名。
极线方程写作 a u 加 b v 加 c 等于零。为了把代数残差转换成右图像素距离,将点代入后的绝对值除以根号 a 平方加 b 平方。这种单向距离不是完整对称几何重投影误差,但有明确像素单位,适合预筛。若线前两项同时接近零,分母会退化,必须报错或换表达;这类特殊位置不能靠任意加一个大容差宣称通过。
算例二:平行双目是一般极线的特殊情况
两相机同姿态、横向基线,内参相同且没有畸变。对应点的归一化纵坐标相同,所以右极线水平;若线为零、一、负二十,则右点纵坐标二十三的距离为三像素,与横坐标无关。横向改错十像素可能仍在同一极线上。这说明极线约束是必要而非充分条件:它把二维候选空间降为一维,却没有告诉你这条线上的哪个位置才是真物体。
现在让右相机产生旋转,极线一般倾斜或汇聚,纵坐标相等不再成立。项目用实际旋转相机估出的 P 构造 F,正确标记的极线残差接近检测误差量级;人为把对应向另一行偏移,残差明显增大。真正三角化后还要做正深度与像素重投影检查。某些错误对应能同时满足极线与正深度,因此三种检查叠加仍不是身份充分证明,必须保留描述子与轨迹来源。
多视角轨迹将同一物体的多张图像观测连在一起,不能只拼相邻视图的配对而不检查环路。若左到中、中到右、右到左最终回到另一个点,说明至少有一条对应不一致。小项目用前两张训练图自动匹配重建,第三张训练图提供独立光度拟合约束;这不是完整的多视角轨迹图优化。课程据此讲清可扩展接口,不把未实现的全局 SfM 功能写入实测。
鲁棒估计常用 RANSAC:抽最小样本估模型,统计满足阈值的内点,再用内点重估。它适合“部分对应错、其余共享同一几何”的假设,并不能从全是歧义或全是错误数据中保证恢复。当前项目相机已由专用靶标标定,因此匹配阶段直接用固定几何筛选,不运行 RANSAC 求相机。若以后加入未知相机估计,需要记录抽样种子、阈值、迭代预算和失败概率,而不是只保存一个最好模型。
错误应通过可复现实验暴露。项目在正常重建之后另外构造十二组错位对应,保存它们被正深度或重投影门槛拒绝的原因;这些候选从不进入正常点云。实测这组全部被拒绝,只能说明这一组负对照被检测到,不能声称所有错配都会失败。另一测试专门输入重复颜色,要求描述子层拒绝歧义。两组测试攻击不同假设,不能以其中一个替代另一个。
遮挡与重复纹理也会产生正确但无法确定的观测。没有匹配时,程序应减少输出或拒绝,而不是复制最近点凑够十二个。对应记录至少保存原文件、局部区域编号、颜色距离、极线距离和后续重投影残差;便于审稿人沿结果回到图像。观测 ID 应与生成器的三维真值编号分离,否则即使没有直接读取坐标,也可能从预先提供的身份表绕开真实匹配任务。
import numpy as np
from vision3d.core import look_at,project,fundamental,epipolar_distance
P,_=look_at([-.8,.1,0]);Q,_=look_at([.9,-.2,.1])
X=np.array([[.2,.3,4.2]])
a,_=project(X,P);b,_=project(X,Q)
F=fundamental(P,Q)
assert epipolar_distance(a[0],b[0],F)<1e-10
print(epipolar_distance(a[0],b[0]+[0,12],F))TRY IT YOURSELF
练习一:单位向量距离
证明两个单位向量的欧氏距离平方等于二减二倍内积。若内积从零点九五增为零点九九,距离怎样变化?
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习二:点线距离
右极线为三u加四v减一百等于零,候选像素十、二十。求代数残差和几何距离;整条线乘七之后结果怎样?
提示 1
提示 2
对照参考解答
TRY IT YOURSELF
练习三:极线内的错误
平行双目中,某个错误右点与真点在同一横行,为什么可能通过极线筛选?要补哪些信息,仍有什么不能保证?