【问题标题】:With the pose between two images, how do you project a point from one scene into another?使用两幅图像之间的姿势,如何将一个场景中的一个点投影到另一个场景中?
【发布时间】:2011-04-20 21:35:32
【问题描述】:

如果您有两个图像的完整相对 3D 值,它们看着同一场景(相对 x、y、z),以及它们之间的外部/内部参数,您如何将一个场景中的点投影到其他场景,在opencv中?

【问题讨论】:

  • “其他场景”是什么意思?另一个相机?
  • 是的。此外,视野。两台全 3D 摄像机注视同一个空间,它们之间进行旋转和平移

标签: c opencv computer-vision


【解决方案1】:

一般情况下你不能这样做。有无限数量的 3D 点(3d 中的一条线)映射到图像空间中的一个点,在另一张图像中,这条线不会映射到单个点,而是一条线(参见 the wikipedia article on epipolar geometry)。您可以使用fundamental matrix 计算该点所在的线。

如果您确实有深度图,请将点重新投影到 3D - 使用 opencv page on camera calibration 顶部的方程式,尤其是这个(这是您唯一需要的):

u 和 v 是您的像素坐标,第一个矩阵是您的相机矩阵(对于您当前正在查看的图像),第二个是包含外部参数的矩阵,您知道 Z(从您的深度图),X 和 Y是您正在寻找的那些 - 您可以求解这些参数,然后使用相同的方程将点投影到您的其他相机中。您可能可以使用 opencv 中的 PerspectiveTransform 函数为您完成这项工作,但是我无法从头顶告诉您如何构建投影矩阵。

【讨论】:

  • 如果你有完整的相对 3D 值,你一般不能这样做吗?我知道您通常无法使用 2D 值来做到这一点,但是当您知道相对深度时,这不会改变吗?
  • 它没有。除非你说你也有来自一台相机的深度图?我建议您沿极线使用受限的 Lucas Kanade 跟踪搜索。
  • 是的,我有每个相机单独的深度图。与 microsoft kinect 系统相同
  • 您是否在同一台机器上同时使用两个 Kinect?另外,它们是否相互正交?
  • @etarion:3D 点云不需要计算。那么“无限数量的 3D 点”是什么意思?
【解决方案2】:

设外部参数为 Rt 使得摄像机 1 为 [I|0] 摄像机 2 为 [ R|t]。因此,您所要做的就是旋转并使用 Rt 平移点云 1,使其与点云 2 在同一坐标系中。

【讨论】:

  • 这确实是事实,但是假设您想要构建有形物体的 3D 模型。我可以轻松地从第一个摄像头获取一个视图,并且要获取有关该对象的更多信息,您可以获取第二个摄像头并从稍微不同的角度查看它,从而从您正在构建模型的 3d 对象中获取更多点。
  • 是的,所以您只需要虚拟相机的投影矩阵。将其与云中的同质 3D 点(具有与之相关的颜色)相乘,您便拥有了自己的视野。
  • 为了澄清,你说的“虚拟”相机是什么意思?顺便说一句,感谢您的来回帮助。
  • 没问题。根据我从您的问题中了解到的情况,您拥有来自 2 个摄像头的 3D 数据。现在您想从第三个“虚拟”相机查看场景(视图合成)。是这样吗,还是您希望摄像头 2 上的 3D 点图像只能被摄像头 1 观察到?
  • 这是一种公平的查看方式。我只想将它们全部投射到一个空间中。我认为将摄像机 2 的点投影到摄像机 1 的空间上是最简单的。
【解决方案3】:

让两个相机有投影矩阵

P1 = K1 [ 我 | 0]

P2 = K2 [ R | t]

让第一个相机上给定点x1(齐次像素坐标)的深度为Z,到第二个相机的映射为

x2 = K2*R*inverse(K1)*x1 + K2*t/Z

没有执行此操作的 OpenCV 函数。如果相机的相对运动是纯旋转的,则映射变为单应性,因此您可以使用 PerspectiveTransform 函数。

( Ki = [fxi 0 cxi; 0 fyi cyi; 0 0 1] )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多