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

时间:2011-10-28 04:47:26

标签: algorithm image-processing computer-vision

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

4 个答案:

答案 0 :(得分:6)

我将从你的问题中假设你在二维空间中有四个点,你知道它们在三维空间中的位置。 (如果您真正的问题是识别那些点,我不知道从哪里开始。)

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

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

现在,您如何将M和T转换为相机的位置,位置和焦距?在那里它有点毛茸茸但this page应该帮助你(只记得,你正在做一切向后)。

答案 1 :(得分:5)

如果您对相机参数进行随机抽样,使用每组参数渲染场景,您可以将最佳匹配作为起点。然后,您可以执行相机参数的局部优化,以找到最接近再现2D图像的参数。它并不快,但从理论上讲,如果有足够的时间,你可以得到非常好的猜测。

答案 2 :(得分:3)

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

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

考虑到视角,具有已知长度的线段(或可能是两个),您可以通过一些三角法非常接近地近似摄像机的确切位置。例如对于粗略的距离估计:

   / |
  /  |
 /_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 :(得分:1)

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