使用OpenCV进行相机标定

3
我希望使用OpenCV C++ API对一组已知的世界坐标和图像匹配点执行相机校准。
OpenCV有一个名为cv::calibrateCamera的函数,文档在这里。该函数明确提到它将推导出平面物体的内部相机矩阵,并且期望用户为非平面3D环境指定矩阵。
在我的点对应中,世界坐标不是平面的。而且我没有关于内部相机矩阵的合格猜测。
在这种情况下,我该如何进行相机校准?
目前,我正在使用基于DLT的简单方法通过cv::SVD::solveZ函数进行计算。但我想使用OpenCV执行的非线性估计。

如果你有条件在Windows上运行相机跟踪的离线程序,可以看看ACTS。我曾经遇到过和你一样的问题,但是ACTS在相机校准方面做得很好。很抱歉我无法帮助你实现OpenCV。 - TaZ
2个回答

2

这个页面解释了如何进行相机自动校准。其中包括使用Kruppa方程的方法,看起来可以使用您所需的非线性技术来求解。


0
我曾经处于同样的情况:我有一个非平面的3D目标,但是我想使用OpenCV的非线性LM优化进行校准过程。(OpenCV使用的张氏初始化方法仅适用于平面校准目标)
你可以从自己的DLT结果中提取相机矩阵,并将其用作calibrateCamera的初始猜测。只需要对一对进行操作(相机点-物体点)。即使其他对可能会产生其他相机矩阵,它们也希望是相似的,而且你只需要该矩阵进行初始化。
请注意,我假设您使用自己的DLT获得了一个投影矩阵P,该矩阵通过x = P * X将齐次世界点X映射到齐次图像点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倾斜的限制,因此相机矩阵可能需要进行校正,就像我在上面的代码中所示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接