【问题标题】:Finding 3D position of a camera used to take a 2D picture查找用于拍摄 2D 照片的相机的 3D 位置
【发布时间】:2011-12-17 00:52:42
【问题描述】:

给定一个 3D 场景和该场景一部分的 2D 图像,是否可以找到用于制作图像的相机的位置?

【问题讨论】:

  • 当您说“给定一个 3D 场景”时,该 3D 场景是如何表示的?它是可以渲染的表面和灯光的 3D 模型吗?

标签: algorithm image-processing computer-vision


【解决方案1】:

如果您对相机参数进行随机采样,使用每组参数渲染场景,您可以将最佳匹配作为起点。然后,您可以对相机参数进行局部优化,以找到最接近再现 2D 图像的那些参数。虽然速度不快,但理论上只要有足够的时间,您就可以做出非常好的猜测。

【讨论】:

  • 不幸的是,这个问题被标记为computer-vision,并且适用于真实世界的图像。如果你可以渲染场景,你就已经知道相机的位置了。
  • OP 声明“给定一个 3D 场景”。我认为这意味着有可用的场景模型。如果有可用的模型,您可以从特定视点渲染该模型并将渲染结果与 2D 图像进行比较。
  • 我再次重申我的不同意见。如果模型可用,那么正如我已经说过的,您已经知道相机位置,因为您必须首先渲染它。 (图像最初是如何创建的?它是被渲染的。)即使您不知道,您也必须完美地渲染场景,这意味着您需要更多而不仅仅是一个模型。您需要用于渲染原始图片的确切模型。我并不是说这不是一个合理的答案(如果您执行主要优化并定义所需的“相似性”函数),但它需要那些非常重要的警告。
  • 我不知道你为什么会假设你知道相机的位置。渲染图像的人会知道它,但 OP 并没有说他们渲染了它,只是说它是给定的。
【解决方案2】:

您需要更多信息,但不需要更多信息。

最简单的做法是在场景中找到您知道长度的对象或距离(例如,在图像中画一条虚拟线,以您想要的任何单位说出距离是多少)。然后你还需要知道焦距(与视场角成反比)。

鉴于视角,一条(或两条)已知长度的线段,您可以通过一点三角函数非常接近地近似相机的确切位置。例如粗略的距离估计:

   / |
  /  |
 /_d_I-segment
 \   |
  \  |
   \ |

distance "d", field of view angle "FoV"

picture.physicalsize/d == tan(FoV/2)
picture.physicalsize/segment.physicalsize == picture.pixelsize/segment.pixelsize

thus
d = segment.physicalsize*(picture.pixelsize/segment.pixelsize)/tan(FoV/2)

如果您想要更高的精度,您可能需要不止一条线段和更仔细的数学运算。

【讨论】:

    【解决方案3】:

    我将根据您的问题假设您在 2-D 空间中有四个点,您知道它们在 3-D 空间中的位置。 (如果你真正的问题是识别这些点,我不知道从哪里开始。)

    因此,您的问题是,相机在哪里可以产生这种从模型到图像的映射?

    相机正在执行M x + T = y 形式的仿射变换,其中x 是表示模型中点的3 空间向量,y 是表示图像中点的2 空间向量.给定 xy 的四个值,求解 M 和 T 是一个简单的矩阵算术问题(可能最好让 MATLAB 来帮助您。)

    现在,如何将 M 和 T 转换为相机的位置、位置和焦距?那里有点毛茸茸,但this page 应该可以帮助您(请记住,您正在做所有事情向后)。

    【讨论】:

    • 相机不执行仿射变换,因为在传感器平面上的投影不是线性的。求上面的 M 和 T 不是求解线性方程组。
    • @matiasg -- 为什么它不是线性的?它看起来是线性的。
    • 从 3D 空间投影到相机平面上意味着在某个时刻将 3 个坐标中的 2 个除以第三个坐标。像(x, y, z) -> (x/z, y/z) 这样的东西。这不是线性的。
    【解决方案4】:

    是的,但这取决于。如果相机没有严重扭曲图像,ninjagecko 的简单三角法可能会起作用,但同样取决于您的应用程序。如果您想以更简洁和更数学的方式学习如何做到这一点,请查看http://www.ces.clemson.edu/~stb/projective/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      相关资源
      最近更新 更多