我遇到了同样的情况:我有一个非平面 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 偏斜,因此可能需要校正相机矩阵,正如我在上面的代码中所示。