请输出相机标定求相机内参外参的代码,并且加上详细注释
时间: 2024-05-16 16:16:38 浏览: 195
以下是相机标定求相机内参外参的代码,使用OpenCV库实现:
```python
import numpy as np
import cv2
# 定义棋盘格内角点的数量
pattern_size = (9, 6)
# 定义世界坐标系中的三维坐标
objp = np.zeros((np.prod(pattern_size), 3), np.float32)
objp[:, :2] = np.indices(pattern_size).T.reshape(-1, 2)
# 用于存储世界坐标系中的三维坐标和对应的二维图像坐标
obj_points = [] # 存储世界坐标系中的三维坐标
img_points = [] # 存储对应的二维图像坐标
# 加载图像并寻找棋盘格内角点
for i in range(1, 21):
img = cv2.imread(f"chessboard_imgs/{i}.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)
if ret:
obj_points.append(objp)
corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))
img_points.append(corners2)
# 绘制棋盘格内角点
img = cv2.drawChessboardCorners(img, pattern_size, corners2, ret)
cv2.imshow('img', img)
cv2.waitKey(500)
cv2.destroyAllWindows()
# 相机标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(obj_points, img_points, gray.shape[::-1], None, None)
# 输出相机内参矩阵和畸变系数
print("Camera Matrix:")
print(mtx)
print("Distortion Coefficients:")
print(dist)
# 选择一张棋盘格图像进行测试
img = cv2.imread("chessboard_imgs/1.jpg")
h, w = img.shape[:2]
# 计算新的相机内参矩阵
newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))
# 矫正图像
dst = cv2.undistort(img, mtx, dist, None, newcameramtx)
# 显示原始图像和矫正后的图像
cv2.imshow('original', img)
cv2.imshow('corrected', dst)
cv2.waitKey(0)
# 旋转向量和平移向量转换为旋转矩阵
R, _ = cv2.Rodrigues(rvecs[0])
T = tvecs[0]
# 输出相机外参矩阵
print("Rotation Matrix:")
print(R)
print("Translation Matrix:")
print(T)
```
代码注释如下:
- `pattern_size`:定义棋盘格内角点的数量,这里是9行6列。
- `objp`:定义世界坐标系中的三维坐标,这里使用两个二维数组表示,第一个数组的元素为x方向的坐标值,第二个数组的元素为y方向的坐标值,第三个数组的元素为z方向的坐标值,这里z方向的坐标值都为0。
- `obj_points`和`img_points`:用于存储世界坐标系中的三维坐标和对应的二维图像坐标。
- `cv2.findChessboardCorners`:寻找图像中的棋盘格内角点。
- `cv2.cornerSubPix`:对粗略提取的内角点进行亚像素级别的精细化定位。
- `cv2.drawChessboardCorners`:在图像上绘制棋盘格内角点。
- `cv2.calibrateCamera`:对相机进行标定,返回相机内参矩阵、畸变系数、旋转向量和平移向量等信息。
- `cv2.getOptimalNewCameraMatrix`:计算新的相机内参矩阵。
- `cv2.undistort`:对图像进行畸变矫正。
- `cv2.Rodrigues`:将旋转向量转换为旋转矩阵。
- `rvecs[0]`和`tvecs[0]`:表示第一张棋盘格图像相对于相机坐标系的旋转向量和平移向量。
- `R`和`T`:表示相机外参矩阵。
注意:在运行代码之前,需要提前准备好棋盘格图像,并将它们放在一个名为`chessboard_imgs`的文件夹中。
阅读全文