双目鱼眼相机内参标定
时间: 2025-01-01 10:34:29 浏览: 14
### 关于双目鱼眼相机内参标定的方法
对于双目鱼眼相机而言,其内参标定过程涉及到了解并修正由鱼眼镜头引入的独特畸变模式。这不仅限于传统的径向和切向畸变,还包括了更复杂的失真效应。为了实现有效的校准,通常采用特定设计的棋盘格图案作为标定点源,因为这类图案能够提供足够的特征点用于计算。
#### 准备工作
在开始之前,确保拥有高质量的图像数据集至关重要。这些图片应当覆盖整个视野范围,并尽可能均匀分布各个方向上的视角变化。此外,准备一个标准尺寸的黑白交替排列的棋盘格模板是非常必要的[^2]。
#### 数据采集阶段
利用上述提到的棋盘格板,在不同位置与角度下拍摄一系列照片。每一张照片都应清晰可见完整的棋盘格区域。此步骤旨在获取足够丰富的空间信息以便后续处理算法能准确估计内外参数矩阵。
#### 参数估算部分
针对单个摄像单元来说,主要任务是从所收集到的数据集中提取出精确的关键点坐标对(即世界坐标系下的已知物理尺寸对应物和平面成像后的像素位置),进而求得内部几何属性如焦距、主点偏移量等以及外部姿态描述符比如旋转平移矢量组。当涉及到一对同步工作的双眼结构时,则还需额外考虑相互间的相对位姿关系——即所谓的“外参”。
对于鱼眼类型的设备来讲,由于存在显著不同于常规广角透镜系统的投影特性,因此需要应用专门定制化版本的数学模型来进行拟合操作。OpenCV库提供了`cv::omnidir::calibrate`接口支持此类特殊情形下的全面优化流程[^1]。
```python
import cv2 as cv
import numpy as np
# 假设已经完成了图像读取并将所有检测到的角点存储在一个列表中
object_points = [] # 物体空间中的三维点 (0,0,0), (1,0,0), ...
image_points_left = []
image_points_right = []
for i in range(number_of_images):
objp = np.zeros((chessboard_size[0]*chessboard_size[1],3), np.float32)
objp[:,:2] = np.mgrid[0:chessboard_size[0],0:chessboard_size[1]].T.reshape(-1,2)
object_points.append(objp)
ret_l, corners_l = cv.findChessboardCorners(gray_image_left[i], chessboard_size)
ret_r, corners_r = cv.findChessboardCorners(gray_image_right[i], chessboard_size)
if ret_l and ret_r:
criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 30, 0.001)
corners_subpix_l = cv.cornerSubPix(gray_image_left[i],corners_l,(11,11),(-1,-1),criteria)
corners_subpix_r = cv.cornerSubPix(gray_image_right[i],corners_r,(11,11),(-1,-1),criteria)
image_points_left.append(corners_subpix_l)
image_points_right.append(corners_subpix_r)
flags = 0
flags |= cv.CALIB_FIX_K4 | cv.CALIB_FIX_K5 # Fixing the higher order distortion coefficients to zero can improve stability.
ret, mtxL, distL, rvecsL, tvecsL = cv.omnidir.calibrate(
objectPoints=object_points,
imagePoints=image_points_left,
imageSize=(width,height),
K=np.eye(3),
D=np.zeros((4)),
flags=flags
)
ret, mtxR, distR, rvecsR, tvecsR = cv.omnidir.calibrate(
objectPoints=object_points,
imagePoints=image_points_right,
imageSize=(width,height),
K=np.eye(3),
D=np.zeros((4)),
flags=flags
)
```
这段代码展示了如何使用 OpenCV 的 `omnidir` 模块来完成一次典型的鱼眼光学系统单独组件级别的初步调整作业。值得注意的是这里假设左右两侧采用了相同的硬件配置从而简化了一些输入变量设定;而在实际应用场景里可能还需要进一步微调某些选项以适应具体的实验条件差异。
最后一步则是执行立体匹配程序确定两台装置间确切的空间关联方式:
```python
stereo_criteria = (cv.TERM_CRITERIA_COUNT + cv.TERM_CRITERIA_EPS, 100, 1e-5)
stereo_flags = cv.CALIB_FIX_INTRINSIC
ret, _, _, _, _, R, T, E, F = cv.stereoCalibrate(
objectPoints=object_points,
imagePoints1=image_points_left,
imagePoints2=image_points_right,
cameraMatrix1=mtxL,
distCoeffs1=distL,
cameraMatrix2=mtxR,
distCoeffs2=distR,
imageSize=(width,height),
criteria=stereo_criteria,
flags=stereo_flags
)
```
通过以上步骤可以获得较为理想的双目鱼眼相机内参及互相关联参数设置方案[^3]。
阅读全文