【问题标题】:Consistency of projecting points onto an undistorted image将点投影到未失真图像上的一致性
【发布时间】:2013-06-19 04:51:13
【问题描述】:

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

根据我的研究,我发现了两种方法。

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

  2. 使用projectPoints函数,使用原始相机矩阵K,连同该函数中的畸变系数D,得到投影点。

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

【问题讨论】:

  • 有什么新东西吗?有帮助吗?

标签: opencv projection camera-calibration intrinsics distortion


【解决方案1】:

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

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

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

但它们不足以进行投影。

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

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

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

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

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

希望能帮上忙!

【讨论】:

    猜你喜欢
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2015-05-05
    相关资源
    最近更新 更多