【问题标题】:Camera Calibration with OpenCV使用 OpenCV 进行相机校准
【发布时间】:2013-02-01 06:49:34
【问题描述】:

我想使用 OpenCV C++ API 执行相机校准,使用一组已知的世界图像点匹配。

OpenCV 有一个名为cv::calibrateCamera 的函数,如文档here 所述。这清楚地提到该函数将推导出 平面物体的内在相机矩阵,它期望用户 为非平面 3D 环境指定矩阵。

在我的点对应中,世界坐标不是平面的。而且我对内部相机矩阵没有一个合格的猜测。

在这种情况下我将如何校准相机?

目前,我正在使用基于 DLT 的简单方法使用 cv::SVD::solveZ 函数进行计算。但我想使用 OpenCV 执行的非线性估计。

【问题讨论】:

  • 如果您有能力在 Windows 上的单独程序中离线运行相机跟踪,请查看ACTS。我遇到了同样的问题,但 ACTS 在相机校准方面做得很好。很抱歉,我无法帮助您实现 OpenCV。

标签: c++ opencv computer-vision


【解决方案1】:

我遇到了同样的情况:我有一个非平面 3D 目标,但是我想使用 OpenCV 的非线性 LM 优化来进行校准过程。 (OpenCV使用的张氏初始化方法只允许平面标定目标)

您可以做的是从您自己的 DLT 结果中提取相机矩阵,并将其用作calibrateCamera 的初始猜测。如果只为一对(相机点 - 对象点)完成就足够了。即使其他对可能会产生其他相机矩阵,但希望它们是相似的,并且无论如何您只需要该矩阵来进行初始化。

请注意,我确实假设使用您自己的 DLT,您会获得一个投影矩阵 P,它将同质世界点 X 映射到 hom。图像点x 通过x = P * X

这将是要走的路,虽然它是在 python 中,你应该能够适应你自己的需要:

P = YOUR_DLT(imagePoints[0], objectPoints[0])

cameraMatrix, _, _, _, _, _, _ = cv2.decomposeProjectionMatrix(P)
cameraMatrix /= cameraMatrix[2,2]            # ensure unit elem[2,2]
cameraMatrix[0,1] = 0                        # ensure no skew
cameraMatrix[0,0] = abs(cameraMatrix[0,0])   # ensure positive focal lengthes
cameraMatrix[1,1] = abs(cameraMatrix[1,1])

# ensure principal point within image:
cameraMatrix[0,2] = min(resX-1, max(0, cameraMatrix[0,2]))
cameraMatrix[1,2] = min(resY-1, max(0, cameraMatrix[1,2])) 

retval, cameraMatrix, distCoeffs, rvecs, tvecs = \
      cv2.calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix) 

请注意,由于 calibrateCamera 假定 cameraMatrix[2,2]==1 并且被限制为正焦距和 0 倾斜,因此可能需要校正相机矩阵,正如我在上面的代码中所示。

【讨论】:

    【解决方案2】:

    This page 解释如何执行相机自动校准。这包括使用 Kruppa 方程的方法,该方法似乎可以使用您想要的非线性技术来求解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      • 2013-01-28
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 2021-10-11
      相关资源
      最近更新 更多