OpenCV CalibrateCamera报错:Python相机校准问题求助
我之前做相机校准时也碰到过一模一样的情况——明明ret返回True说明标定板角点检测成功了,但校准步骤还是抛出错误,打印变量看着也没明显问题。给你分享几个我当时排查出来的常见原因:
核对角点数量与设定是否匹配
很多人会混淆棋盘格的“格子数”和“角点数”:比如你用的是9×6的棋盘格(9列6行格子),对应的角点应该是8×5(交点数比格子数少1)。如果代码里设定的角点行列数和实际棋盘格不匹配,哪怕ret是True,后续校准计算时也会因为点集数量不匹配报错。建议打印objpoints和imgpoints中每组数据的长度,确认和你设定的角点总数一致。确保所有校准图像尺寸统一
OpenCV的相机校准要求所有输入图像的分辨率完全相同,如果其中某几张图像的宽高不一样,哪怕角点检测成功,校准阶段也会触发错误。可以在读取图像后统一打印img.shape,确认所有图像的尺寸一致。检查三维点集
objpoints的构造
要保证objpoints的三维坐标是有序且正确生成的,比如棋盘格的三维点应该是类似(0,0,0), (1,0,0), (2,0,0)...这样的规律点,而且每一组objpoints的数量必须和对应的imgpoints完全相等。可以抽几组数据对比两者的长度,或者打印具体的坐标值看看是否符合预期。可视化角点检测结果,排查异常点
有时候ret为True,但检测到的角点可能存在偏移、重复或者误标记(比如图像模糊、光照不均导致的),这时候光看数值很难发现问题。可以用这段代码把角点画出来直观检查:# 假设img是当前校准图像,(8,5)是你的角点行列数,corners是检测到的角点 cv2.drawChessboardCorners(img, (8,5), corners, ret) cv2.imshow('Detected Corners', img) cv2.waitKey(0) cv2.destroyAllWindows()如果看到角点没有准确落在棋盘格的交点上,那就是检测结果有问题,需要优化图像或者调整角点检测的参数(比如
cv2.findChessboardCorners的flags参数)。区分普通相机与鱼眼相机的校准API
如果你校准的是鱼眼镜头,别用普通的cv2.calibrateCamera,要改用cv2.fisheye.calibrate,这两个API的参数要求(比如点集的数据类型、输入格式)有差异,混用很容易报错。
内容的提问来源于stack exchange,提问作者Ravi

