教程 -双目校准
学习如何校准(重新校准)DepthAI的双目视差深度.
OAK-D上的双目相机在出厂之间就是校正好的 - 但您可能希望在安装过程中重新校准以获得更好的质量,也有可能在你多次使用处理后校准质量变差需要重新校准。
下面是一个演示如何校正的简单视频,用到了我们的树莓派计算模组版本。
在观看下面的视频之后,您将可以了解到校准您自己的DepthAI所需的步骤。关于校准选项的更多信息/细节,请参见下面的步骤,以及./calibrate.py --help
,它将打印出所有的校准选项。
下载depthai代码库.
error
已经安装了depthai
? 请跳过该步骤
git clone https://github.com/luxonis/depthai.git
cd depthai
打印棋盘校准图像。
要么将校准棋盘格打印到一个平面上,要么将棋盘格显示在一个平面(非曲面的)显示器上。 请注意,如果您打印校准目标,请注意确保它附着在一个平面上,并且是平的,没有皱纹或者起伏。
通常情况下,使用显示器来显示校准目标更快更容易。
请通过合适的缩放来把这个棋盘格铺满整张纸。 而如果在显示器上显示,则以白色背景全屏显示图像。
执行校正脚本
用实际值替代方括号内的参数:
python3 calibrate.py -s [SQUARE_SIZE_IN_CM] -brd [BOARD]
参数参考:
-s SQUARE_SIZE_IN_CM
,--square_size_cm SQUARE_SIZE_IN_CM
: 测量印刷棋盘格的正方形尺寸,单位为厘米。-brd BOARD
,--board BOARD
: BW1097, BW1098OBC - 来自资源/板子/的板子类型(不区分大小写)。或自定义.json板型配置的路径。与[-fv -b -w]互斥,允许手动指定视场、基线和相机方向(交换或不交换)。
通过用尺子或卡尺测量校正目标上方格大小的数值,并输入该数字(以厘米为单位)来代替[SQUARE_SIZE_IN_CM]。
如果方格为2.35厘米宽,1098OBC的参数如下。
python3 calibrate.py -s 2.35 -brd bw1098obc
并且注意,在校准时,镜像显示往往是有用的(这样运动方向就不会显得相反)。 当看到自己的时候,我们习惯看到相反的运动方向(因为我们在镜子里看到的就是这个样子),所以这样做,使用-ih
选项,如下图。
python3 calibrate.py -s 2.35 -brd bw1098obc -ih
因此,当我们在内部运行校准时,我们几乎总是使用-ih
选项,所以我们将在以下所有的示例命令中包含这个选项。
BW1098OBC (USB3板载相机版本/OAK-D)):
python3 calibrate.py -s [SQUARE_SIZE_IN_CM] -brd bw1098obc -ih
BW1098FFC(USB3模块化摄像机版)或BW1094(树莓派HAT):
使用这里的一个板子*.json
文件来定义双目相机之间的基线,以及左边摄像机和彩色摄像机之间的基线,替换下面括号内的项目。
- 左右互换(即摄像机朝向哪个方向,设置为
true
或false
)。 - 左/右灰度相机之间的 ``BASELINE`,单位为厘米。
左
灰度相机和彩色相机之间的距离RGBLEFT
,以厘米为单位。
{
"board_config":
{
"name": "ACME01",
"revision": "V1.2",
"swap_left_and_right_cameras": [true | false],
"left_fov_deg": 71.86,
"rgb_fov_deg": 68.7938,
"left_to_right_distance_cm": [BASELINE],
"left_to_rgb_distance_cm": [RGBLEFT]
}
}
所以,比如说如果你把你的OAK-D的立体基线设置为20cm,彩色摄像机正好在两台灰度摄像机之间,而且摄像机的方向和BW1097一样,使用以下JSON。
{
"board_config":
{
"name": "ACME01",
"revision": "V1.2",
"swap_left_and_right_cameras": true,
"left_fov_deg": 71.86,
"rgb_fov_deg": 68.7938,
"left_to_right_distance_cm": 20,
"left_to_rgb_distance_cm": 10
}
}
然后,用这个板子的名字运行校准。:
python3 calibrate.py -s [SQUARE_SIZE_IN_CM] -brd ACME01 -ih
运行python3 calibrate.py -h
(或-h
)获取完整的参数列表和使用示例。
定位棋盘格并捕捉图像
显示左右两个相机的视频流,每个视频流上都会叠加一个多边形。
举起打印好的棋盘格(或屏幕上显示图像的笔记本电脑),使整个棋盘显示在两个视频流中。
将棋盘叠加的多边形的方向匹配起来,按[空格键]捕捉图像。棋盘图案不需要与多边形完全匹配,更重要的是用多边形来指导棋盘和相机的相对角度和位置。有13个必要的多边形位置。
捕获所有多边形位置的图像后,将开始校准图像处理步骤。如果成功,将在depthai/resources/depthai.calib
处创建一个校准文件。该文件默认通过consts/resource_paths.py
中的calib_fpath
变量加载。
测试深度
我们将查看深度流,以确保相机的校准正确。
- 启动一个终端会话。
- 访问您本地的
depthai
副本。cd [depthai repo]
-
运行
python3 test.py -s depth_raw -o
。
该脚本启动一个窗口,启动相机,并显示深度视频流:在上面的截屏中,手离相机更近.
将校准和板卡参数写入板载eeprom
如果您对上述深度质量感到满意,您可以将其写入DephtAI的板载eeprom中,以便校准与DepthAI保持一致(所有支持立体深度的设计都有用于此目的的板载eeprom)。
要将校准和相关板卡信息写入DepthAI的EEPROM中,请使用以下命令:
python3 test.py -brd [BOARD] -e
其中[BOARD]
是BW1097
(Raspberry Pi计算模块版)、BW1098OBC
(OAK-D)或自定义板卡文件(如这里),都不区分大小写。
例如,要将(更新的)校准和板卡信息写入BW1098OBC,请使用以下命令。
python3 test.py -brd bw1098obc -e
而为了验证你的DepthAI上写到EEPROM的内容,用以下的命令,你可以看到每当运行DetphAI时检查输出。
python3 test.py
并在运行上述命令后,在终端的打印输出中查找EEPROM data
:
EEPROM data: valid (v2)
Board name : BW1098OBC
Board rev : R0M0E0
HFOV L/R : 71.86 deg
HFOV RGB : 68.7938 deg
L-R distance : 7.5 cm
L-RGB distance : 3.75 cm
L/R swapped : yes
L/R crop region: top
Calibration homography:
1.002324, -0.004016, -0.552212,
0.001249, 0.993829, -1.710247,
0.000008, -0.000010, 1.000000,
如果有任何看起来不正确的地方,您可以再次校准或者更改电路板信息,并使用上述-brd
和-e
标志覆盖存储的eeprom信息和校准数据。