1. 基于棋盘格的相机畸变校正

基于棋盘格的相机畸变校正 学习卡片

任务说明

本案例使用棋盘格标定板,通过拍摄多张不同位姿的棋盘格图像,计算相机内参矩阵与畸变系数,并利用这些参数对图像进行畸变校正。最终输出校正后的图像,并验证校正前后直线是否恢复平直。

实现方案

采用OpenCV的findChessboardCorners提取棋盘格角点,结合calibrateCamera求解相机参数。校正时使用initUndistortRectifyMap与remap完成像素重映射。代码包含完整的角点提取、参数标定、图像校正与结果保存流程。

代码实现


import cv2
import numpy as np
import glob

# 棋盘格尺寸(内角点数)
CHECKERBOARD = (9, 6)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

# 世界坐标系中的棋盘格点坐标(Z=0平面)
objp = np.zeros((CHECKERBOARD[0] * CHECKERBOARD[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:CHECKERBOARD[0], 0:CHECKERBOARD[1]].T.reshape(-1, 2)

objpoints = []  # 世界坐标
imgpoints = []  # 图像坐标

# 读取标定图像(需提前准备10~15张不同位姿的棋盘格照片)
images = glob.glob('calib_images/*.jpg')

for fname in images:
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, corners = cv2.findChessboardCorners(gray, CHECKERBOARD, None)
    if ret:
        objpoints.append(objp)
        corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
        imgpoints.append(corners2)
        # 可视化角点(可选)
        cv2.drawChessboardCorners(img, CHECKERBOARD, corners2, ret)
        cv2.imshow('Corners', img)
        cv2.waitKey(100)

cv2.destroyAllWindows()

# 相机标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(
    objpoints, imgpoints, gray.shape[::-1], None, None)

print("内参矩阵:\n", mtx)
print("畸变系数:\n", dist)

# 校正示例图像
img = cv2.imread('calib_images/sample.jpg')
h, w = img.shape[:2]
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))

# 生成校正映射
mapx, mapy = cv2.initUndistortRectifyMap(
    mtx, dist, None, newcameramtx, (w, h), cv2.CV_32FC1)
dst = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)

# 裁剪ROI区域(去除边缘黑边)
x, y, w_roi, h_roi = roi
dst_cropped = dst[y:y + h_roi, x:x + w_roi]

# 保存结果
cv2.imwrite('undistorted.jpg', dst_cropped)
print("校正结果已保存为 undistorted.jpg")

落地方式

依赖环境:Python 3.7+,OpenCV 4.x,NumPy。

准备数据:在项目目录下创建calib_images文件夹,放入10~15张不同角度、距离拍摄的棋盘格照片(建议使用A4纸打印9×6内角点棋盘格),其中一张命名为sample.jpg作为待校正示例。

运行:将上述代码保存为calibrate.py,在终端执行python calibrate.py。

验证方法

运行后观察终端输出的内参矩阵与畸变系数是否为有限数值。打开生成的undistorted.jpg,检查图像边缘的弯曲直线(如门框、墙线)是否恢复平直,棋盘格角点是否保持对齐。若校正效果不理想,增加标定图像数量或覆盖更多拍摄角度后重新运行。

棋盘格相机标定与畸变校正流程 图像采集 10~15张棋盘格照片 角点提取 findChessboardCorners 相机标定 calibrateCamera 畸变校正 remap 标定输出参数 • 内参矩阵 mtx (3×3) • 畸变系数 dist (k1,k2,p1,p2,k3) • 旋转/平移向量 (rvecs, tvecs) 校正处理链 ① getOptimalNewCameraMatrix ② initUndistortRectifyMap ③ remap + ROI裁剪 验证判定标准 观察 undistorted.jpg 中直线是否恢复平直 棋盘格角点是否保持规则排列

关键说明

本案例代码完整实现了从棋盘格图像到畸变校正输出的全流程。标定图像数量与位姿多样性直接影响标定精度,建议拍摄时让棋盘格覆盖画面不同区域并倾斜一定角度。若角点检测失败,可调整CHECKERBOARD尺寸或改善光照条件后重试。