【问题标题】:extrinsic matrix computation with opencv使用opencv进行外在矩阵计算
【发布时间】:2019-03-21 23:58:32
【问题描述】:

我正在使用 opencv 来校准我的网络摄像头。所以,我所做的是将我的网络摄像头固定到一个装备上,使其保持静止,我使用了棋盘校准模式并将其移动到摄像头前面,并使用检测到的点来计算校准。所以,这是我们可以在许多 opencv 示例中找到的 (https://docs.opencv.org/3.1.0/dc/dbb/tutorial_py_calibration.html)

现在,这给了我相机内在矩阵和旋转和平移组件,用于将这些棋盘视图中的每一个从棋盘空间映射到世界空间。

但是,我感兴趣的是全局外部矩阵,即,一旦我移除棋盘格,我希望能够在图像场景中指定一个点,即 x、y 及其高度,它给了我在世界空间。据我了解,为此我需要内在和外在矩阵。应该如何从这里开始计算外在矩阵?我可以使用从棋盘校准步骤中收集的测量值来计算外在矩阵吗?

【问题讨论】:

    标签: opencv camera-calibration coordinate-transformation


    【解决方案1】:

    让我介绍一些上下文。考虑下图,(来自https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html):

    相机已“附加”了一个刚性参考系 (Xc,Yc,Zc)。您成功执行的内在校准允许您将点 (Xc,Yc,Zc) 转换为其在图像 (u,v) 上的投影,以及图像中的一个点 (u,v)到 (Xc,Yc,Zc) 中的一条射线(你只能将它提高到一个比例因子)。

    在实践中,您希望将相机放置在外部“世界”参考系中,我们称之为 (X,Y,Z)。然后是一个刚性变换,由一个旋转矩阵R和一个平移向量T表示,这样:

    |Xc|    |X|
    |Yc|= R |Y| + T
    |Zc|    |Z|
    

    这就是外在校准(也可以写成4x4矩阵,也就是你所说的外在矩阵)。

    现在,答案。要获取 RT,您可以执行以下操作:

    1. 修复您的世界参考系,例如地面可以是 (x,y) 平面,并为其选择原点。

    2. 在此参考系中设置一些坐标已知的点,例如,地板中方格中的点。

    3. 拍照,获取对应的二维图像坐标。

    4. 使用solvePnP获取旋转和平移,参数如下:

      • objectPoints:世界参考系中的 3D 点。
      • imagePoints:图像中对应的二维点与objectPoints的顺序相同
      • cameraMatris:你已经拥有的内在矩阵。
      • distCoeffs:你已经拥有的失真系数。
      • rvectvec:这些将是输出。
      • useExtrinsicGuess: false
      • 标志:您可以使用 CV_ITERATIVE
    5. 最后,使用 Rodrigues 函数从 rvec 获取 R

    您将需要至少 3 个非共线点和对应的 3D-2D 坐标,solvePnP 才能工作 (link),但越多越好。为了获得高质量的分数,您可以打印一个大棋盘图案,将其平放在地板上,并将其用作网格。重要的是图像中的图案不能太小(越大,校准越稳定)。

    而且,非常重要:对于内在校准,您使用了具有一定大小方格的国际象棋图案,但您告诉算法(它对每个图案进行求解 PnP),每个方块的大小为1。这不是明确的,而是在示例代码的第 10 行完成,其中网格是使用坐标 0,1,2,...构建的:

    objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)

    而外在校准的世界尺度必须与此相匹配,所以你有几种可能:

    1. 使用相同的比例,例如使用相同的网格或以相同比例测量“世界”平面的坐标。在这种情况下,您的“世界”将不会处于正确的比例。

    2. 建议:用正确的比例重新进行内在校准,例如:

      objp[:,:2] = (size_of_a_square*np.mgrid[0:7,0:6]).T.reshape(-1,2)

      其中 size_of_a_square 是正方形的实际大小。

    3. (没做过,但理论上是可以的,做不到就做 2)通过缩放 fx 和 fy 重用内在校准。这是可能的,因为相机看到的所有内容都达到了比例因子,并且声明的正方形大小只会改变 fx 和 fy(以及每个正方形姿势中的 T,但这是另一回事)。如果正方形的实际大小为L,则在调用solvePnP之前替换fx和fy Lfx和Lfy。

    【讨论】:

    • 即使在今天这也很麻烦,因为没有单一的、运行良好的程序或 ROS 包可以方便地实现它。理论背景还可以,但是没有可执行文件,我们还是做不到。
    • @Milo 可以在不移动初始外部参数的情况下校准相机吗?
    • 你好@thewoz。我很抱歉,但我真的不明白这个问题。你能详细说明一下吗?
    • 嗨@Milo,opencv 中的calibrate camera 函数找到了最小化投影误差的相机的内部和外部参数。现在我以非常精确的方式知道外部参数,但我错过了内部参数。在我使用 opencv 中的函数时,找到的内部参数对算法找到的外部参数有好处,但对“真实”参数没有好处。
    • @thewoz:如果我理解,您使用的是 OpenCV 的内在校准和您手动指定的外在校准,但它没有按预期工作?它应该。也许您没有以正确的方式指定外部校准,但如果没有更多信息就很难说。你能提供更多细节吗?也许您需要发布一个新问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    相关资源
    最近更新 更多