用python、cv实现双目相机标定
时间: 2023-10-15 11:05:19 浏览: 48
以下是实现双目相机标定的Python代码示例:
```python
import cv2
import numpy as np
# 设置棋盘格大小和格点数
board_size = (9, 6)
square_size = 0.025 # 棋盘格格子宽度(米)
# 构建棋盘格世界坐标系
world_points = np.zeros((np.prod(board_size), 3), np.float32)
world_points[:, :2] = np.indices(board_size).T.reshape(-1, 2)
world_points *= square_size
# 读取标定用的图片
left_img = cv2.imread('left.png')
right_img = cv2.imread('right.png')
# 检测棋盘格角点
retval1, corners1 = cv2.findChessboardCorners(left_img, board_size)
retval2, corners2 = cv2.findChessboardCorners(right_img, board_size)
# 确保两幅图片都检测到了角点
if retval1 and retval2:
# 提取角点坐标
corners1 = cv2.cornerSubPix(cv2.cvtColor(left_img, cv2.COLOR_BGR2GRAY), corners1, (11, 11), (-1, -1),
criteria=(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))
corners2 = cv2.cornerSubPix(cv2.cvtColor(right_img, cv2.COLOR_BGR2GRAY), corners2, (11, 11), (-1, -1),
criteria=(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))
# 绘制角点
cv2.drawChessboardCorners(left_img, board_size, corners1, True)
cv2.drawChessboardCorners(right_img, board_size, corners2, True)
# 标定相机
retval, camera_matrix1, dist_coeffs1, camera_matrix2, dist_coeffs2, R, T, E, F = cv2.stereoCalibrate(
[world_points], [corners1], [corners2],
cv2.initCameraMatrix2D([world_points], [corners1], left_img.shape[::-1], 0),
cv2.initCameraMatrix2D([world_points], [corners2], right_img.shape[::-1], 0),
left_img.shape[::-1],
flags=cv2.CALIB_FIX_INTRINSIC
)
# 打印标定结果
print('Camera matrix 1:\n', camera_matrix1)
print('Distortion coefficients 1:\n', dist_coeffs1)
print('Camera matrix 2:\n', camera_matrix2)
print('Distortion coefficients 2:\n', dist_coeffs2)
print('Rotation matrix:\n', R)
print('Translation vector:\n', T)
else:
print('Failed to detect chessboard corners.')
# 显示结果
cv2.imshow('Left Image', left_img)
cv2.imshow('Right Image', right_img)
cv2.waitKey()
cv2.destroyAllWindows()
```
在这个示例中,我们首先定义了棋盘格大小和格点数,并构建了棋盘格世界坐标系。然后,我们读取了用于标定的左右相机图像,并使用`cv2.findChessboardCorners`函数检测棋盘格角点。如果两幅图片都检测到了角点,我们就使用`cv2.stereoCalibrate`函数进行相机标定。最后,我们打印标定结果并显示用于标定的图像和检测到的角点。