opencv双目相机标定python获取外参
时间: 2025-05-05 11:59:06 浏览: 49
### 双目相机标定实现
通过 Python 和 OpenCV 进行双目相机标定时,可以利用 `cv2.stereoCalibrate` 函数来完成内外参的联合标定。该方法不仅能够获得单目的内参矩阵和畸变系数,还能进一步求解两摄像头之间的相对位置关系(即外参)。以下是具体实现方式:
#### 数据准备
为了进行双目相机标定,需采集一系列棋盘格图像作为输入数据源。这些图像应覆盖不同角度、距离以及光照条件下的场景。
#### 关键代码示例
以下是一个完整的代码框架用于执行双目标定过程,并提取所需的外部参数——旋转矩阵 \( R \) 和平移向量 \( T \):
```python
import numpy as np
import cv2
import glob
# 终端尺寸定义
chessboard_size = (9, 6)
# 获取世界坐标系中的三维点
objp = np.zeros((np.prod(chessboard_size), 3), dtype=np.float32)
objp[:, :2] = np.mgrid[0:chessboard_size[0], 0:chessboard_size[1]].T.reshape(-1, 2)
# 存储每幅图片对应的对象点和图像点
objpoints_l = []
imgpoints_l = []
objpoints_r = []
imgpoints_r = []
images_left = glob.glob('left*.jpg')
images_right = glob.glob('right*.jpg')
for fname_l, fname_r in zip(images_left, images_right):
img_l = cv2.imread(fname_l)
gray_l = cv2.cvtColor(img_l, cv2.COLOR_BGR2GRAY)
img_r = cv2.imread(fname_r)
gray_r = cv2.cvtColor(img_r, cv2.COLOR_BGR2GRAY)
ret_l, corners_l = cv2.findChessboardCorners(gray_l, chessboard_size, None)
ret_r, corners_r = cv2.findChessboardCorners(gray_r, chessboard_size, None)
if ret_l and ret_r:
objpoints_l.append(objp)
objpoints_r.append(objp)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
corners_l_refined = cv2.cornerSubPix(gray_l, corners_l, (11, 11), (-1, -1), criteria)
imgpoints_l.append(corners_l_refined)
corners_r_refined = cv2.cornerSubPix(gray_r, corners_r, (11, 11), (-1, -1), criteria)
imgpoints_r.append(corners_r_refined)
# 单独校准左摄像机
retL, cameraMatrixL, distCoeffsL, _, _ = cv2.calibrateCamera(
objpoints_l, imgpoints_l, gray_l.shape[::-1], None, None)[^2]
# 单独校准右摄像机
retR, cameraMatrixR, distCoeffsR, _, _ = cv2.calibrateCamera(
objpoints_r, imgpoints_r, gray_r.shape[::-1], None, None)
# 联合立体校正
flags = 0
flags |= cv2.CALIB_FIX_INTRINSIC
criteria_stereo = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
retS, MLS, dLS, MRS, dRS, R, T, E, F = cv2.stereoCalibrate(
objpoints_l,
imgpoints_l,
imgpoints_r,
cameraMatrixL,
distCoeffsL,
cameraMatrixR,
distCoeffsR,
gray_l.shape[::-1],
flags=flags,
criteria=criteria_stereo)[^1]
print("Rotation Matrix:")
print(R) # 输出旋转矩阵
print("\nTranslation Vector:")
print(T) # 输出平移向量
```
上述脚本实现了以下几个功能模块:
- **角点检测**:分别针对左右两侧拍摄到的棋盘格图案寻找亚像素精度级别的角点。
- **单独标定**:先独立处理每一侧镜头的数据集以初步估计其内部几何特性。
- **联合优化**:最后调用 `stereoCalibrate()` 方法同步调整两个视图间的关联性约束条件从而得出精确的结果。
值得注意的是,在实际应用过程中可能还需要考虑更多细节问题比如噪声过滤等措施提升整体性能表现[^3]。
---
####
阅读全文
相关推荐


















