OpenCV相机校准教程:从参数生成到图像去畸变
创作时间:
作者:
@小白创作中心
OpenCV相机校准教程:从参数生成到图像去畸变
引用
CSDN
1.
https://blog.csdn.net/qq_38961840/article/details/143031770
本文将详细介绍如何使用OpenCV和Python进行相机校准,包括生成校准参数和使用这些参数进行图像去畸变处理。通过本教程,你将学会如何校正相机的畸变,以获得更准确的图像数据。
不墨迹,放代码:
# 相机校准脚本
# 该脚本与所有jpg文件位于同一文件夹
# 使用OpenCV和Python进行相机校准
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 = '*.jpg'
# 校准结果保存文件名
OUTPUT_FILE = "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] * chessboard_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2)
# 用于存储所有图片的对象点和图像点
objpoints = [] # 3D 点在真实世界空间
imgpoints = [] # 2D 点在图像平面
# 获取所有符合格式的图片路径
images = glob.glob(IMAGE_FORMAT)
found = 0 # 记录找到的有效图片数量
for fname in images:
img = cv2.imread(fname)
if img is None:
print(f"无法读取图片: {fname}")
continue
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 查找棋盘角点
ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)
if ret:
objpoints.append(objp)
# 提高角点检测精度
corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), CRITERIA)
imgpoints.append(corners2)
# 在图片上绘制角点
img = cv2.drawChessboardCorners(img, chessboard_size, corners2, ret)
found += 1
# 显示检测结果
cv2.imshow('Chessboard Corners', img)
cv2.waitKey(500)
# 如果需要保存带有角点的图片,可以取消以下注释
# output_image_name = f'calibresult_{found}.png'
# cv2.imwrite(output_image_name, img)
else:
print(f"未找到棋盘角点: {fname}")
cv2.destroyAllWindows()
print(f"用于校准的图片数量: {found}")
if found < 1:
print("没有找到足够的图片进行校准。")
return
# 进行相机校准
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
if not ret:
print("相机校准失败。")
return
# 将相机矩阵和畸变系数保存到字典中
calibration_data = {
'camera_matrix': mtx.tolist(),
'dist_coeff': dist.tolist(),
'rvecs': [r.tolist() for r in rvecs],
'tvecs': [t.tolist() for t in tvecs]
}
# 将校准数据写入YAML文件
with open(OUTPUT_FILE, "w") as f:
yaml.dump(calibration_data, f)
print(f"校准完成,结果已保存到 {OUTPUT_FILE}")
if __name__ == "__main__":
main()
相机校准教程
本教程将指导您如何使用OpenCV和Python进行相机校准,包括生成校准参数和使用这些参数进行图像去畸变。
目录
- 安装必要的库
- 准备棋盘格
- 编写并运行校准脚本
- 使用校准参数进行图像去畸变
安装必要的库
在开始之前,确保您已经安装了以下Python库:
- NumPy
- OpenCV
- Glob
- PyYAML
您可以使用pip来安装这些库:
pip install numpy opencv-python glob2 pyyaml
准备棋盘格
- 下载棋盘格图案:
为了进行相机校准,您需要一个18×14的棋盘格图案。您可以使用以下链接生成高分辨率的棋盘格图案:
附一张示例棋盘格:
注意:确保棋盘格打印清晰,避免模糊或扭曲。
- 打印棋盘格:
将棋盘格图案按实际大小打印,并将其粘贴在一个平坦的表面上。确保棋盘格平整,以便在拍摄时能够准确检测角点。
- 拍摄校准图片:
从不同的角度和距离拍摄多张包含棋盘格的图片。至少需要15张不同角度的图片,以确保校准的准确性。
不同角度的棋盘格图片:
编写并运行校准脚本
- 准备工作目录:
- 将所有拍摄的.jpg图片与校准脚本放在同一个文件夹中。
- 编写校准脚本:
使用您喜欢的文本编辑器(如VS Code、PyCharm等)创建一个新的Python文件,例如camera_calibration.py,并将文章开头的代码粘贴进去:
代码说明:
- CHESSBOARD_SQUARES:定义棋盘格的方格数量。在本例中为18×14。
- CRITERIA:角点检测的终止条件。
- IMAGE_FORMAT:指定要处理的图片格式,此处为所有.jpg文件。
- OUTPUT_FILE:校准结果保存的YAML文件名。
- chessboard_size:内部角点的数量,由棋盘格的方格数量减1得到。
- objp:棋盘格在三维空间中的坐标。
- objpoints & imgpoints:存储所有图片的对象点和图像点。
- 校准过程:检测每张图片的棋盘角点,优化角点位置,绘制角点,进行相机校准并保存结果。
- 运行校准脚本:
打开终端或命令提示符,导航到脚本所在的文件夹,然后运行:
python camera_calibration.py
脚本将逐一处理每张图片,显示检测到的棋盘角点,并在完成后生成calibration_matrix.yaml文件。
检测到的棋盘角点示例:
示例输出:
用于校准的图片数量: 15
校准完成,结果已保存到 calibration_matrix.yaml
使用校准参数进行图像去畸变
完成相机校准后,您可以使用生成的calibration_matrix.yaml文件对图像进行去畸变处理。以下是一个示例脚本:
# 图像去畸变脚本
import cv2
import yaml
import numpy as np
# 加载校准参数
with open("calibration_matrix.yaml") as f:
data = yaml.safe_load(f)
camera_matrix = np.array(data['camera_matrix'])
dist_coeff = np.array(data['dist_coeff'])
# 读取需要去畸变的图像
img = cv2.imread('distorted_image.jpg')
h, w = img.shape[:2]
# 获取最佳新相机矩阵
new_camera_mtx, roi = cv2.getOptimalNewCameraMatrix(camera_matrix, dist_coeff, (w, h), 1, (w, h))
# 去畸变
undistorted_img = cv2.undistort(img, camera_matrix, dist_coeff, None, new_camera_mtx)
# 裁剪图像(可选)
x, y, w, h = roi
undistorted_img = undistorted_img[y:y+h, x:x+w]
# 保存去畸变后的图像
cv2.imwrite('undistorted_image.jpg', undistorted_img)
# 显示结果
cv2.imshow('Undistorted Image', undistorted_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
步骤说明:
- 加载校准参数:从calibration_matrix.yaml文件中读取相机矩阵和畸变系数。
- 读取图像:加载需要去畸变的图像。
- 计算新相机矩阵:优化相机矩阵以减少失真。
- 去畸变:使用cv2.undistort函数去除图像的畸变。
- 裁剪图像(可选):根据ROI裁剪去畸变后的图像,去除无效区域。
- 保存和显示:保存去畸变后的图像并显示结果。
去畸变前后的图像对比:
热门推荐
大学生职业生涯规划书- 塑造你的未来蓝图
凯西灵性疗愈法:用内在丰盛感化解经济困境
信通院发布11月手机市场报告:5G手机占比达92.3%
投资84亿推进完整社区建设,聚焦“一老一小”服务短板
北京学区房价格大幅调整,教育改革遇上人口负增长
冬季养肺妙招,告别呼吸道烦恼
人教新课标版六年级数学同步课推荐:从基础巩固到竞赛提升
苏教版六年级数学预习卡:助力小升初的预习神器
六年级上册数学高效学习攻略
梦见金银财宝遍地,财富心态大升级
无法购买指定区段车票?这些实用技巧帮你轻松搞定
八达岭长城徒步路线推荐与注意事项
珠海“百岛之市”里的味道:10余种非遗美食大盘点
澳门回归25年:内地鲜活产品供应量质齐升
丹东必吃美食:从黄蚬子到梭子蟹,还有地道杀猪菜
职场逆袭:反其道而行之的成功案例
高盛预测:2026年电动车电池成本将降50%,与燃油车持平
二次拆迁项目管理指南:六大步骤确保工程顺利推进
酸辣开胃vs香浓醇厚:桂林米粉的双重魅力
中国推进动力电池产业绿色可持续发展
宁德时代被曝最强大固态电池研发团队
冬季感冒必备神器:布洛芬使用全攻略
《铜雀台》短剧将曹操塑造成“大汉忠臣”,引发史学界质疑
宋朝牛肉消费:一场关于社会阶层的秘密
忠厚脸也能演反派?看魏鹤龄如何用演技打破偏见
《红楼梦之金玉良缘》票房低迷,专家解析影视改编困境
规则怪谈:当日常变成谜题
校园规则怪谈小说推荐:《规则怪谈:我和同桌一起快穿》
《最终幻想起源》中文设置完全指南
PS3HEN 3.2.2:让PS3游戏语言不再受限