OAK相机的标定流程更新与优化通知
全屏显示charuco板时,标记和方块应清晰可见。应注意以下几点:
- 屏幕不应太亮(或太暗),因为它会导致图像过度饱和,这将使相机更难检测到标记。
- 不要让明亮的灯光/阳光直接照射在屏幕上。
- 全屏显示charuco板,使标记尽可能大。
- 在Nvidia等高端显卡上用户可能会被允许调整显示器呈现的色彩空间、色彩格式、色彩增强等进阶设定,可能会导致计算机视觉中的校准板颜色与物理世界的有些许差异,影响校准结果。
标定OAK相机是为校准相机的畸变和失真数据,找到2D像素坐标和3D世界坐标之间的对应换算关系。从而进行立体视差计算,得到深度图。如果小伙伴们发现oak相机的深度精度,或者xy坐标的精度不够高,点云效果不够好,可以自行重新标定,标定方法也非常的简单
PS:OAK有过一次校准算法更新,如您使用的是较早前购买的产品我们建议根据下文重新校准获得更好的精度体验。
目前支持的校准程序:
- 深度校准
- ToF校准
如果你用的是非ToF款相机,请只看“深度校准”这一部分即可。
▌深度校准
相机校准是确定相机的固有、外在和畸变参数的过程。相机需要这些才能将 3D 世界中的点映射到图像中的 2D 点,反之亦然,以消除图像失真,并从立体图像中确定深度。
根据这些参数,相机还计算出用于校正(对齐)立体相机的图像的校正矩阵,因此 StereoDepth 节点可以执行立体视差计算和深度估计。
注意!所有带外壳的OAK相机在出厂时会进行校准,出厂校准算法中有一个Threshold允许写入的阈值,一般不会设定得太严苛,若您对校准的精度不满意,可以选择重新/多次校准,以获得更好的体验。 分体式OAK-FFC系列的产品,在完成安装后,必须做校准。 |
以下是一个校准步骤的演示视频,有关校准的更多信息查看以下步骤以及 ./calibrate.py --help
将打印出所有校准选项的步骤。
须知
你的电脑需要安装depthai,可通过以下方式安装,如果已经安装了我们的depthai的百度云盘安装程序,可以在depthai目录下找到calibratie.py文件,这是可以直接运行的标定文件。
git clone https://github.com/luxonis/depthai.git
cd depthai
git submodule update --init --recursive
python3 install_requirements.py
准备charuco标定板
我们强烈推荐使用实体校准板以减少将校准版由屏幕显示时,出现的反光、偏光、色差等问题,使得点阵拍摄不完全而导致可能发生的较大error的结果,从而影响精度。若您没有实体校准版:
我们可以通过将 charuco 板显示在电视或大型(平面,非曲面)显示器上找到了最佳效果。屏幕越大越好,因为它们允许在图像中显示更多的字符标记,这通常会提高校准精度。根据屏幕尺寸(对角线,以英寸为单位),我们建议全屏显示以下charuco板:
- 24寸屏幕:charuco_24inch_13x7
- 28寸屏幕:charuco_28inch_15x8
- 32寸屏幕:charuco_24inch_17x9
- 36寸屏幕:charuco_36inch_19x11
- 42寸屏幕:charuco_42inch_22x12
- 50寸屏幕:charuco_24inch_27x15
- 55寸屏幕:charuco_55inch_30x17
- 65寸屏幕:charuco_65inch_35x20
- 75寸屏幕:charuco_75inch_41x23
如果您用的是其他尺寸的屏幕,建议选比屏幕稍小的charuco板。
如果无法在显示器上显示charuco板,亦手边没有标准的实体校准板,您可以将校准板打印到平坦的表面上(如PVC板货KT板),确保没有褶皱或凹凸。你也可以将其打印到一张纸上并将其粘在坚固、平坦的表面上。注意,材质不可以反光!
当然,我们更推荐的方式是打印在KT板上,就像我们视频中用的那种。 |
屏显charuco板
全屏显示charuco板时,标记和方块应清晰可见。应注意以下几点:
- 屏幕不应太亮(或太暗),因为它会导致图像过度饱和,这将使相机更难检测到标记。
- 不要让明亮的灯光/阳光直接照射在屏幕上。
- 全屏显示charuco板,使标记尽可能大。
- 在Nvidia等高端显卡上用户可能会被允许调整显示器呈现的色彩空间、色彩格式、色彩增强等进阶设定,可能会导致计算机视觉中的校准板颜色与物理世界的有些许差异,影响校准结果。
接下来测量 charuco 板的正方形尺寸,因为我们稍后会用到它。我们推荐使用游标卡尺完成精准的测量。
配置json文件
如果你用的是带外壳的OAK相机,则可以直接用现成的配置,请找到您对应的产品型号直接下载配置文件。(查看)
如果你用的是一个分体式OAK-FFC相机,则可以用这个模板去配置json文件,修改一些参数数值。参数解释看下图。
我们要在json文件中关注的几个点事:
hfov: 确定你选择的相机镜头的fov度数,如果无法获得,可以用相机拍摄水平放置的尺子,当尺子在相机中占满水平画面的时候,测量占满画面部分尺子的宽度,和镜头距离尺寸的垂直距离,从而通过三角函数,得到真实的镜头的hfov。这里需要注意的是,我们目前出厂的标准角度的oak-d系列相机left和right相机的hfov为80°,不再是71.86°
X:为相机到相机的水平距离,单位是厘米。
E:\DOWNLOAD\calibrate_json-main\calibrate_json-main\OAK-D-LITE AF&FF.json
Y:为相机到相机之间的垂直高度差,如果三个相机水平摆放,那高度差为0,
r,p,y为相机安装时围绕坐标系三个轴的旋转角,oak-d-s2相机没有旋转
运行校准脚本
将占位符参数值替换为有效条目:
python3 calibrate.py -s [SQUARE_SIZE_IN_CM]
-ms [MARKER_SIZE]
--board [BOARD] -nx [squaresX] -ny [squaresY]
例如,在8*11的棋盘格上校准OAK-D-S2,全黑色正方形尺寸为2.5cm,二维码尺寸为1.8cm 标定板的水平棋盘格数11,垂直8,选择json文件为OAK-D-S2,linux用户应该运行如下命令:
python3 calibrate.py -s
2.5 -ms 1.8
--board OAK-D-S2 -nx
11
-ny
8
Windows用户运行如下命令(windows 的python命令不需要加python3的版本说明):
python calibrate.py -s
2.5 -ms 1.8
--board OAK-D-S2 -nx
11
-ny
8
如果没有RGB镜头,可以加-drgb,linux如下:
Python
3
calibrate.py -s
2.5 -ms 1.8
--board OAK-D-S2 -nx
11
-ny
8 -drgb
Windows用户如下:
python calibrate.py -s
2.5 -ms 1.8
--board OAK-D-S2 -nx
11
-ny
8 -drgb
运行python3 calibrate.py --help
可以查看更多参数解释。
校准期间的相机定位
我们建议从不同的角度和距离捕获校准,因为这将有助于校准算法找到最佳校准。
1.靠近屏幕:校准板几乎覆盖了整个视场。拍摄 5 张照片以覆盖相机的整个 FOV。
1)前视图,FOV中间的校准板(参考下图)。
2)在不移动(平移)相机的情况下,只需旋转即可将相机 FOV 与校准板边缘对齐(例如:右下角、左上角、右上角、左下角)
2.靠近屏幕:从侧面。校准板倾斜的 4 张或更多图像,但仍覆盖大部分FOV。将相机移动到屏幕的顶部、底部、左侧和右侧。你也可以使用不同的距离。
3.中距离:校准板覆盖 40% 的 FOV。拍摄 5 张图像以覆盖相机的整个 FOV。
1)前视图,FOV中间的校准板。
2)与 2.靠近屏幕 一样,无需移动,仅通过旋转将相机 FOV 与校准板边缘对齐。
4.远离屏幕:校准板仅覆盖 FOV 的一小部分。总共拍摄 9 张图像以覆盖相机的整个 FOV。
1)正面视图,FOV中间的校准板。
2)与 2.靠近屏幕 类似,拍摄 4 张图像,将相机 FOV 对齐到所有 4 个边缘。
3)除了与所有 4 个边缘对齐外,还要拍摄 4 张与角对齐的图像(例如:顶部、底部、左侧、右侧)。
校准期间不同的相机旋转/位置,鸟瞰图。
例如,28寸屏幕,近距离50CM,远距离1M。
正常视角的OAK相机参考位置图:
广角的OAK相机参考位置图:
运行校准
捕获图像后,我们可以运行校准。这是通过按 s
键完成的。该脚本将显示每个图像的 epiplolar 线条,您应该检查它们是否正确对齐。检查完所有图像后,校准结果(如果成功)将闪烁到器件EEPROM上。每个捕获的图像都保存在 dataset
文件夹中,因此您可以自行重新运行校准过程,而无需再次捕获图像。
Linux用户:
Python
3
calibrate.py -s
2.5 -ms 1.8
--board OAK-D-S2 -nx
11
-ny
8 -m process
Windows用户:
python calibrate.py -s
2.5 -ms 1.8
--board OAK-D-S2 -nx
11
-ny
8 -m process
校准结果存储在 resources 文件夹中,以后可用于测试/调试目的。你还可以将此本地校准文件加载/刷新到设备(详情请参阅此处)。
问题排查
如果校准失败并出现错误: High reprojection error!
,通常的原因是电路板配置错误。很多时候,这是由于使用过的相机模块的指定 HFOV 不正确。目前所有2024年购买的oak-d系列的相机,双目相机的hfov都为80°,不再是72°
如果你发现尽管成功校准了相机并确认了外极线正确左右对齐,但深度仍然不正确,则可能是你的左右相机互换了。在这种情况下,你可以使用更改的电路板配置重试校准,或者直接更换相机插入的电路板插座。
PS:13或39张点阵图拍摄完成后,请不要立即终止程序,按“空格”键可以浏览拍摄过的点阵匹配图。若图中有1条红色连线,则无法达到最佳校准结果,精度偏差会因点阵数量而不同,越少的点阵则误差越大。所以我们强烈建议在对精度要求极高的场景下,使用大型校准板,并确保所有的点阵匹配连线均为绿色!
▌ToF校准
飞行时间(ToF)校准对于将ToF传感器与系统中的其他相机对齐至关重要。此过程侧重于获取外部参数,这对于确保不同相机之间的协调操作至关重要。请注意,此校准不会提高深度精度,因为该方面由设备的固件管理。
校准程序
如果你已经安装了 DepthAI 库,则可以使用以下命令更新它以进行 TOF 校准:
<code>git checkout new_tof_calib</code><code></code>
git submodule update --init --recursive
安装更新的 DepthAI Python 库:
Linux用户:
<code>python3 .\install_requirements.py</code>
Windows用户:
python .\install_requirements.py
要开始校准过程,请使用你正在使用的 Charuco 板的适当参数运行 calibrate.py。例如:
Linux用户:
<code>python3 calibrate.py -db -nx 12 -ny 9 -c 1 -cd 0 -s 6 -ms 4.7 -brd OAK-D-SR-POE</code>
Windows用户:
python 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 标记数。
- -c:每次显示多边形时拍摄的照片数量(可选,建议在你的情况下省略)。
- -cd:拍摄照片前的倒计时时间(以秒为单位)(可选,建议用于更快的图像校准)。
- -s:Charuco 标记周围的正方形大小(以厘米为单位)。
- -ms:标记的大小(以厘米为单位)。
- -brd:设备的板(在本例中为 OAK-D-SR-POE)。
请注意,TOF校准可能具有挑战性,因为电路板必须靠近相机才能检测Charuco电路板。如果遇到 division by zero
或 Failed to detect markers in the image dataset/rgb/rgb_p3_10.png
等错误,则应转到数据集文件夹并删除 Charuco 板检测不佳的图片(在所有相机文件夹中)。然后,使用添加的参数 -m process
再次运行相同的代码。这将仅启动处理阶段,因此你不必重新拍摄电路板的照片。
Linux用户:
python3 calibrate.py -db -nx 12 -ny 9 -c 1 -cd 0 -s 6 -ms 4.7 -brd OAK-D-SR-POE -m process
Windows用户:
python calibrate.py -db -nx 12 -ny 9 -c 1 -cd 0 -s 6 -ms 4.7 -brd OAK-D-SR-POE