2023年11月27日
[相机] 内参标定
import cv2import numpy as np
# 设置棋盘格的大小chessboard_size = (6, 9)
# 设置棋盘格的物理尺寸square_size = 4.0 # 单位为厘米
# 准备用于标定的物体空间坐标和对应的图像坐标objpoints = [] # 3D points in real world spaceimgpoints = [] # 2D points in image plane.
# 准备用于标定的图像列表images = []
# 加载图像并查找棋盘格角点for i in range(1, 7): # 假设有20张图像 filename = f'data/iphone_0.5/{i:02d}.jpg' img = cv2.imread(filename) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 在灰度图上查找棋盘格角点 ret, corners = cv2.findChessboardCorners(gray, chessboard_size, None)
# 如果找到角点,则添加到标定数据中 if ret: objp = np.zeros((np.prod(chessboard_size), 3), np.float32) objp[:, :2] = np.indices(chessboard_size).T.reshape(-1, 2) * square_size objpoints.append(objp) imgpoints.append(corners)
# 在图像上绘制角点并添加到标定数据中 cv2.drawChessboardCorners(img, chessboard_size, corners, ret) images.append(img)
# 进行相机标定ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
# 打印内部参数矩阵和畸变系数print("Camera Matrix:")print(mtx)print("\nDistortion Coefficients:")print(dist)
# 显示标定结果图像cv2.imshow('Chessboard Corners', images[0])cv2.waitKey(0)cv2.destroyAllWindows()