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

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

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

  • 为所有图像提取特征(密集)
  • 匹配特征以通过图像查找轨迹
  • 将特征三角化到 3d 点。

  • 对于我的情况,我可以在这里给出两个问题(许多 640*480 的图像,彼此之间的移动很小),第一个 :匹配非常慢,特别是如果图像数量很大,所以更好的解决方案可以是光流跟踪..,但是随着大 Action 它变得稀疏,(混合可以解决问题!!)

    第二 :对轨道进行三角测量,虽然这是一个过度确定的问题,但我发现很难编写解决方案,..(这里要求简化我在引用资料中读到的内容)

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

    同样,我有地面实况相机矩阵,并且只需要 3d 位置作为第一次估计(没有 BA),
    编码的软件解决方案可以提供很大帮助,因为我不需要重新发明轮子,尽管详细的说明可能会有所帮助

    最佳答案

    epipolar search

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

    正如你所说,我们有相机位姿 Q,我们正在从世界中选择一个点 X,X_L 是它在左侧图像上的投影,现在,使用 Q_L、Q_R 和 X_L,我们能够组成这个绿色的极线平面,即剩下的工作很简单,我们在 (Q_L, X) 线上搜索点,这条线正好描述了 X_L 的深度,假设不同:X1, X2,...,我们可以在正确的图像上得到不同的投影

    现在我们比较 X_L 的像素强度差异和右图像上的重投影点,只需选择最小的那个,对应的深度正是我们想要的。

    很容易嘿?事实是它更难,图像永远不是严格凸的:
    non-convex-img

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

    然而,人们提出了基于路径的匹配来处理这个问题,方法如下:SAD , SSD , NCC ,它们被引入以创建尽可能凸的距离函数,但它们仍然无法处理大规模重复纹理问题和低纹理问题。

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

    epipolar_depth_distribution

    横轴是深度,纵轴是匹配度量分数,这个插图引导我们找到了depth filter ,而我们通常用高斯,又名,高斯深度滤波器来描述这个分布,并用这个滤波器来描述深度的不确定性,结合patch匹配的方法,我们可以大致得到一个proposal。

    现在,让我们使用一些优化工具,如 GN 或梯度下降来最终细化深度估计。

    综上所述,深度估计的整个过程大致如下:

  • 假设所有像素中的所有深度都遵循初始高斯分布
  • 通过极线开始搜索并将点重新投影到目标框架
  • 对深度进行三角测量并计算深度滤波器的深度不确定性
  • 再次运行 2 和 3 以获得新的深度分布并与前一个合并,如果它们收敛则中断,否则从 2 重新开始。
  • 关于opencv - 如何在 OpenCV 中从具有已知姿势的多个图像中稳健地进行 3d 重建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51991271/

    相关文章:

    computer-vision - 如何使用PCL库从点云数据中获取协方差矩阵?

    OpenCV:为整个图像计算单个 HOG 向量并获取 block 位置

    matlab - 给定来自两个 View 的同一对象的两个图像。如何确定哪个是左 View ,哪个是右 View

    opencv - 使用 openCV SVN 存储库

    python - 在 python cv2 中扩展轮廓

    python - 任何人都可以详细解释 cv 和 cv2 有何不同以及是什么让 cv2 比 cv 更好更快?

    opencv - 从黑色背景中提取图像

    java - reprojectImageTo3D - 我从哪里得到 Q

    opencv - 从OpenCV的Essential矩阵正确解释 'recoverPose'之后的姿势(旋转和翻译)

    python - 如何在 Windows 10 上使用 OpenCV Python 写入 AVI