# camera_calib **Repository Path**: tangyang/camera_calib ## Basic Information - **Project Name**: camera_calib - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-07-28 - **Last Updated**: 2026-08-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 相机标定与图像去畸变 本项目使用 Python 和 OpenCV 完成相机标定,并利用标定得到的相机内参和畸变系数对单张图片、图片目录或摄像头实时画面进行去畸变。 项目支持两种标定板: - 棋盘格标定板 - 非对称圆点阵列标定板 ## 运行环境 - Python 3.10 或更高版本 - OpenCV - NumPy 安装依赖: ```powershell pip install opencv-python numpy ``` 建议在项目根目录执行本文中的命令,以保证默认相对路径能够正确解析。 ## 目录结构 ```text CameraCalibration/ ├── assets/ │ ├── calib_chessboard/ # 棋盘格标定图片 │ └── calib_acircle/ # 非对称圆点阵列标定图片 ├── output/ # 标定文件、采集图片和去畸变结果 ├── 01_CameraCalibChessboard.py # 使用棋盘格图片标定 ├── 02_CameraCalibACircle.py # 使用圆点阵列图片标定 ├── 03_CameraCalibChessboardVideo.py │ # 摄像头采集棋盘格并标定 ├── 04_CameraCalibACircleVideo.py │ # 摄像头采集圆点阵列并标定 ├── 05_UndistortImage.py # 使用 undistort 处理单张图片 └── 06_UndistortRemap.py # 使用 remap 处理目录或摄像头 ``` ## 一、使用已有图片进行相机标定 ### 1. 棋盘格标定 直接使用 `assets/calib_chessboard` 中的默认图片: ```powershell python 01_CameraCalibChessboard.py ``` 显示角点检测预览: ```powershell python 01_CameraCalibChessboard.py --preview ``` 指定图片、棋盘格内角点和方格尺寸: ```powershell python 01_CameraCalibChessboard.py ` --images "assets/calib_chessboard/*.jpg" ` --board-width 6 ` --board-height 9 ` --square-size 20 ` --preview ` --output calibration_chessboard ``` 默认标定板参数: - 每行内角点数:6 - 每列内角点数:9 - 方格边长:20 mm 默认输出: ```text output/calibration_chessboard.yml output/calibration_chessboard.xml ``` ### 2. 非对称圆点阵列标定 直接使用 `assets/calib_acircle` 中的默认图片: ```powershell python 02_CameraCalibACircle.py ``` 显示圆心检测预览: ```powershell python 02_CameraCalibACircle.py --preview ``` 指定全部主要参数: ```powershell python 02_CameraCalibACircle.py ` --images "assets/calib_acircle/*.jpg" ` --board-width 5 ` --board-height 7 ` --diagonal-spacing 20 ` --circle-diameter 10 ` --preview ` --output calibration_acircle ``` 默认标定板参数: - 短行圆心数:5 - 错位排列行数:7 - 对角相邻圆心距离:20 mm - 圆直径:10 mm 默认输出: ```text output/calibration_acircle.yml output/calibration_acircle.xml ``` > 圆直径作为标定板信息写入结果文件,不直接参与相机矩阵计算。 ## 二、通过摄像头采集并标定 ### 1. 棋盘格摄像头标定 ```powershell python 03_CameraCalibChessboardVideo.py --camera 0 ``` ### 2. 非对称圆点阵列摄像头标定 ```powershell python 04_CameraCalibACircleVideo.py --camera 0 ``` 采集窗口快捷键: - `Space`:检测成功时采集当前画面 - `Q` 或 `Esc`:退出且不执行标定 采集时应改变标定板的距离、角度和画面位置,使标定板覆盖图像中心、四角和边缘。避免连续采集姿态几乎相同的画面。达到目标采集数量后,程序会自动执行标定并把结果保存到 `output` 目录。 ## 三、单张图片去畸变 `05_UndistortImage.py` 使用 `cv2.undistort` 直接处理一张图片。 使用默认棋盘格标定文件: ```powershell python 05_UndistortImage.py assets/calib_chessboard/image_01.jpg ``` 指定标定文件、输出文件并显示对比画面: ```powershell python 05_UndistortImage.py input.jpg ` --calibration output/calibration_chessboard.yml ` --output output/undistorted.jpg ` --show ``` 主要参数: | 参数 | 说明 | |---|---| | `image` | 待去畸变图片路径,必填 | | `-c, --calibration` | 标定文件路径 | | `-o, --output` | 输出图片路径 | | `--alpha` | 有效视野比例,范围为 0~1 | | `--show` | 显示原图与去畸变结果 | `--alpha 0` 会尽量消除黑边并裁剪有效区域;`--alpha 1` 会尽量保留完整视野,但图像边缘可能出现黑色区域。 ## 四、使用 remap 去畸变 `06_UndistortRemap.py` 使用 `cv2.initUndistortRectifyMap` 预先生成映射表,再通过 `cv2.remap` 处理图像。映射表可以重复使用,因此更适合批量图片和实时摄像头画面。 ### 1. 处理图片目录 ```powershell python 06_UndistortRemap.py --input-dir assets/calib_chessboard ``` 指定标定文件和输出目录: ```powershell python 06_UndistortRemap.py ` --input-dir assets/calib_chessboard ` --calibration output/calibration_chessboard.yml ` --output-dir output/undistorted_remap ``` 递归处理子目录: ```powershell python 06_UndistortRemap.py ` --input-dir assets ` --recursive ``` 支持的图片格式包括: ```text .bmp .jpeg .jpg .png .tif .tiff .webp ``` ### 2. 实时处理摄像头 打开编号为 0 的摄像头: ```powershell python 06_UndistortRemap.py --camera 0 ``` 摄像头默认请求分辨率为 `1280×720`。也可以手动覆盖: ```powershell python 06_UndistortRemap.py ` --camera 0 ` --width 1920 ` --height 1080 ``` 使用圆点阵列标定结果: ```powershell python 06_UndistortRemap.py ` --camera 0 ` --calibration output/calibration_acircle.yml ` --alpha 1 ``` 实时窗口中按 `Q` 或 `Esc` 退出。 > `VideoCapture.set` 向摄像头请求指定分辨率,但摄像头驱动可能选择最接近的受支持分辨率。程序会按照实际读取到的画面尺寸创建映射表。 ## 标定结果说明 标定文件采用 OpenCV XML/YAML 格式,主要包含: | 字段 | 说明 | |---|---| | `cameraMatrix` | 3×3 相机内参矩阵 | | `distCoeffs` | 径向和切向畸变系数 | | `image_width` | 标定图像宽度 | | `image_height` | 标定图像高度 | | `rms` | 标定的均方根重投影误差 | 相机内参矩阵形式为: ```text [ fx 0 cx ] [ 0 fy cy ] [ 0 0 1 ] ``` 其中 `fx`、`fy` 是像素单位焦距,`cx`、`cy` 是主点坐标。 去畸变脚本会读取标定图像尺寸。如果输入画面尺寸与标定尺寸不同,程序会按宽高比例调整焦距和主点坐标。为获得更可靠的结果,建议去畸变时使用与标定时相同的相机分辨率、对焦状态和镜头设置。 ## 常见问题 ### 无法打开摄像头 尝试其他摄像头编号: ```powershell python 06_UndistortRemap.py --camera 1 ``` 同时确认摄像头没有被其他程序占用,并允许终端或 Python 访问摄像头。 ### 找不到标定文件 请先运行标定脚本,或者使用 `--calibration` 指定已有的 XML/YAML 文件: ```powershell python 06_UndistortRemap.py ` --camera 0 ` --calibration path/to/calibration.yml ``` 标定文件至少需要包含有效的 `cameraMatrix` 和 `distCoeffs`。 ### 去畸变效果不明显或不正确 检查以下事项: - 标定文件是否来自当前相机和镜头。 - 标定与去畸变时的分辨率、对焦和变焦设置是否一致。 - 标定图片是否覆盖了画面中心、四角和边缘。 - 标定板尺寸参数是否与实物一致。 - 标定图片是否清晰,角点或圆心是否完整可见。 - 标定结果中的 RMS 重投影误差是否过大。 ### 中文显示乱码 源码和文档使用 UTF-8 编码。PowerShell 中可先切换到 UTF-8 代码页: ```powershell chcp 65001 ```