小觅双目摄像头D1000-IR-120/Color模组评测(下)
发布网友
发布时间:2024-10-01 10:55
我来回答
共1个回答
热心网友
时间:2024-10-13 10:46
分析 camera 的参数
每个相机镜头都有不同的参数,因此针对每个镜头都需要做光学标定。首先需要对镜头进行参数建模,分投影模型和畸变模型,投影模型我们选用比较通用的 pinhole 模型,包括焦距,光心。畸变模型我们选用 radtan 模型,包括径向畸变,切向畸变。
Pinhole 模型即针孔相机模型,投影方程及示意图为:
其中 fx , fy 为焦距, cx , cy 为光心, (x,y,z) 为相机坐标系下的 3d 点坐标, (ix,iy) 为图像坐标系下的像素点坐标。
Radtan 模型即 radial-tangential 模型,包括径向畸变参数和切向畸变参数。畸变方程及示意图为:
以上是单个相机镜头的一些标定参数,被称为内参。如果具有多个相机镜头,比如现在广泛使用的双目相机,则还存在相机与相机之间的变换关系,被称为外参,模型及示意图如下:
其中 (x0,y0,z0)’ 和 (x1,y1,z1)’ 分别是每个相机自身坐标系下的同一 3d 点坐标,R 是旋转矩阵,T 是平移向量,R 和 T 被称为外参,表示相机间的相对旋转和相对平移。
相机标定是计算机视觉领域经久不衰的研究方向,一般都是使用非线性的迭代优化方法求迭代解。下面我们将使用两个工具包来标定手上的小觅相机,并与相机本身自带标定参数做对比。
首先是被广泛使用的 opencv 的标定方法. 我们使用了 opencv 自带的 stereo_calib 例子。使用小觅相机采集了 1280*720 分辨率大小(下同)的图像, opencv 默认是使用黑白棋盘格作为标定板,我们使用 A4 纸打印了一个9X6大小的棋盘格,采集了一组17对的双目图像,共三组,用于标定。其中一对图像样例及特征提取结果如下图所示:
基于标定板的标定算法一般是先为待求解参数设置初值,由于标定板上的特征点(如果是黑白棋盘格则是格子角点)分布及坐标已知,则采用 PnP 初始化所有相机的 pose ,然后使用非线性优化方法迭代优化。目标函数则是投影误差方程。
程序优化结束后,利用优化得到的内外参数值,可以得到去畸变及双目校正后的结果图:
图中红色方框为图像有效区域,而绿色直线为双目的对极线。可以看出,左右图中任意一个相同的点,都在同一条水平直线上,即完成了双目校正。我们还可以看到校正后的图像形变比较大,这是因为小觅相机采用的是 FOV 视角比较大比较接近鱼眼的镜头,而 pinhole 投影模型是平面投影模型,因此这样会导致形变比较大。如果 FOV 视角过大,则应该采用鱼眼投影模型比如 omni 模型来建模。
下面我们采用更加专业的标定工具包 Kalibr 来进行双目标定。Kalibr 不仅支持多种相机模型,畸变模型,还支持多相机标定,卷帘相机标定,imu-camera 联合标定。是目前开源工具包中功能较为全面的一个。
Kalibr 也支持多种类型标定板目标,如棋盘格,原点整列,二维码棋盘格,这里我们使用了 kalibr 默认的二维码棋盘格,其中图像样例及特征提取效果图如下,其中左图是角点提取效果, 而右图是二维码中心的提取结果,这种基于区域的特征提取相比基于角点的特征提取的优势是,对运动模糊更加鲁棒:
运行完 kalibr 标定程序后, 会生成一个详细的标定结果报告, 以下是一些标定结果示例:
从图中及标定结果可以看出小觅这款相机基本是平行的,相机间的相对旋转非常小。而我们得到重投影误差比较大,这一般与采集数据的过程,及标定板的精密程度非常相关。
在使用两种工具包的多组数据进行了标定之后,我们同时使用小觅相机的 api 获取了相机出厂自带的内外参,与我们自身标定的结果对比,我们使用 kalibr 标定了 5 组数据,使用 opencv 标定了 3 组数据,主要对比三类参数,camera0 的内参, camera1 的内参,camera1 相对 camera0 的外参:
由于 opencv 中的相机内参没有径向畸变参数,我们将其设置为 0 , 从表中数据可以看出,不同 kalibr 数据组之间的一致性比较好,与小觅出厂数据也较为接近。 但是与 opencv 的标定结果相差较大。
分析 imu-camera 联合标定
Kalibr 最大的优势在于可以实现 imu 和 camera 的联合标定,相比 visual-odometry , visual-internal-odometry 具有尺度可知,重力方向可知,旋转预测精确等许多优势,因此在 camera 系统中加入 imu 是许多 slam 系统的选择,但是 imu 和 camera 之间相对关系的标定还是一个相对复杂的问题。而 Kalibr 将这个问题纳入了工具包,提供了标定的算法。
Kalibr 做 imu-camera 联合标定的前提是提供 camera 标定参数, 及 imu 是已经校正好的 (kalibr 也提供更复杂的算法联合标定时同时标定 imu 的 scale 和 misalignment , 但本文不考虑这个问题) 。因此我们在对手中的小觅相机做联合标定时, 使用了上一节 kalibr 标出的相机内外参作为固定参数, 在采集 imu 的时候还设定了 PROC_IMU_ALL 模式,即同时校正了温漂问题和 scale/misalignment 问题。
Kalibr 做 imu-camera 联合标定的框架与camera标定的框架基本一致。需要标定 imu 与camera 的相对旋转和平移。但与 camera 标定最大的不同是,camera 标定是静态的标定,而 imu 数据是时序相关的,每个数据都带一个时间戳,即动态标定。camera 产生的图像数据的时间戳与 imu 产生的 gyro/acc 数据的时间戳并不一定完全同步,所以涉及到不同硬件的时间戳同步问题。因此 Kalibr 还将 camera 与 imu 之间时间戳的延时加入了优化参数中。
参照 Kalibr 的文档,我们同样采集了 5 组数据用于标定,在数据采集过程中需要注意的主要有两点,一是需要经量激励加速度计的各个轴,因此只有 imu 产生足够的数据变化,一些参数才能变得可观,即可优化。二是需要提高外部环境光强度,降低快门和曝光时间,因为需要运动,如果曝光时间长,则图像会产生运动模糊,会影响特征提取的精度。下图是运行 kalibr 动态标定的重投影误差结果示意图:
从上图可知,结果有一些误差比较大的 outlier 点,这可能会影响标定的效果。
在和小觅的技术同学沟通后,小觅的技术也进行了 Kalibr 标定,从重投影误差看,标定的结果还可以,outlier 较少。
标定的结果有很多影响因素,这个问题,还可以进一步深挖。
小觅的技术标定结果如下图:
我们使用 api 从小觅相机中读出出厂标定的结果,与我们 kalibr 的标定结果做对比,数据如下:
从表中可以看出,在 imu 与 camera 的相对平移值上,我们的标定结果与出厂数据差别较大,达到厘米级,但是 kalibr 结果本身的分布是相对一致的。
小觅双目摄像头D1000-IR-120/Color模组评测(下)
可以看出,左右图中任意一个相同的点,都在同一条水平直线上,即完成了双目校正。我们还可以看到校正后的图像形变比较大,这是因为小觅相机采用的是 FOV 视角比较大比较接近鱼眼的镜头,而 pinhole 投影模型是平面投影模型,因此这样会导致形变比较大。如果 FOV 视角过大,则应该采用鱼眼投影模型比如 omni...