鱼眼镜头标定基础知识
相机标定是指计算相机外参和内参的过程。对相机进行标定后,即可利用图像信息从二维图像中恢复三维信息。您还可以对用鱼眼镜头拍摄的图像去畸变。
鱼眼镜头相机用于里程计,并用于通过视觉方法解决同步定位和地图构建 (SLAM) 问题。其他应用包括监控系统、GoPro、用于捕捉 360 度视场角 (FOV) 的虚拟现实 (VR) 技术,以及图像拼接算法。这些相机采用一系列复杂的镜头来扩大其视场,从而能够拍摄宽幅全景或半球形图像。然而,这些镜头是通过畸变图像中的透视线来实现这种极广角视角的。

Computer Vision Toolbox™ 包含针孔相机模型和鱼眼相机模型的标定算法。鱼眼模型可支持视野 (FOV) 最高达 195 度的相机。一般类别的镜头的视场范围如下:
标准镜头 - 50° - 80°
广角镜头 - 80° - 120°
超广角镜头 - 120° - 180°
鱼眼镜头 - 180° - 220°
超级鱼眼镜头 - 视角大于 220°
Computer Vision Toolbox 提供了用于建模以下相机模型的功能:针孔相机模型(支持最高约 95° 的视场角、Kannala‑Brandt 模型 [2](支持最高约 115° 的视场角)和 Scaramuzza 模型(支持最高约 195° 的视场角)。下表列出了这些模型可用的特征。
| 模型 | 特征 | 最大视场角 |
|---|---|---|
| 针孔模型 | cameraIntrinsics | 最高 95°
|
| Kannala-Brandt 模型(OpenCV 鱼眼镜头模型) | cameraIntrinsicsKB | 最高可达 115°
|
| Scaramuzza 模型 | fisheyeIntrinsics | 最高可达 195° |
由于鱼眼镜头产生的极端畸变,针孔模型无法模拟鱼眼相机。

鱼眼相机模型
Computer Vision Toolbox 标定算法采用了 Scaramuzza [1] 提出的鱼眼镜头模型。该模型采用全向相机模型。该过程将成像系统视为一个紧凑型系统。为了将三维空间中的一个点映射到二维图像上,必须获取相机的外参和内参。利用外参将世界坐标系中的点转换为相机坐标系中的点。通过内参将相机坐标映射到图像平面。
外参
外参包含旋转 R 和平移 t。相机的坐标系原点位于其光学中心,其 x-轴和 y-轴定义了成像平面。
从世界坐标系到相机坐标系的变换为:

内参
对于鱼眼镜头模型,其内参包括投影函数的多项式映射系数。对齐系数与传感器对齐以及从传感器平面到相机图像平面中像素位置的变换有关。
下述方程将图像中的一个点映射到其对应的三维向量上。
是现实世界中各点的理想图像投影。
表示一个标量因子。
是 Scaramuzza 模型所描述的多项式系数,其中
。
是 (u,v) 的一个函数,且仅取决于某一点到图像中心的距离:
。
这些内参还考虑了拉伸和畸变的影响。拉伸矩阵用于补偿传感器与镜头之间的对齐误差,而畸变向量则用于调整像平面的 (0,0) 位置。

下式给出了实际畸变坐标(u''、v'')与理想畸变坐标(u、v)之间的关系。

MATLAB 中的鱼眼镜头标定
要消除鱼眼镜头图像中的畸变,可以检测棋盘格标定图案,然后对相机进行标定。您可以使用 detectCheckerboardPoints 和 generateCheckerboardPoints 函数来查找棋盘格上的点。estimateFisheyeParameters 函数使用检测到的点,并返回一个 fisheyeParameters 对象,该对象包含鱼眼镜头相机的内参和外参。您可以使用 fisheyeCalibrationErrors 目标来检查标定的准确性。
校正鱼眼镜头图像以消除镜头畸变
通过检测棋盘格标定图案并对相机进行标定,消除鱼眼镜头图像中的畸变。然后,显示结果。
收集一组棋盘格标定图像。
images = imageDatastore('calibrationImages');从图像中检测标定图案。'PartialDetections' 名称-值参量默认设置为 true,从而允许检测不完整的棋盘格图案。
[imagePoints,patternDims] = detectCheckerboardPoints(images.Files, 'HighDistortion', true);生成棋盘格各角点的世界坐标。
squareSize = 20; % millimeters worldPoints = patternWorldPoints('checkerboard',patternDims,squareSize);
根据图像和世界坐标点,估算鱼眼镜头标定参数。使用第一个图像获取图像尺寸。
I = readimage(images,10); imageSize = [size(I,1) size(I,2)]; params = estimateFisheyeParameters(imagePoints,worldPoints,imageSize);
对第一个图像 I 进行镜头畸变校正,并显示结果。
J1 = undistortFisheyeImage(I,params.Intrinsics); figure imshowpair(I,J1,'montage') title('Original Image (left) vs. Corrected Image (right)')

J2 = undistortFisheyeImage(I,params.Intrinsics,'OutputView','same', 'ScaleFactor', 0.2); figure imshow(J2) title('Output View with low Scale Factor')

参考
[1] Scaramuzza, D., A. Martinelli, and R. Siegwart. "A Toolbox for Easily Calibrating Omnidirectional Cameras." Proceedings to IEEE International Conference on Intelligent Robots and Systems, (IROS). Beijing, China, October 7–15, 2006.
[2] Juho Kannala and Sami Brandt. A generic camera model and calibration method for conventional, wide-angle, and fish-eye lenses. IEEE transactions on pattern analysis and machine intelligence, 28:1335–40, 09 2006.
另请参阅
函数
对象
fisheyeCalibrationErrors|fisheyeIntrinsics|fisheyeIntrinsicsEstimationErrors|fisheyeParameters
主题
- Configure Monocular Fisheye Camera (Automated Driving Toolbox)
- Calibrate a Monocular Camera (Automated Driving Toolbox)
- 基于两个视图的运动重建
- 多视图运动重建
- Configure Monocular Fisheye Camera (Automated Driving Toolbox)