【发布时间】:2011-12-17 00:52:42
【问题描述】:
给定一个 3D 场景和该场景一部分的 2D 图像,是否可以找到用于制作图像的相机的位置?
【问题讨论】:
-
当您说“给定一个 3D 场景”时,该 3D 场景是如何表示的?它是可以渲染的表面和灯光的 3D 模型吗?
标签: algorithm image-processing computer-vision
给定一个 3D 场景和该场景一部分的 2D 图像,是否可以找到用于制作图像的相机的位置?
【问题讨论】:
标签: algorithm image-processing computer-vision
如果您对相机参数进行随机采样,使用每组参数渲染场景,您可以将最佳匹配作为起点。然后,您可以对相机参数进行局部优化,以找到最接近再现 2D 图像的那些参数。虽然速度不快,但理论上只要有足够的时间,您就可以做出非常好的猜测。
【讨论】:
computer-vision,并且适用于真实世界的图像。如果你可以渲染场景,你就已经知道相机的位置了。
您需要更多信息,但不需要更多信息。
最简单的做法是在场景中找到您知道长度的对象或距离(例如,在图像中画一条虚拟线,以您想要的任何单位说出距离是多少)。然后你还需要知道焦距(与视场角成反比)。
鉴于视角,一条(或两条)已知长度的线段,您可以通过一点三角函数非常接近地近似相机的确切位置。例如粗略的距离估计:
/ |
/ |
/_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)
如果您想要更高的精度,您可能需要不止一条线段和更仔细的数学运算。
【讨论】:
我将根据您的问题假设您在 2-D 空间中有四个点,您知道它们在 3-D 空间中的位置。 (如果你真正的问题是识别这些点,我不知道从哪里开始。)
因此,您的问题是,相机在哪里可以产生这种从模型到图像的映射?
相机正在执行M x + T = y 形式的仿射变换,其中x 是表示模型中点的3 空间向量,y 是表示图像中点的2 空间向量.给定 x 和 y 的四个值,求解 M 和 T 是一个简单的矩阵算术问题(可能最好让 MATLAB 来帮助您。)
现在,如何将 M 和 T 转换为相机的位置、位置和焦距?那里有点毛茸茸,但this page 应该可以帮助您(请记住,您正在做所有事情向后)。
【讨论】:
(x, y, z) -> (x/z, y/z) 这样的东西。这不是线性的。
是的,但这取决于。如果相机没有严重扭曲图像,ninjagecko 的简单三角法可能会起作用,但同样取决于您的应用程序。如果您想以更简洁和更数学的方式学习如何做到这一点,请查看http://www.ces.clemson.edu/~stb/projective/。
【讨论】: