AI-exp-3/camera_calibration.py
fly6516 39d6065521 feat(camera): 添加相机标定与运动估计功能
- 新增 camera_calibration.py 文件,实现相机标定功能
- 新增 motion_estimation.py 文件,实现运动估计功能- 编写实验报告,总结相机标定与运动估计的原理和实验结果
2025-05-23 11:43:17 +08:00

56 lines
1.8 KiB
Python

import cv2
import numpy as np
import glob
# 棋盘格尺寸:内角点数量(宽度,高度)
chessboard_size = (9, 6)
# 创建棋盘格世界坐标系下的三维点阵
# 生成形如(0,0,0), (1,0,0)...(8,5,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('images/*.jpg')
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 寻找棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)
if ret:
objpoints.append(objp)
imgpoints.append(corners)
# 绘制并显示检测到的角点
cv2.drawChessboardCorners(img, chessboard_size, corners, ret)
cv2.imshow('Corners', img)
cv2.waitKey(0) # 修改此处:改为等待用户按键关闭窗口
# 销毁所有OpenCV创建的窗口
cv2.destroyAllWindows()
if len(objpoints) > 0:
# 执行相机标定,获取相机矩阵、畸变系数等参数
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
# 输出相机矩阵和畸变系数
print("相机矩阵:\n", mtx)
print("畸变系数:\n", dist)
# 计算重投影误差
mean_error = 0
for i in range(len(objpoints)):
imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)
error = cv2.norm(imgpoints[i], imgpoints2, cv2.NORM_L2) / len(imgpoints2)
mean_error += error
print("平均重投影误差: ", mean_error / len(objpoints))
else:
print("未找到有效的棋盘格图像。")