
主要功能
- 恢复深度性能——将视差图恢复至最佳视觉质量。
- 无需目标标靶——在自然场景中操作;只需移动相机以捕捉不同视角。
- 快速执行——通常可在数秒内完成。
- 健康监控——随时运行诊断,无需刷写新校准。
自动校准选项
DynamicCalibration 之上运行自动校准:- 使用AutoCalibration 主机节点在管道内进行显式的节点级控制。
- 使用
DEPTHAI_AUTOCALIBRATION在部署时启用,无需更改管道代码。 - 使用
Pipeline.setAutoCalibrationMode()的直接设置器来启用自动校准,无需使用 AutoCalibration 主机节点。
从
DepthAI 3.6 开 始,自动校准在 ON_START 模式下默认启用。使用 OFF 可禁用它。如果您的管道已包含 DynamicCalibration 节点或 AutoCalibration 节点,则 AutoCalibrationMode 不适用。动态校准库(DCL)的使用
DynamicCalibration 节点进行动态校准工作流程的简单高层次表示。动态校准以包含命令的DynamicCalibrationControl消息作为输入(例如 ApplyCalibration、Calibrate……有关所有可用命令,请参阅消息定义)。节点根据发送的输入命令,在以下三个输出队列之一返回输出:calibrationOutput的消息类型为 DynamicCalibrationResultqualityOutput的消息类型为 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 ...向节点发送命令
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)- 计算校 准指标,如数据质量和校准置信度。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 的参考文档,了解输出的具体数据结构。读取覆盖数据
coverageOutput 接收,触发时机包括手动加载图像(使用 LoadImage 命令)或连续校准过程中(运行 StartCalibration 命令后)。手动图像加载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_input.send(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 # 跳过所有内部检查示例
Dynamic Calibration Interactive Visualizer
通过以下命令,您可以克隆并运行标定集成。
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 质量报告 | 场景覆盖不足 | 移动相机以捕获更丰富的纹理 |
运行时错误:"The calibration on the device is too old to perform DynamicCalibration, full re-calibration required!" | 设备标定过于陈旧,动态重新标定无法提供任何好处。 | 需要更新的设备 |
另请参阅
- 通用动态标定信息页面
- 手动立体和ToF标定指南
- 如果您希望自动标定操作,请查看自动标定文档页面。




