鉴于3D场景和部分场景的2D图像,是否可以找到用于制作图像的相机位置?
答案 0 :(得分:6)
我将从你的问题中假设你在二维空间中有四个点,你知道它们在三维空间中的位置。 (如果您真正的问题是识别那些点,我不知道从哪里开始。)
因此,你的问题是,相机在哪里可以从模型到图像产生这种映射?
相机正在执行M x + T = y
形式的仿射变换,其中x
是3空间中的矢量,表示模型中的点,y
是2空间矢量表示图像中的点。给定x
和y
的四个值,这是一个直接的矩阵算术问题来解决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/。