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. 注意事项

  1. 标定板要求

    • 标定板应平整无变形
    • 棋盘格角点清晰可见
    • 不同角度拍摄多张图像(建议10-20张)
  2. 图像质量

    • 图像应清晰,无模糊
    • 曝光适中,避免过曝或欠曝
    • 标定板应占据图像的大部分区域
posted @ 2025-08-08 14:03  aaooli  阅读(253)  评论(0)    收藏  举报