
主要功能
- 恢复深度性能 — 使视差图恢复到最佳视觉质量。
- 无需目标 — 在自然场景中运行;只需移动摄像头即可捕捉多样的视图。
- 快速执行 — 通常在几秒钟内完成。
- 健康监控 — 随时运行诊断,无需刷新新校准。
自动校准选项
DynamicCalibration 之上运行自动校准:- 使用 AutoCalibration Host Node 在管道内进行显式节点级控制。
- 使用
DEPTHAI_AUTOCALIBRATION在部署时启用,而无需更改管道代码。 - 使用
Pipeline.setAutoCalibrationMode()的直接设置器来启用自动校准,而无需使用 AutoCalibration Host Node。
从
DepthAI 3.6 开始,自动校准在 ON_START 模式下默认启用。使用 OFF 来禁用它。如果您的管道已包含 DynamicCalibration 节点或 AutoCalibration 节点,则不会应用 AutoCalibrationMode。使用动态校准库 (DCL)
DynamicCalibration 节点进行动态校准工作流进行简单的、高层次的表示。动态校准接收一个 DynamicCalibrationControl 消息作为输入,其中包含一个命令(例如 ApplyCalibration、Calibrate... 有关所有可用命令,请参阅消息定义)。该节点在三个输出队列之一中返回输出:calibrationOutput,消息类型为 DynamicCalibrationResult,qualityOutput,消息类型为 CalibrationQualitycoverageOutput,消息类型为 CoverageDatametricsOutput,消息类型为 CalibrationMetrics
初始化 DynamicCalibration 节点
DynamicCalibration 节点需要来自同一设备的两个同步摄像头流。设置方法如下:Python
1import depthai as dai
2
3# 初始化管道
4pipeline = dai.Pipeline()
5
6# 创建摄像头节点
7cam_left = pipeline.create(dai.node.Camera).build(dai.CameraBoardSocket.CAM_B)
8cam_right = pipeline.create(dai.node.Camera).build(dai.CameraBoardSocket.CAM_C)
9
10# 请求全分辨率 NV12 输出
11left_out = cam_left.requestFullResolutionOutput()
12right_out = cam_right.requestFullResolutionOutput()
13
14# 初始化 DynamicCalibration 节点
15dyn_calib = pipeline.create(dai.node.DynamicCalibration)
16
17# 将摄像头链接到 DynamicCalibration
18left_out.link(dyn_calib.left)
19right_out.link(dyn_calib.right)
20
21device = pipeline.getDefaultDevice()
22calibration = device.readCalibration()
23device.setCalibration(calibration)
24
25pipeline.start()
26while pipeline.isRunning():
27 ...向节点发送命令
inputControl。Python
1# 初始化命令输入队列
2command_input = dyn_calib.inputControl.createInputQueue()
3# 发送命令的示例
4command_input.send(dai.DynamicCalibrationControl.startCalibration())StartCalibration()- 启动校准过程。StopCalibration()- 停止校准过程。Calibrate(force=False)- 基于加载的数据计算新的校准。- force - 对加载的数据没有限制
CalibrationQuality(force=False)- 评估当前校准的质量。- force - 对加载的数据没有限制
LoadImage()- 从设备加载一张图像。ComputeCalibrationMetrics(calibration)- 计算校准指标,如 dataQuality 和 calibrationConfidence。ApplyCalibration(calibration)- 将校准应用于设备。SetPerformanceMode(performanceMode)- 发送将要使用的性能模式。ResetData()- 删除所有先前加载的数据。
从节点接收数据
coverageOutput→ 覆盖率统计信息 (CoverageData)calibrationOutput→ 校准结果 (DynamicCalibrationResult)qualityOutput→ 校准质量检查 (CalibrationQuality)metricsOutput→ 校准统计信息和数据质量 (CalibrationMetrics)
Python
1# 用于接收新校准的队列
2calibration_output = dyn_calib.calibrationOutput.createOutputQueue()
3# 用于接收覆盖率的队列
4coverage_output = dyn_calib.coverageOutput.createOutputQueue()
5# 用于检查校准质量的队列
6quality_output = dyn_calib.qualityOutput.createOutputQueue()
7# 用于检查校准指标的队列
8metrics_output = dyn_calib.metricsOutput.createOutputQueue()DynamicCalibrationResult、CoverageData、CalibrationQuality 和 CalibrationMetrics 的参考文档,了解输出的确切数据结构。读取覆盖率数据
LoadImage 命令)或在连续校准期间(运行 StartCalibration 命令后)加载图像时,将通过 coverageOutput 接收覆盖率数据。手动加载图像Python
1# 加载单张图像
2command_input.send(dai.DynamicCalibrationControl.loadImage())
3
4# 加载后获取覆盖率
5coverage = coverage_output.get()
6print(f"Coverage = {coverage.meanCoverage}")Python
1command_input.send(dai.DynamicCalibrationControl.startCalibration())
2
3while pipeline.isRunning():
4 # 阻塞读取
5 coverage = coverage_output.get()
6 print(f"Coverage = {coverage.meanCoverage}")
7
8 # 非阻塞读取
9 coverage = coverage_output.tryGet()
10 if coverage:
11 print(f"Coverage = {coverage.meanCoverage}")读取校准数据
dai.DynamicCalibrationControl.startCalibration()— 开始收集数据并尝试校准。dai.DynamicCalibrationControl.calibrate(force=False)— 使用现有加载的数据进行校准(必须提前使用LoadImage命令加载图像,如下例所示)。
Python
1# 加载单张图像
2command_inputsend.(dai.DynamicCalibrationControl.loadImage())
3
4# 发送校准命令
5command_input.send(dai.DynamicCalibrationControl.calibrate(force=False))
6
7# 加载后获取校准数据
8calibration = calibration_output.get()
9print(f"Calibration = {calibration.info}")Python
1# 开始收集数据并尝试校准
2command_input.send(dai.DynamicCalibrationControl.startCalibration())
3
4while pipeline.isRunning():
5 # 阻塞读取
6 calibration = calibration_output.get()
7 print(f"Calibration = {calibration.info}")
8
9 # 非阻塞读取
10 calibration = calibration_output.tryGet()
11 if calibration:
12 print(f"Calibration = {calibration.info}")性能模式
Python
1# 设置性能模式
2dynCalibInputControl.send(dai.DynamicCalibrationControl.setPerformanceMode(dai.node.DynamicCalibration.OPTIMIZE_PERFORMANCE))Python
1dai.node.DynamicCalibration.PerformanceMode.OPTIMIZE_PERFORMANCE # 最严格的模式
2dai.node.DynamicCalibration.PerformanceMode.DEFAULT # 不那么严格,但通常足够
3dai.node.DynamicCalibration.PerformanceMode.OPTIMIZE_SPEED # 优化速度而非性能
4dai.node.DynamicCalibration.PerformanceMode.STATIC_SCENERY # 不严格
5dai.node.DynamicCalibration.PerformanceMode.SKIP_CHECKS # 跳过所有内部检查示例
动态校准交互式可视化工具
使用以下命令,您可以克隆并运行校准集成。
Command Line
1git clone https://github.com/luxonis/depthai-core.git
2cd depthai-core/
3python3 -m venv venv
4source venv/bin/activate
5python3 examples/python/install_requirements.py
6python3 examples/python/DynamicCalibration/calibration_integration.py动态校准无法完全恢复出厂指定的绝对深度精度。请使用工厂工具进行生产级重新校准。
场景指南
- 包含不同深度的纹理对象。
- 避免空白墙壁或无特征的表面。
- 缓慢移动相机以覆盖整个视场;避免突然的动作。
| 建议 | 原始图像 vs. 特征覆盖(绿色部分) |
|---|---|
| ✅确保丰富的纹理和视觉细节 - 丰富的纹理、边缘和均匀分布在整个视场中的对象可创建理想的校准条件 | ![]() |
| 🚫避免平坦或无特征的表面 - 缺乏纹理表面或视觉上可区分的对象提供的可用特征很少 | ![]() |
| 🚫避免反光和透明表面 - 反光和透明表面会产生错误的 3D 特征 | ![]() |
| 🚫避免黑暗场景 - 低对比度、阴影和光线不足的场景产生的可检测特征很少 | ![]() |
| 🚫避免重复图案 - 许多图案区域看起来太相似而无法区分 | ![]() |
PerformanceMode 调优
| 模式 | 何时使用 |
|---|---|
DEFAULT | 准确性与速度的平衡。 |
STATIC_SCENERY | 相机固定,场景稳定。 |
OPTIMIZE_SPEED | 最快的校准,精度降低。 |
OPTIMIZE_PERFORMANCE | 在特征丰富的场景中实现最大精度。 |
SKIP_CHECKS | 自动化流水线,忽略内部检查以保证场景质量。 |
为了获得最高精度,请将 OPTIMIZE_PERFORMANCE 与动态、功能丰富的环境相结合。
限制和注意事项
- 支持的设备 — 动态校准适用于:
- 所有立体 OAK Series 2 相机(不包括 FFC)
- 所有立体 OAK Series 4 相机
- DepthAI 版本 — 需要 DepthAI 3.0 或更高版本。
- 重新校准的参数 — 仅更新**外参;**内参保持不变。
- 操作系统支持 — 支持 Linux、MacOS 和 Windows。
- 绝对深度 规格 — DCL 改进了相对深度感知;绝对精度可能仍与原始出厂规格略有不同。
故障排除
| 症状 | 可能的原因 | 修复方法 |
|---|---|---|
| 重投影误差高 | 板配置文件中的模型名称或 HFOV 不正确 | 验证板 JSON 和相机规格 |
| DCL “成功”后深度仍然不正确 | 左右相机颠倒 | 交换插槽或更新板配置并重新校准 |
nullopt 质量报告 | 场景覆盖不足 | 将相机移至能捕捉更丰富纹理的位置 |
| 运行时错误:“设备上的校准太旧,无法执行动态校准,需要完全重新校准!” | 设备校准太旧,动态重新校准无法提供任何优势。 | 需要新设备 |
另请参阅
- 通用动态校准信息页面
- 手动立体和 ToF 校准指南
- 如果您希望进行自动校准操作,请查看 AutoCalibration 文档页面。




