Python OpenCV remap/undistort去畸变后图像过度裁剪失真问题咨询
问题原因及解决方法
1 代码存在明显bug
你在完成亚像素角点优化后,存入imgpoints的仍然是未优化的原始角点corners,而非精度更高的corners2,会直接导致标定的内参、畸变系数误差极大:
# 原错误代码 imgpoints.append(corners) # 修改为 imgpoints.append(corners2)
2 棋盘格参数匹配错误
你定义的CHECKERBOARD = (8,6)对应的是棋盘格内角点的数量(即黑白格交界的内部交点,不算棋盘外边缘),且顺序需要和实际拍摄的棋盘格横纵方向完全对应:
- 如果你数的是棋盘格的格子数,需要减1才是内角点数量,比如9列7格的棋盘,对应内角点是(8,6)
- 如果横纵参数写反,会导致三维世界坐标和二维图像坐标匹配完全错位,标定结果直接失效
3 标定样图不符合要求
你的标定样图如果存在以下问题,也会导致标定结果异常:
- 所有样图的棋盘格都集中在画面同一区域(比如都在中心),没有覆盖画面边缘,无法拟合出准确的边缘畸变参数
- 拍摄时棋盘格的角度、距离变化极小,标定算法无法获得足够的位差解算正确参数
- 部分样图的角点检测错误,你没有做可视化校验就直接加入了标定样本,拉低了整体标定精度
4 临时调试方法
你可以先按以下步骤快速定位问题:
- 先注释掉最后的裁剪代码,直接输出未裁剪的去畸变图:如果未裁剪的图已经完全变形,说明标定结果本身错误,回到前三点排查;如果未裁剪的图畸变修正正常,仅裁剪后只剩小部分,说明
getOptimalNewCameraMatrix的参数设置问题,把函数的第四个参数1改为0,即可保留全部原图像像素,避免过度裁剪 - 打印标定的重投影误差:正常合格的标定重投影误差应小于0.5像素,若误差大于1像素,直接判定标定结果无效,重新检查角点检测和样本质量
内容的提问来源于stack exchange,提问作者Morticia A. Addams
相关产品推荐
相关产品推荐

