百度到关于该错误的解释非常稀少,我是在使用cv2.fisheye.calibrate函数计算的时候报这个错误,小白花了一晚上才搞定这个,写条备注记录一下。
开门见山,这个错误一般在你使用自己的棋盘标定图像时出现,鱼眼标定校正的本质是计算两个线性空间的映射雅克比矩阵,由于我们使用的棋盘标定获取的映射点对已经远超出需要求解的参数个数,构成超定方程,fisheye会对这些点对进行迭代计算。为了避免求解出的映射矩阵是病态矩阵,即微小的误差可以对矩阵的映射造成较大的误差扰动,OpenCV希望映射矩阵能保持稳定,设置了误差容限,例如下面的cv2.fisheye.calibrate函数中criteria项代表着整个迭代算法的终止标准,如果你的标定图像映射效果误差较大,错误映射点对太多,一旦OpenCV认定会产生病态矩阵就会包这个错误,该错误在OpenCV3.4.1版本中会定位到没有通过测试的标定图像。
rms, _, _, _, _ = cv2.fisheye.calibrate(
objpoints, imgpoints, gray.shape[:2][::-1], K, D, RR, TT, flags_fisheye, criteria
)
解决办法
如下所示图1中是正确标定7*7棋盘图像,映射点的保存顺序从红色一直到粉色,且第一个映射点是边界为黑色方格的角点。图2是错误标定图像,可显然发现第一个映射点是边界为白色方格的角点,错误的匹配顺序会造成映射矩阵计算错误,即使计算出来误差也很大。
检查每个棋盘标定图像的映射点识别效果,务必保持所有的标定图像映射点顺序都相同,再以这些顺序相同的标定图像计算映射矩阵就没问题了。
图 1 正确标定
图 2 错误标定
关于鱼眼畸变标定该错误的详细原理解答可参考下面这个大神的付费文章。
https://blog.csdn.net/XiaoY_H/article/details/88934693?spm=1001.2014.3001.5501