Algorithm 查找用于拍摄2D照片的相机的3D位置

Algorithm 查找用于拍摄2D照片的相机的3D位置,algorithm,image-processing,computer-vision,Algorithm,Image Processing,Computer Vision,给定一个3D场景和该场景部分的2D图像,是否有可能找到用于生成图像的摄影机的位置?如果随机采样摄影机参数,使用每组参数渲染场景,则可以将最佳匹配作为起点。然后,可以对摄影机参数执行局部优化,以找到最接近于再现2D图像的参数。这并不快,但理论上,只要有足够的时间,你可以做出非常好的猜测。你需要更多的信息,但不需要更多的信息 最简单的方法是在场景中找到一个你知道长度的对象或距离(例如,在图像中画一条虚拟线,说出你想要的距离单位)。然后你还需要知道焦距(与视野角度成反比) 给定视角,已知长度的一段(或

给定一个3D场景和该场景部分的2D图像,是否有可能找到用于生成图像的摄影机的位置?

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

你需要更多的信息,但不需要更多的信息

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

给定视角,已知长度的一段(或两段)直线,你可以用三角法非常接近相机的精确位置。e、 g.对于粗略的距离估计:

   / |
  /  |
 /_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)

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

我将根据你的问题假设你在二维空间中有四个点,你知道它们在三维空间中的位置。(如果你真正的问题是确定这些观点,我根本不知道从哪里开始。)

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

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


现在,如何将M和T转换为相机的位置、位置和焦距?这里有点毛茸茸的,但应该对你有帮助(记住,你做的每件事都是反向的)。

是的,但这要看情况而定。如果相机没有严重扭曲图像,ninjagecko的简单三角法可能会起作用,但这取决于你的应用。如果你想学习如何以更清晰的方式和更数学的方式来做这件事,请查看这个

不幸的是,这个问题被标记为计算机视觉,并且适用于现实世界的图像。如果你能渲染场景,你就已经知道摄像机的位置了。操作说明“给定一个3D场景”。我认为这意味着有一个场景模型可用。如果有可用的模型,您可以从特定视点渲染该模型,并将渲染结果与2D图像进行比较。我再次重申我的异议。如果模型可用,那么正如我已经说过的,您已经知道摄影机的位置,因为您必须首先渲染它。(图像最初是如何创建的?它是如何渲染的。)即使你不知道,你也必须完美地渲染场景,这意味着你需要的不仅仅是一个模型。您需要用于渲染原始图片的精确模型。我并不是说这不是一个合理的答案(如果你进行了重大优化并定义了所需的“相似性”函数),但它需要那些非常重要的警告。我不确定你为什么会认为你知道摄像机的位置。渲染图像的人都会知道,但OP没有说他们渲染了图像,只是说它是给定的。当你说“给定3D场景”时,该3D场景是如何表示的?它是可以渲染的曲面和灯光的3D模型吗?相机不执行仿射变换,因为在传感器平面上的投影不是线性的。找到上面的M和T不是解线性方程组。@matiasg——为什么它不是线性的?它看起来是线性的。从3D空间投影到摄像机平面上意味着在某个时刻将3个坐标中的2个坐标除以第三个坐标。类似于
(x,y,z)->(x/z,y/z)
。这不是线性的。