0

我想将 3D 空间中的一个点投影到 2D 图像坐标中。我有我正在使用的相机的校准内在和外在。我有相机矩阵 K 和失真系数 D。但是,我希望投影图像坐标是未失真图像。

根据我的研究,我发现了两种方法来做到这一点。

  1. 使用 opencv 的getOptimalNewCameraMatrix函数计算一个新的未失真图像的相机矩阵 K'。然后在opencv的projectPoints函数中使用这个K',将畸变参数设置为0,得到投影点。

  2. 使用projectPoints使用原始相机矩阵 K 的函数,以及该函数中的失真系数 D 并获得投影点。

两种方法的输出是否应该匹配?

4

1 回答 1

2

我认为你的想法中缺少一些东西。

相机矩阵 K 和 dist。系数 D 是用于不失真的参数(如果您的镜头像鱼眼一样扭曲图像)。它们就是所谓的内在相机参数。

如果我们将术语从计算机视觉更改为计算机图形学,那么这些参数就是您用于定义视锥体的参数,例如,它们用于获取相机的焦距。

但它们不足以做投影的事情。

对于投影,如果您考虑计算机图形学术语(例如 opengl),则需要具有模型-视图-投影矩阵。模型矩阵是指定对象在世界中的位置的矩阵。视图矩阵指定相机的位置,投影矩阵指定平截头体(焦角、透视失真等)。

如果您想知道如何将模型的点从 3d 转换为 2d(反之亦然),您需要投影和视图矩阵(您拥有模型矩阵,因为您拥有要开始的 3d 点)。在计算机视觉中,视图矩阵称为 estrinsic 参数。

因此,您也需要 estrinsic 参数,即相机在世界中的位置。也就是说,例如,那些参数是rvec需要tveccv:: projectPoints

如果你想计算它们,它们正是cv::solvePnP你想要做的相反的输出:从一些已知的 3d 点加上相机屏幕上已知的 2d 投影,这个函数给你 estrinsic 参数(您可以从中获取一些 opengl-opencv-augmented-reality-whatever 应用程序的视图矩阵cv::Rodrigues)。

最后一点:虽然内在参数在您用相机拍摄的所有照片中都是固定的(当然您不改变焦距),但每次移动相机以从不同位置拍摄新照片时,内在参数都会发生变化视点(即:这改变了视角,所以你要找的3D-2D投影)

希望能帮上忙!

于 2013-09-11T12:58:48.613 回答