此页面由 AI 自动翻译。查看英文原版

本页目录

  • 关于相机校准
  • 内参
  • 外参
  • 校准过程
  • 畸变模型
  • 立体相机重新校准
  • 先决条件
  • 校准
  • 测试深度
  • 故障排除
  • ToF 重新校准
  • 校准流程

手动校准

关于相机校准

相机校准是确定相机内参、外参和畸变参数的过程。这些参数能够将 3D 点精确映射到 2D 传感器,并有助于校正镜头畸变。

内参

内参定义了相机的内部特性:
  • 焦距 (fx, fy): 设置视场。焦距越长,视场越窄;焦距越短,视场越宽。
  • 光心 (cx, cy): 光轴与传感器相交的光学主点。轻微的偏移(约 20 像素)是可以接受的。这通常是由于镜头与传感器之间存在微小的对齐差异,例如轻微的位移或倾斜。正确的校准可以补偿这些偏移,使其不影响相机的精度或性能。
  • 畸变系数: 用于校正镜头缺陷:
    • 径向畸变 (k1, k2, k3, k4, k5, k6): 校正桶形或枕形畸变。
    • 切向畸变 (p1, p2): 补偿镜头与传感器之间的不对齐。
    • 薄棱镜/倾斜畸变 (s1, s2, s3, s4, τx, τy): 解决倾斜问题,尤其是在广角镜头中。

外参

外参描述了相机相对于场景或其他相机的位置方向
  • 旋转: 相机的方向。
  • 平移: 相机相对于参考点的位置
这些参数对于涉及多个相机的应用(如立体视觉)至关重要,因为它们允许每个相机的图像与其他相机对齐。

校准过程

校准是精确确定相机内参和外参的过程。一个稳健的校准程序通常包括:
  1. 基于标记的校准: 使用 Charuco 标记(棋盘格和 Aruco 标记的组合),将其放置在不同的距离和角度,以获得高精度。
  2. 受控环境: 在稳定的环境中进行校准,以覆盖所有相关的姿态和角度。这种方法有助于实现一致且可复现的校准结果。
  3. 特定型号定制: 针对特定相机型号调整校准过程,以提高可靠性。

畸变模型

不同的畸变模型用于校正每种镜头类型的独特畸变。这些模型基于 OpenCV 的畸变模型框架,但可能会针对特定的相机配置进行调整。
  • 标准视场 (NFOV): 使用标准的透视模型来校正径向畸变 (k1, k2, k3, …) 和切向畸变 (p1, p2)。
  • 宽视场 (WFOV): 使用扩展透视模型,该模型最多可以有14 个总畸变参数
    1. 径向畸变: k1, k2, k3, k4, k5, k6
    2. 切向畸变: p1, p2
    3. 薄棱镜: s1, s2, s3, s4
    4. 倾斜参数: τx, τy
    注意: 实际上,我们不会激活所有 14 个参数。对于广角镜头,我们会启用另外两个参数(通常是 τx 和 τy)来处理我们观察到的倾斜。这种扩展透视模型能很好地处理我们的宽视场 (WFOV) 镜头。
  • 鱼眼镜头: 采用专门的模型来处理极端的圆形畸变。我们通常避免使用鱼眼镜头校准,因为 OpenCV 的鱼眼支持不能满足我们的所有需求,而且扩展透视模型已经有效地覆盖了我们的 WFOV 应用。
有关更多详细信息,请参阅 OpenCV 关于相机校准和畸变模型的文档

立体相机重新校准

使用 相机校准部分中描述的内参外参畸变参数,立体校准将两个相机相互对齐。根据这些参数,系统会计算校正矩阵,使 StereoDepth 节点能够生成准确的立体视差和深度估计。下面的视频将引导您完成校准步骤。有关校准选项的更多详细信息,请参阅下面的各部分,并运行 ./calibrate.py --help 来打印所有可用的校准选项。

先决条件

如果您尚未在计算机上获取 depthai 存储库,则需要克隆它并安装要求:
Command Line
1git clone https://github.com/luxonis/depthai.git --branch main
2cd depthai
3git submodule update --init --recursive
4python3 install_requirements.py

准备 Charuco 板

我们建议在电视或大型平面显示器上显示 Charuco 板。屏幕越大越好,因为它可以让图像中显示更多 Charuco 标记,这通常可以提高校准精度。根据屏幕尺寸,我们建议全屏显示以下 Charuco 板:如果您有其他尺寸的屏幕,请向下取整到最接近的尺寸。

显示 Charuco 板

显示 Charuco 板时,标记和方块应清晰可见。请注意:
  • 避免屏幕过亮或过暗。
  • 避免屏幕上出现直射的强光或阳光。
  • 全屏显示 Charuco 板。
square-size
请注意显示在 Charuco 板上的方块大小。这是校准脚本的 SQUARE_SIZE_IN_CM 参数。
square-size

校准

请为您的设备选择合适的校准程序:

紧凑型设备

运行校准脚本

将占位符参数值替换为有效条目:
Command Line
1python3 calibrate.py -s [SQUARE_SIZE_IN_CM] --board [BOARD] -nx [squaresX] -ny [squaresY]
例如,校准 32" 屏幕上的 OAK-D S2:
Command Line
1python3 calibrate.py -s 3.76 --board OAK-D-S2 -nx 17 -ny 9

模块化设备

准备板配置文件

模块化设备(OAK-FFC-4P、3P、6P)需要自定义板配置文件,该文件描述了您设备的相机配置。使用 depthai 存储库中 boards 目录下的一个板 .json 文件作为自定义板配置的模板。在板配置文件中,我们定义了相机、它们的插槽以及它们相对于其他相机的位置。每个相机应包含以下信息:
特征详细信息
相机板插槽在板 PCB 上定义(例如,CAM_ACAM_BCAM_CCAM_D...)
相机模块的 HFOV硬件目录
相机类型彩色/单色
相机外参平移 [x, y, z] 和旋转 [r, p, y]
OAK-FFC-4P 的示例,带有两个 OV9282 (PY003) 相机,以 14.8cm 的基线进行立体配置,中间有一个 IMX378 (PY052),距离右侧单色相机 5cm:
JSON
1{
2    "board_config": {
3        "name": "Custom FFC",
4        "revision": "R1M0E1",
5        "cameras": {
6            "CAM_C": {
7                "name": "right",
8                "hfov": 71.86,
9                "type": "mono",
10                "extrinsics": {
11                    "to_cam": "CAM_B",
12                    "specTranslation": {
13                        "x": 14.8,
14                        "y": 0,
15                        "z": 0
16                    },
17                    "rotation": {
18                        "r": 0,
19                        "p": 0,
20                        "y": 0
21                    }
22                }
23            },
24            "CAM_B": {
25                "name": "left",
26                "hfov": 71.86,
27                "type": "mono",
28                "extrinsics": {
29                    "to_cam": "CAM_A",
30                    "specTranslation": {
31                        "x": -9.8,
32                        "y": 0,
33                        "z": 0
34                    },
35                    "rotation": {
36                        "r": 0,
37                        "p": 0,
38                        "y": 0
39                    }
40                }
41            },
42            "CAM_A": {
43                "name": "middle",
44                "hfov": 69,
45                "type": "color"
46            }
47        },
48        "stereo_config": {
49            "left_cam": "CAM_B",
50            "right_cam": "CAM_C"
51        }
52    }
53}
另一个使用 OAK-FFC-4P 的示例,但这次没有彩色相机:
JSON
1{
2    "board_config": {
3        "name": "Custom FFC",
4        "revision": "R1M0E1",
5        "cameras": {
6            "CAM_C": {
7                "name": "right",
8                "hfov": 71.86,
9                "type": "mono",
10                "extrinsics": {
11                    "to_cam": "CAM_B",
12                    "specTranslation": {
13                        "x": 14.8,
14                        "y": 0,
15                        "z": 0
16                    },
17                    "rotation": {
18                        "r": 0,
19                        "p": 0,
20                        "y": 0
21                    }
22                }
23            },
24            "CAM_B": {
25                "name": "left",
26                "hfov": 71.86,
27                "type": "mono"
28            }
29        },
30        "stereo_config": {
31            "left_cam": "CAM_B",
32            "right_cam": "CAM_C"
33        }
34    }
35}

运行校准脚本

设置好板配置文件后,使用 JSON 配置的名称作为板名称来运行校准。
Command Line
1python3 calibrate.py -s [SQUARE_SIZE_IN_CM] -brd OAK-FFC-4P.json -nx [squaresX] -ny [squaresY]
上面测量的 17x9 Charuco 板的示例命令:
Command Line
1python3 calibrate.py -s 3.76 -nx 17 -ny 9 -brd OAK-FFC-4P.json
参数参数别名参数说明
-s--squareSizeCm打印的 charuco 板的测量单位为厘米的方块尺寸
-brd--board相机名称(来自 depthai-boards,不区分大小写),或自定义 .json 板配置文件路径
-nx--squaresXX 方向的方块数量。SquaresX 在 准备 Charuco 板 中指定,具体取决于您的屏幕尺寸。
-ny--squaresYY 方向的方块数量。SquaresY 在 准备 Charuco 板 中指定,具体取决于您的屏幕尺寸。
-cm--cameraMode相机模式,可以是 perspective(默认)或 fisheye
-mdmp--minDetectedMarkersPercent帧中检测到的标记的最小百分比,用于将帧视为有效。默认值为 0.5(50%)。如果您想更严格,可以增加此值,但这可能会导致需要更长时间才能获得足够的有效帧。
-ep--maxEpipolarError像素单位的最大对极误差,用于将帧视为有效。默认值为 0.7。如果您想更严格,可以减小此值。
有关参数和用法示例的完整列表,请运行:
Command Line
1python3 calibrate.py --help

校准期间的相机定位

我们建议从不同角度和距离捕获校准图像,这将有助于校准算法找到最佳校准结果。1. 靠近屏幕:确保校准板几乎覆盖整个视场(FOV)。拍摄 5 张图像以覆盖相机的整个 FOV:
  • 正面视图,校准板位于 FOV 的中心。
  • 在不移动相机的情况下,旋转相机以使相机 FOV 与校准板边缘对齐。拍摄 4 张图像,每张对应屏幕的一个边缘。
2. 靠近屏幕,从侧面:拍摄 4 张或更多张倾斜的校准板图像,覆盖大部分 FOV。将相机移动到屏幕的顶部、底部、左侧和右侧。可以使用不同的距离。3. 中等距离:校准板应覆盖 FOV 的约 40%。拍摄 5 张图像以覆盖相机的整个 FOV:
  • 正面视图,校准板位于 FOV 的中心。
  • 与靠近屏幕的位置类似,旋转相机以使 FOV 与校准板边缘对齐。
4. 远离屏幕:校准板仅覆盖 FOV 的一小部分。总共拍摄 9 张图像以覆盖相机的整个 FOV:
  • 正面视图,校准板位于 FOV 的中心。
  • 拍摄 4 张图像,使相机 FOV 与所有 4 个边缘对齐,类似于近距离和中等距离的位置。
  • 此外,拍摄 4 张图像以与屏幕的角落对齐。
定位

运行处理阶段

捕获图像后,可以通过按 s 键运行校准处理阶段。脚本会显示每张图像的对极线,您应该验证它们是否正确对齐。一旦所有图像都经过检查,如果成功,校准结果将被刷写到设备 EEPROM。 捕获的每张图像都保存在 dataset 文件夹中,因此您无需再次捕获图像即可重新运行校准过程。如果您想在捕获的图像上重新运行校准过程,请使用 -m process 参数:
Command Line
1python3 calibrate.py -s [厘米单位的方块尺寸] --board [板名称] -nx [squaresX] -ny [squaresY] -m process
校准结果存储在 resources/ 文件夹中,可用于后续的测试或调试。您也可以将此本地校准文件加载或刷写到设备。有关更多详细信息,请参阅 校准加载示例

测试深度

要测试深度质量,请按照 OAK Viewer 说明 使用 OAK Viewer。

故障排除

  • 如果校准失败并出现错误:High reprojection error!,通常的原因是板配置错误,通常是由于使用的相机模块的 HFOV 指定不正确。
  • 如果尽管校准成功,但深度仍然不正确,可能是您的左右相机已交换。尝试使用更改后的板配置重新进行校准,或交换相机插入的板插座。

ToF 重新校准

飞行时间(ToF)校准对于将 ToF 传感器与其他系统中的相机对齐至关重要。此过程侧重于获取外部参数,这对于确保不同相机之间的协调运行至关重要。

校准流程

如果您已安装 DepthAI 存储库,请使用以下命令更新它以进行 TOF 校准:
Command Line
1git checkout new_tof_calib
2git submodule update --init --recursive
更新主板后,安装更新的 DepthAI Python 库:
Command Line
1python3 ./install_requirements.py
要开始校准过程,请使用您正在使用的 Charuco 板的相应参数运行 calibrate.py。例如:
Command Line
1python3 calibrate.py -db -nx 12 -ny 9 -c 1 -cd 0 -s 6 -ms 4.7 -brd OAK-D-SR-POE
参数说明:
  • -db:表示默认板,意味着您正在使用 Charuco 标记。
  • -nx:x 方向的 Charuco 标记数量。
  • -ny:y 方向的 Charuco 标记数量。
  • -c:每次显示多边形时拍摄的图片数量(可选)。
  • -cd:拍照前的倒计时秒数(可选)。
  • -s:Charuco 标记周围正方形的大小(厘米)。
  • -ms:标记的大小(厘米)。
  • -brd:设备的板(在此例中为 OAK-D-SR-POE)。
如果您遇到诸如 division by zeroFailed to detect markers in the image dataset/rgb/rgb_p3_10.png 之类的错误,请删除所有摄像头文件夹中检测到 Charuco 板效果不佳的图像,然后再次使用添加了 -m process 参数的相同命令运行。这将仅启动处理阶段,因此您不必重新拍摄板图像。
Command Line
1python3 calibrate.py -db -nx 12 -ny 9 -c 1 -cd 0 -s 6 -ms 4.7 -brd OAK-D-SR-POE -m process