无论是aruco还是apriltag二维码标定板检测的思路是提取一块四边形的区域,这个区域具有比周围亮度更低的特点。这个思路的主要优点是尽可能多的检测出所有可能的二维码,但是根据采集数据的环境极有可能出现异常线段,然后再根据二维码的编码值可以对野值进行剔除实现识别与定位。
ArUco
ArUco是一个开源的小型的AR虚拟现实增强库,已经集成在OpenCV3.0以上的版本,它除了用于现实增强,还很用于实现一些机器视觉方面的应用。
ArUco下载地址:https://sourceforge.net/projects/aruco/files/
ArUco开源库的几个特点如下:
1.基于C ;
2.仅依赖于OpenCV(≥2.4.9)和Eigen3;
3.BDS开源。
一个ArUco标记外围都有一组黑色边框,同时内部有着确定该标记ID的二维矩阵组合而成。黑色的边框能加速标记在图像中的检测速度,内部的二维编码能唯一识别该标记,同时进行错误检测和错误修复。标记的大小确定了内部矩阵的大小,例如4x4大小的标记有16个bit
aruco标志在环境中通常存在旋转,然而,检测的过程需要确定旋转的初始方向,因此,每一个角点在二维编码的过程中就会被唯一确定。
标记字典是一组被用来进行特殊应用的标记,它大大简化了每个marker二维码列表。字典的主要属性就是字典的大小和标志的大小:
字典大小:合成字典的marker的数量 (50 100 250 1000)
标志大小:marker的大小(bits 16 25 49 ...)
aruco模块中包含了一些已经预先定义好不同大小和数量的字典集
Aruco标记物生成
在检测之前,往往我们需要打印一些marker放到我们的环境中。Marker图案我们能通过drawMarker函数产生:
Aruco标记物检测
在包含ArUco标志的图片中,检测过程通常能返回被检测到的marker序列。每一个检测的Marker结果包括:
- marker四个角点在图片中的位置
- marker的id
Marker检测过程主要有两个步骤:
- 检测Marker的候选区域。
- 通过分析二维码确定marker
在opencv的ArUco模块中,主要通过detectMarkers()函数来完成,这个函数是整个模块中最重要的函数了,因为后续的函数处理几乎都依赖于该函数的检测结果。
位姿估计
当获取得到Marker的识别结果之后,就是确定相机姿态了。为了确定相机姿态,首先得知道相机的标定参数,内参和畸变。在估计每个ArUco标记的时候,我们能单独估计每个marker。如果你希望能从一系列的marker中估计一个pose,此时就需要ArUco Boards.
相机相对于marker的姿态是一个3d的旋转,从marker坐标系到camera坐标系。这个通过一个旋转和一个平移向量和描述。
标记坐标系统是假设z轴是朝外的,x是朝右边,y朝前进方向。标志角点在左上角点。
该库主要的类主要有:
aruco::Marker----视觉标志类;
aruco::MarkerDetector----视觉标志检测类;
aruco::MarkerPoseTracker----视觉标志姿态预估类;
aruco::MarkerMap-----视觉标志地图类;
aruco::MarkerMapPoseTracker----视觉标志地图姿态预估类;
aruco::CvDrawingUtils----绘图类;
注意:
aruco中的字典比如DICT_4X4_50是什么意思?
每个字典式表示位数和包含的标记数 标准的标记5×5位,0最小距离,4*4位表示marker标记要被划分的位数,边界为1比特位,所以4×4的marker识别时候会被分割为6×6的格子,最后面的数字表示字典里包含marker的个数,比如50个。
AprilTag
AprilTag是一个视觉基准系统,可用于各种任务,包括增强现实、机器人和摄像机校准。AprilTag检测可以计算标定板相对于相机的精确三维位置、方向和id。AprilTag库是用C实现的,没有外部依赖关系。该库可以很容易地包含在其他应用程序中,也可以移植到嵌入式设备上。即使在手机级处理器上也可以实现实时性能。
AprilTag的地址:
https://github.com/AprilRobotics/apriltag
AprilTag开源库的几个特点如下:
1.基于C;
2.不依赖其他第三方库;
3.BDS开源。
AprilTags在概念上类似于QR码,因为它们是一种二维条形码。然而,它们被设计成编码更小的数据有效载荷(4到12位之间),允许它们更可靠地被检测到,并且可以从更长的范围内被检测到。此外,他们是为高定位精度设计的,用户可以计算精确的AprilTag相对于相机三维位置。
所以一般AprilTag用于机器人领域比较多。
AprilTag的种类
AprilTag的种类叫家族(family),有下面的几种:
TAG16H5 → 0 to 29
TAG25H7 → 0 to 241
TAG25H9 → 0 to 34
TAG36H10 → 0 to 2319
TAG36H11 → 0 to 586
ARTOOLKIT → 0 to 511
也就是说TAG16H5的家族(family)有30个,每一个都有对应的id,从0~29。
相关的论文
AprilTag: A robust and flexible visual fiducial system, ICRA 2011;
AprilTag 2: Efficient and robust fiducial detection, IROS 2016;
One useful application of AprilTags is camera calibration (AprilCal: Assisted and repeatable camera calibration, IROS 2013).
两者优劣比较
Aruco(在OpenCV中实现)
优点
- 易于设置(使用现成的aruco标记生成器、opencv和ros实现等)
- 更少的错误检测(使用默认参数)
缺点
- 较新版本的aruco是GPL许可的,因此opencv在aruco还是BSD的时候仍然停留在旧的实现上。
- 更容易在中长距离旋转模糊
- 更多适配参数
- 计算量更大
AprilTag(在AprilTag ros中实现)
优点
- 更少的适配参数
- 即使在远距离也能很好地工作
- 美国宇航局使用
- 更灵活的标记设计(例如,标记可以不一定是正方形)
- 计算量较少
缺点
- 不太直接地进行配置和设置(没有opencv实现AFAIK,只有ros实现,获得标记的步骤稍微多一些)
- 更多错误检测(使用默认参数)
接下来本公众号将从opencv的中aruco模块中给的教程从理论到实践进行讲解。敬请期待ing...