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,检查图像边缘的弯曲直线(如门框、墙线)是否恢复平直,棋盘格角点是否保持对齐。若校正效果不理想,增加标定图像数量或覆盖更多拍摄角度后重新运行。
关键说明
本案例代码完整实现了从棋盘格图像到畸变校正输出的全流程。标定图像数量与位姿多样性直接影响标定精度,建议拍摄时让棋盘格覆盖画面不同区域并倾斜一定角度。若角点检测失败,可调整CHECKERBOARD尺寸或改善光照条件后重试。