透视投影向后

时间:2017-07-21 15:22:30

标签: computer-vision perspective

[1 0 0 0; 0 1 0 0; 0 0 1 / f 0] [x y z 1]'= [x y z / f]' - > (f x / z f * y / z)=(u,v)

这会将3D点(x,y,z)转换为像素(u,v)。如何从像素点到3D点?对不起,我不是很聪明。

2 个答案:

答案 0 :(得分:0)

不幸的是,当你投射一个点时,你会丢失深度信息。因此,您只能按比例恢复原始的3d点。让我们像这样重写您的转换:

calib_mat=[f 0 0 ;
           0 f 0 ;
           0 0 1]

我删除了最后一栏,因为它没有任何影响。然后我们有

calib_mat*[x y z]'==[fx fy z]=1/z * [fx/z fy/z 1]= 1/z * [u v 1].

现在,假设您知道[u v 1]并且想要恢复3d点。但是现在,深度信息丢失了,所以你知道的是

calib_mat * [x y z]' =(1 / unknown_depth)* [u v 1]

因此,

[x y z]'=(1/unknown_depth)*inverse(calib_mat)*[u v 1]

所以你已经获得了你想要的东西,但是达到了规模。要恢复点的深度,您需要多个(至少两个)有关点的视图(例如,用于三角测量)。或者,如果您不在计算机视觉上下文中但在渲染上下文中,则可以在投射点时将深度保存在某种z缓冲区中。

答案 1 :(得分:0)

当您将三维空间投影到二维图像上时,您将丢失有关深度的信息,并且很难仅从一帧获得有关深度的丢失深度信息。但是,如果从另一个角度拍摄同一场景的另一个图像,则可以重新获得深度信息。通过使用双眼中的“图像”,您的大脑可以做类似于理解深度的事情,让您了解周围世界的深度。

最好用这种方式解释立体声重建的基本原则:将任何物体靠近眼睛,然后闭上一只眼睛。然后打开那只眼睛并关闭另一只眼睛。然后再做同样的事情,但移动物体远离你的眼睛。您会注意到,当物体靠近眼睛时,当您切换哪只眼睛时,物体会移动得更多,而不是更远时。在两个图像的上下文中,一个图像上的单个特征在同一场景的两个图像之间移动的量(以像素为单位)被称为“视差”。要计算场景的相对深度,只需(1.0 /差异)。为了获得场景的绝对深度(例如,以米或某个测量单位),需要焦距和基线(两个摄像机位置之间的距离)(稍后将讨论这样做的等式)。

现在您已经知道如何计算每个像素的深度,剩下的就是匹配特征,以便您可以计算差异。如果您在第二张图像中迭代地找到第一张图像中的每个像素,那么它将很快变得笨拙。然而,“搜索问题”通过以下事实简化:在任何两个图像之间存在“极线”,其显着减少了图像1中的特征出现在图像2中的可能位置。可视化的最简单方法是考虑放置两个摄像头,使第一个和第二个摄像头之间的唯一区别是第二个摄像头从第一个摄像头水平移动(因此摄像头处于同一高度,两者都是距离场景相同的深度)。直观地说,在某个像素(x1,y1)处的image1中有一个球。鉴于相机已经在相同的高度拍摄相同球的图片,直观的是,虽然球的图像1中的特征的像素位置可能不在图像2中的相同位置,但至少image2中的相同特征将具有与在image1中相同的y,因为它们都在相同的高度处拍摄。在这种情况下,极线将是完全水平的。通过对该极线的了解,不再需要在所有image2中搜索找到的特征图像1的位置 - 而是仅需要在image2中搜索通过image1中的特征的位置的极线。虽然摄像机不需要彼此相邻放置,除了水平平移之外它们的位置之间没有差别,但它使计算更加简单和直观,否则极线会倾斜。因此,为了将image1中的feature1与image2中的feature2匹配,必须使用特征比较技术(经常使用归一化互相关)来确定image2中feature2的最可能位置。给定两个图像中特征的匹配位置,可以通过取两个像素之间的幅度来计算视差。

在匹配特征之后,通过这些lecture notes的第7页上显示的一些等式计算像素的视差,其中b是摄像机之间的基线,l是测量单位中的焦距你想使用(例如英寸,米等)。如果您只是寻找图像中像素的相对三维位置,而不关心像素的位置(即图像左侧的点仍将在重建中的左侧,并且在图像中更远的后面的点将在重建中更远),可以为焦距和基线选择任意非零值。这些笔记还解释了一些更直观的,如果你仍然好奇,为什么它会起作用。

随意提出任何问题,没有理由对自己不屑一顾 - 无论你是在寻找知识,这都是值得称道的。