1、环境准备
pip install numpy opencv-python glob2 pyyaml
上面是 Python 中常用的库:
-
numpy:
- 功能: 用于科学计算,提供高效的数组操作和数学函数。
- 用途: 处理多维数组、矩阵运算、线性代数、傅里叶变换等。
-
opencv-python:
- 功能: 用于计算机视觉和图像处理。
- 用途: 图像和视频处理、对象检测、特征提取、摄像头输入等。
-
glob2:
- 功能: 用于文件路径匹配。
- 用途: 查找符合特定模式的文件路径,常用于批量处理文件。
-
pyyaml:
- 功能: 用于解析和生成 YAML 文件。
- 用途: 读取和写入 YAML 配置文件,适合存储和传输结构化数据。
2、准备棋盘格
https://calib.io/pages/camera-calibration-pattern-generator
- 下图刚好是一张A4纸大小,14x18的格子,将棋盘格另存为PDF:
- 使用需要标定的相机进行拍照,多拍一些不同角度的,例如下面这样:
3、标定代码
3.1Python
代码实现如下:
import numpy as np
import cv2
import glob
import yaml
# ==================== 可修改参数 ====================
# 棋盘格尺寸 (行数, 列数) - 指的是棋盘格的方格数量
CHESSBOARD_SQUARES = (18, 14)
# 角点检测精度参数
CRITERIA = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
# 图片文件类型
IMAGE_FORMAT = 'access/image/*.png'
# 校准结果保存文件名
OUTPUT_FILE = "access/calibration_matrix.yaml"
# ================================================
def main():
# 计算内部角点的数量
chessboard_size = (CHESSBOARD_SQUARES[0] - 1, CHESSBOARD_SQUARES[1] - 1)
# 准备对象点,例如 (0,0,0), (1,0,0), ..., (16,12,0)
objp = np.zeros((chessboard_size[0]