OpenCV校准iPhone11录制视频后图像畸变仍无法消除问题咨询
问题排查方案
- 先修正代码错误
你当前贴出的代码存在两处明显语法/逻辑错误:- objp构造行括号不匹配、转置位置错误,原行
objp[:, :2] = np.mgrid[0:CHECKERBOARD_WIDTH, 0:CHECKERBOARD_HEIGHT.T.reshape(-1, 2)应改为objp[:, :2] = np.mgrid[0:CHECKERBOARD_WIDTH, 0:CHECKERBOARD_HEIGHT].T.reshape(-1, 2) - 角点检测行的棋盘格尺寸错误使用了下标i,原行
ret, corners = cv2.findChessboardCorners(gray, (CHECKERBOARD_WIDTH[i], CHECKERBOARD_HEIGHT[i]), val)若你所有校准帧使用同尺寸棋盘格,应改为ret, corners = cv2.findChessboardCorners(gray, (CHECKERBOARD_WIDTH, CHECKERBOARD_HEIGHT), val)
- objp构造行括号不匹配、转置位置错误,原行
- 排除iPhone系统预处理干扰
iPhone 11自带相机APP默认会执行内置畸变校正、计算摄影优化(智能HDR、深度融合等),你拿到的视频素材本身已经被苹果做过一轮初级畸变校正,此时再用OpenCV做二次校正必然会出现过校正问题。请改用第三方专业相机APP拍摄,拍摄时关闭所有自动优化选项、锁死固定摄像头(不要用自动切换的多摄模式)、禁用系统自带畸变校正功能。 - 调整畸变系数拟合策略
如果你无法关闭系统自带校正,可限制OpenCV校准的畸变系数阶数避免过拟合:调用cv2.calibrateCamera时添加flags参数,比如先添加cv2.CALIB_FIX_K3禁用三阶径向畸变,若仍存在过校正可进一步添加cv2.CALIB_FIX_K2固定二阶径向畸变。 - 优化校准样本覆盖范围
确保你采集的50帧校准样本中,棋盘格覆盖到画面的所有区域,尤其是你需要校正的顶部标线所在的上边缘、左右四角位置,避免仅在画面中部拍摄棋盘格导致边缘区域畸变参数拟合不准。 - 校验校准精度
先打印cv2.calibrateCamera返回的重投影误差ret值,正常合格的校准重投影误差应小于0.1像素,若误差过高说明你的角点检测结果有误,或者棋盘格实际尺寸和你设置的SQUARE_SIZE不匹配,先修正样本质量把误差降到合理范围再验证校正效果。 - 调整校正参数
可以尝试修改cv2.getOptimalNewCameraMatrix的alpha参数,从当前的1调整为0.5或者0,或者直接跳过该步骤,用原始内参矩阵mtx代替newcameramtx执行校正,观察过校正问题是否缓解。
内容的提问来源于stack exchange,提问作者Druss2k
相关产品推荐
相关产品推荐

