如何在OpenCV中从具有已知姿势的多个图像中进行3d的稳健重构

时间:2018-08-23 17:27:30

标签: opencv computer-vision 3d-reconstruction multiview structure-from-motion

高分辨率图像示例的传统解决方案:

  1. 提取所有图像的特征(密集)
  2. 匹配功能以查找图像中的曲目
  3. 将要素三角剖分至3d点。

对于我的情况,我可以给两个问题(许多640 * 480张图像之间相互移动很小),第一张:匹配速度很慢,尤其是图像数量很大时,所以更好的解决方案可以是光流跟踪。.但是它的动作很少,所以稀疏(混合可以解决问题!)

第二:对轨道进行三角剖分,尽管这是个过分确定的问题,但我发现很难编写一种解决方案,..(这里要求简化我在参考文献中阅读的内容)

我在那个方向上搜索了很多库,但没有得到有用的结果。

再次,我有地面真相相机矩阵,只需要3d位置作为第一估算值(没有BA), 编码软件解决方案可能会很有帮助,因为我不需要重新发明轮子,尽管详细的说明可能会有所帮助

1 个答案:

答案 0 :(得分:3)

epipolar search

这基本上显示了用于估计深度的基础几何。

正如您所说,我们有相机姿态Q,我们正在从世界中选取一个点X,X_L是它在左侧图像上的投影,现在,有了Q_L,Q_R和X_L,我们就可以构成这个绿色的对极在平面上,其余工作很容易,我们在直线(Q_L,X)上搜索点,该直线精确描述了X_L的深度,并具有不同的假设:X1,X2,...,我们可以在正确的图像上获得不同的投影

现在,我们将X_L的像素强度差与右侧图像上的重新投影点进行比较,只选择最小的像素,相应的深度正是我们想要的。

很容易吗?事实是这很难,图片永远不会严格凸出: non-convex-img

这使我们的匹配变得异常困难,因为非凸函数将导致任何距离函数具有多个临界点(候选匹配),您如何确定哪个是正确的?

但是,人们提出了基于路径的匹配来解决此问题,例如SADSSDNCC之类的方法,它们被引入以使距离函数尽可能地凸出。 ,他们无法处理大规模重复纹理问题和低纹理问题。

为解决这个问题,人们开始在对极线中进行长距离搜索,突然发现我们可以将匹配度量的整个分布描述为沿深度的一段距离。

epipolar_depth_distribution

水平轴是深度,垂直轴是度量标准分数,此图使我们找到了depth filter,我们通常使用高斯,aka,高斯深度滤镜来描述此分布,并使用此滤镜为了描述深度的不确定性,结合补丁匹配方法,我们可以大致得出一个建议。

现在,让我们使用一些优化工具(例如GN或梯度下降)来最终完善深度估算。

总而言之,深度估计的整个过程类似于以下步骤:

  1. 假定所有像素遵循初始高斯分布的所有深度
  2. 开始通过对极线搜索并将点重新投影到目标框架中
  3. 对深度进行三角测量并从深度过滤器计算深度的不确定性
  4. 再次运行2和3以获得新的深度分布并与先前的深度分布合并,如果它们收敛然后破裂,或者从2重新开始。