【问题标题】:2D coords to 3D coords resolution and camera matrix2D坐标到3D坐标分辨率和相机矩阵
【发布时间】:2014-11-20 20:09:50
【问题描述】:

所以我有一个全高清网络摄像头 (LG AN VC500),俯视棋盘,每个方边为 25 毫米。 我正在尝试估计相机相对于棋盘的 3 维坐标。

我使用 openCV 和 C++ 以及以下基本程序:

  • 校准相机 -> 获取相机矩阵和畸变系数
  • findChessboardCorners -> 获取 imagePoints
  • SolvePnP -> 获取 rvec 和 tvec
  • rodrigues -> rvec 到 RMatrix
  • 转置 RMatrix
  • (-RMatrix * tvec) -> 获取 TVector
  • 姿势 = [RMatrix TVector(0) ... TVector(1) ... TVector(2) 0, 0, 0, 1 ]

  • 在 openGL 中绘图^

^ 我知道 GL 和 CV 的轴差异,主要关注的是姿态估计,而不是表示。

据我所知,这种方法应该可行。但是我的翻译并没有给我任何接近正确值的地方。不仅在正确的距离单位中,而且 x、y 和 z 值相对于彼此甚至没有意义。根据我的结果,棋盘的原点位于任意块中,而不是外角。

我怀疑这个问题可能是因为我的相机在其流式分辨率 1280 x 720 下进行了校准,因此根据该分辨率给了我一个相机矩阵,而 openCV 只处理 640 x 480 的图像。

我的问题是:

  1. 我遵循的程序是否正确?如果没有,我做错了什么?如何获得以毫米为单位的翻译?
  2. 分辨率差异有影响吗?我应该修改特定代码还是相机矩阵。

我花了很多时间试图弄清楚这一点,其中大部分时间都花在了堆栈溢出上。我的最后期限现在变成了现实。任何帮助表示赞赏,如果需要,我会提供更多信息。 谢谢。

【问题讨论】:

    标签: c++ opencv camera


    【解决方案1】:

    SolvePnP 使用包含图像中心的相机矩阵(来自相机校准),如果您以任何其他分辨率使用它,则必须调整相机矩阵。

    细节取决于您是从图像中取出 640x480 窗口(在这种情况下只需调整原点)还是重新缩放图像(在这种情况下您还需要更改焦距)

    【讨论】:

      【解决方案2】:

      我上面提到的程序是正确的。结果也是正确的,但我误解了它们。结果是相机中心垂直于棋盘的平移坐标,相对于棋盘原点。结果也以相机校准的单位为单位。如果以毫米为单位进行校准,则 solvepnp 给出的平移向量也将以毫米为单位。

      我以为是棋盘原点的中心主点线。

      至于分辨率差异,如果您的相机(在 openCV 代码中)设置为与相机兼容的特定分辨率(检查此兼容性),那么 openCV 将处理该尺寸的图像。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-14
        • 1970-01-01
        • 2014-05-30
        • 2018-05-25
        • 1970-01-01
        • 2013-06-17
        相关资源
        最近更新 更多