0

我正在编写一个 .NET 程序,该程序允许用户通过识别图像上的特定点然后指定与这些点中的每一个相关联的真实世界坐标来注册图像。

http://www.ironbyte.ca/temp/mountain.jpg

图像配准过程还需要用户指定相机的坐标。

注册图像后,我希望能够根据它们的真实坐标在图像上绘制其他点。

我已经阅读了大量有关透视投影的内容,但我正在努力让事情正常进行。我必须承认,我的数学技能不是应有的水平,这是斗争的一部分。我被卡住的地方是试图确定焦距和到显示表面的距离:

在本文中称为查看者的位置 (e [x,y,z]):http ://en.wikipedia.org/wiki/3D_projection#Perspective_projection

我也一直在参考这篇文章:http://www.shotlink.com/Tour/WebTemplate/shotlinknew.nsf/2c47cc31e412bc4985256e6e00287832/c1743b40acf6aa03852575b7007122b0/$FILE/Plotting%203D%20ShotLink%20Data%20on%202s .pdf 从视野中提取焦距,这似乎是事先知道的,但在我的情况下不是。

所以我想我的问题是,有没有一种方法可以根据图像上已知点的位置反向确定焦距和/或视野?还是我看错了,也许有更简单的方法来实现最终目标?

4

2 回答 2

0

编辑:我对模式上的混合单位感到困惑。因此,我修改了我的答案。


如果我们看看投影背后的数学,这对我来说听起来是可行的。

这是水平坐标情况的不那么严格的模式(我将真实世界坐标和像素混合在一起以尝试说明您的情况)

投影示意图

和:

  • D,用户给出的点之一,(x,y,z)其投影位置相对于相机定义的相对坐标系(因此在应用其平移和旋转之后)
  • E相机点 - 上述坐标系的原点。
  • B图像平面中的结果点,uv像素为单位。图片平面的尺寸为wxh像素。
  • f焦距(与, , ...的单位相同) xyz ,以像素为单位,F以实际单位为单位的值,以及α水平半视角 -您要评估的值

您可以看到三角形ECDEBM相似的,因此使用Side-Splitter Theorem,我们得到:

  • EM / EC = MB / CD<=> f / z = u / x(我们正在比较比率,所以如果等式的左边成员使用真实世界单位,而右边使用像素 是真实世界值除以像素一,则没有问题)

因此我们得到:

  • f = u / x * z

现在,如果您愿意,我认为您需要知道相机传感器的尺寸x (实际单位),因为:α Fr_xr_y

  • tan(α) = (r_x / 2) / f F = r_x / (w / 2) * f

但至于α,你可以通过:

  • tan(α) = (w / 2) / f

如果您想与您指出的 Wikipedia 文章平行,我们一直在使用:

投影到屏幕

在哪里:

  • (d_x,d_y,d_z)= (x,y,z), 点在相机系统中的位置
  • (s_x,s_y)= (w,h), 可打印表面的大小
  • (r_x,r_y,r_z)= (r_x,r_y,f), 记录表面的特性
  • (b_x,b_y)= (u,v),在可打印表面上的位置
于 2013-05-29T12:53:54.483 回答
0

我能够使用 Tsai 算法( http://en.wikipedia.org/wiki/Camera_resectioning#Algorithms )的实现来解决这个问题,该算法可以使用至少 4 个已知点来计算投影矩阵。基本上,我允许用户指定一个点的世界坐标,然后单击图像来指定图像坐标。该算法使用这些映射(映射越多,解决方案越准确),以及图像的宽度和高度来计算投影矩阵。然后可以使用此投影矩阵使用世界坐标将其他点投影到图像上。

于 2013-06-18T12:59:07.800 回答