单目相机标定python代码
时间: 2023-10-12 15:09:51 浏览: 170
以下是使用Python OpenCV库进行单目相机标定的示例代码:
```python
import numpy as np
import cv2
# 设置棋盘格尺寸
pattern_size = (9, 6)
# 准备棋盘格点的位置
objp = np.zeros((pattern_size[0]*pattern_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2)
# 用于存储所有图像的棋盘格角点坐标
objpoints = []
imgpoints = []
# 读取所有图像,并查找棋盘格角点
images = glob.glob('calibration_images/*.jpg')
for fname in images:
img = cv2.imread(fname)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 查找棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)
# 如果找到了角点,则添加到objpoints和imgpoints中
if ret == True:
objpoints.append(objp)
imgpoints.append(corners)
# 在图像上绘制角点
cv2.drawChessboardCorners(img, pattern_size, corners, ret)
cv2.imshow('img', img)
cv2.waitKey(500)
# 进行相机标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
# 打印标定结果
print("相机内参矩阵:\n", mtx)
print("畸变系数:\n", dist)
# 保存相机内参和畸变系数
np.savez('calibration.npz', mtx=mtx, dist=dist)
```
在此示例中,我们首先定义了棋盘格尺寸,并准备了棋盘格点的位置。然后,我们读取所有标定图像,并使用`cv2.findChessboardCorners()`函数查找棋盘格角点。如果找到了角点,则将其添加到`objpoints`和`imgpoints`列表中。最后,我们使用`cv2.calibrateCamera()`函数进行相机标定,并将结果打印出来,并保存相机内参和畸变系数。
阅读全文