如何确定OpenCV calibrateCamera输出畸变系数的顺序及使用规则
问题解答
1. 畸变系数顺序与适配规则
- 常规
cv::calibrateCamera()(标准针孔相机标定函数)输出的1×5畸变系数默认顺序确实为 k1、k2、p1、p2、k3,其中k为径向畸变系数,p为切向畸变系数。 - 若下游程序仅需要4个畸变系数,取前4项k1、k2、p1、p2是符合规则的,前提是下游程序同样使用标准针孔畸变模型。
- 不是畸变系数越多校正效果越好:额外增加高阶畸变系数(如k4、k5、k6)需要足够多、覆盖全画面的标定样本做支撑,否则很容易出现过拟合,反而导致画面边缘校正偏差变大。普通畸变不大的消费级镜头,用4个系数通常足够满足需求。
2. 程序崩溃的根本原因
你代码中调用的是cv::fisheye::undistortImage(),该函数属于鱼眼相机专属接口,和标准针孔相机的畸变模型完全不兼容:
- 鱼眼模型默认仅考虑径向畸变,没有p1、p2两个切向畸变参数,要求输入的畸变系数维度只能是1×4(k1、k2、k3、k4)或者1×8,1×5的参数维度不符合接口要求,直接触发参数校验异常崩溃。
- 你代码中将第5个径向畸变系数k3命名为
CV_P3是错误的,标准针孔畸变模型中仅存在p1、p2两个切向畸变参数,不存在p3。
3. 修复方案
根据你的镜头类型二选一即可:
- 若为普通针孔镜头:将校正接口替换为标准
cv::undistort(),此时1×4、1×5维度的畸变系数都可以正常使用。 - 若为鱼眼镜头:不要使用普通
cv::calibrateCamera()做标定,替换为cv::fisheye::calibrate()获取鱼眼模型专属的4个畸变系数,再传入cv::fisheye::undistortImage()即可。
内容的提问来源于stack exchange,提问作者user121903
相关产品推荐
相关产品推荐

