我正在按照这些说明尝试校准鱼眼镜头 https://medium.com/@kennethjiang/calibrate-fisheye-lens-using-opencv-333b05afa0b0 您可以在其中找到我用于校准部分的完整代码。
我到达了这一点:
N_OK = len(objpoints)
K = np.zeros((3, 3))
D = np.zeros((4, 1))
rvecs = [np.zeros((1, 1, 3), dtype=np.float64) for i in range(N_OK)]
tvecs = [np.zeros((1, 1, 3), dtype=np.float64) for i in range(N_OK)]
rms, _, _, _, _ = \
cv2.fisheye.calibrate(
objpoints,
imgpoints,
gray.shape[::-1],
K,
D,
rvecs,
tvecs,
calibration_flags,
(cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 30, 1e-3)
)
print("Found " + str(N_OK) + " valid images for calibration")
print("DIM=" + str(_img_shape[::-1]))
print("K=np.array(" + str(K.tolist()) + ")")
print("D=np.array(" + str(D.tolist()) + ")")
我收到这个错误:
Traceback (most recent call last)
<ipython-input-10-deaca9981fe4> in <module>()
13 tvecs,
14 calibration_flags,
---> 15 (cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER, 30, 1e-3)
16 )
17 print("Found " + str(N_OK) + " valid images for calibration")
error: C:\ci\opencv_1512688052760\work\modules\calib3d\src\fisheye.cpp:1414:
error: (-3) CALIB_CHECK_COND - Ill-conditioned matrix for input array 0 in
function cv::internal::CalibrateExtrinsics
我不明白这是怎么回事,我在互联网上只能找到很少的信息,有没有人遇到过类似的事情并且知道如何解决这个问题?
谢谢
这些是我正在使用的棋盘的图像:
最佳答案
我认为这是因为您的变量 calibration_flags 设置了 CALIB_CHECK_COND。 尝试禁用此标志。没有它,我就能够不扭曲你的图像(见下面的链接)。
我不确定这个检查的目的是什么(documentation 不是很明确)。即使棋盘可见并被检测到,此标志也会拒绝我的 gopro hero 3 的某些图像¹。在我的例子中,20 张图片中有一张没有通过这个测试。此图像的棋盘靠近左边框。
- /image/m2WF6.jpg
- /image/KiTRz.jpg
- /image/MhHyN.jpg
- /image/pSiyG.jpg
- /image/drXSL.jpg
- /image/DDze1.jpg
- /image/b6l8f.jpg
- /image/9MrAk.jpg
- /image/WYmg5.jpg
- /image/rmJ5Q.jpg
- /image/K8k8Y.jpg
- /image/MiBER.jpg
¹ 在 OpenCV 版本中 >= 3.4.1 error message告诉你哪个图像没有通过测试
关于python - OpenCV - 校准鱼眼镜头误差(病态矩阵),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49038464/