OpenCV-相机标定
相机标定知识点记录
1. 概述
相机标定是计算机视觉中的基础步骤,用于确定相机的内参、外参以及镜头畸变参数。通过标定可以校正图像畸变,进行精确的测量和三维重建。
相机标定主要涉及以下参数:
- 内参矩阵(Intrinsic Matrix):包含相机的焦距、主点等内部参数
- 畸变系数(Distortion Coefficients):描述镜头畸变的参数
- 外参矩阵(Extrinsic Matrix):描述相机在世界坐标系中的位置和姿态
2. 关键函数解析
2.1 cv2.findChessboardCorners
功能: 检测棋盘格角点,用于标定图像的特征提取。
参数:
image: 输入的灰度图像patternSize: 棋盘格内部角点的数量 (width, height)corners: 输出检测到的角点坐标flags: 检测标志,如cv2.CALIB_CB_ADAPTIVE_THRESH
2.2 cv2.calibrateCamera
功能: 根据检测到的角点计算相机内参和畸变系数。
参数:
objectPoints: 世界坐标系中的角点坐标imagePoints: 图像坐标系中的角点坐标imageSize: 图像尺寸 (width, height)cameraMatrix: 输出的相机内参矩阵distCoeffs: 输出的畸变系数rvecs: 输出的旋转向量tvecs: 输出的平移向量
3. 示例代码
3.1 普通相机标定
import cv2
import numpy as np
import glob
# 设置寻找亚像素角点的参数
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# 棋盘格规格
w = 9 # 内角点数量
h = 6
# 世界坐标系中的棋盘格点
objp = np.zeros((w*h, 3), np.float32)
objp[:, :2] = np.mgrid[0:w, 0:h].T.reshape(-1, 2)
# 储存棋盘格角点的世界坐标和图像坐标对
objpoints = [] # 在世界坐标系中的三维点
imgpoints = [] # 在图像平面的二维点
# 加载图像
images = glob.glob('calibration_images/*.jpg')
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 找到棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, (w, h), None)
if ret:
# 寻找亚像素角点
cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
objpoints.append(objp)
imgpoints.append(corners)
# 显示角点
cv2.drawChessboardCorners(img, (w, h), corners, ret)
cv2.imshow('Corners', img)
cv2.waitKey(500)
cv2.destroyAllWindows()
# 标定相机
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
print("相机内参矩阵:")
print(mtx)
print("\n畸变系数:")
print(dist)
4. 注意事项
-
标定板要求:
- 标定板应平整无变形
- 棋盘格角点清晰可见
- 不同角度拍摄多张图像(建议10-20张)
-
图像质量:
- 图像应清晰,无模糊
- 曝光适中,避免过曝或欠曝
- 标定板应占据图像的大部分区域

浙公网安备 33010602011771号