1

我正在实现一个标准的 VO 算法,并进行了一些更改,即提取特征、匹配特征点、找到基本矩阵并分解以获得姿势。然而,在初始化之后,我没有对后续帧使用 3D-2D 运动估计 (PNP),而是使用相同的 2D-2D 运动估计(使用基本矩阵)。我发现 2D-2D 估计似乎比 3D-2D 准确得多。为了找到第二个姿势相对于第一个姿势的相对比例,我可以找出共同点(对两个帧对进行三角剖分)。根据视觉里程计教程,Scaramuzza,可以通过找到公共点对之间的相对距离的比率来找到相对比例。

如果f13D并且f23D是来自后续帧对的三角化 3D 点,我会随机选择点对并计算距离,这是相同的粗略代码片段。

indices = np.random.choice(np.arange(0,len(f23D)), size=(5 * len(f23D),2),replace=True)
indices = indices[indices[...,0]!=indices[...,1]]
num = np.linalg.norm(f13D[indices[...,0]] - f13D[indices[...,1]], axis=1).reshape((len(indices),1))
den = np.linalg.norm(f23D[indices[...,0]] - f23D[indices[...,1]], axis=1).reshape((len(indices),1))
return np.median(num/den).

我还尝试用线性 ransac 估计器替换最后一行。然而,由于比例三角测量并不完美,这些值非常嘈杂,因此使用不同的 numpy 种子时,比例估计也有很大差异。

这是在文章中描述的在单目 VO 中实现相对比例的正确方法吗?如果没有,最好的方法是什么(我不希望使用 PNP,因为旋转似乎不太准确)

4

0 回答 0