Aruco总结

常见Aruco标定图片,但其原理及含义未作深入了解,今天看到就总结学习下。

0 设计ArUco目的

姿态估计在许多计算机视觉应用中非常重要:机器人导航、增强现实等等。此过程基于查找真实环境中的点与其 2D 图像投影之间的对应关系。这通常是一个困难的步骤,因此通常使用合成或基准标记来使其更容易。
最流行的方法之一是使用二进制平面基准标记。这些标记的主要优点是单个标记提供足够的对应关系(其四个角)来获得相机姿势。此外,内部二进制编码使它们特别健壮,允许应用错误检测和纠正技术。

ArUco标记是可用于摄像机姿态估计的二进制方形基准标记。它的主要优点是检测简单、快速,并且具有很强的鲁棒性。ArUco 标记是由宽黑色边框和确定其标识符(id)的内部二进制矩阵组成的正方形标记。ArUco标记的黑色边框有助于其在图像中的快速检测,内部二进制编码用于识别标记和提供错误检测和纠正。ArUco标记尺寸的大小决定内部矩阵的大小,例如尺寸为 4x4 的标记由 16 位二进制数组成。

通俗地说,ArUco 标记其实就是一种编码,就和我们日常生活中的二维码是相似的,只不过由于编码方式的不同,导致它们存储信息的方式、容量等等有所差异,所以在应用层次上也会有所不同。由于单个ArUco 标记就可以提供足够的对应关系,例如有四个明显的角点及内部的二进制编码,所以ArUco 标记被广泛用来增加从二维世界映射到三维世界时的信息量,便于发现二维世界与三维世界之间的投影关系,从而实现姿态估计、相机矫正等等应用。
在这里插入图片描述

1 ArUco标记识别与检测原理

必须注意的是,可以在环境中发现旋转的标记,但是,检测过程需要能够确定其原始旋转,以便明确识别每个角。这也是基于二进制编码完成的。

标记字典是在特定应用程序中考虑的标记集。它只是其每个标记的二进制编码列表。

字典的主要属性是字典大小和标记大小。字典大小是组成字典的标记数。标记大小是这些标记的大小(位数)。

可能会认为标记id是通过将二进制编码转换为十进制基数获得的数字。但是,这是不可能的,因为对于高标记大小,位数太高,并且管理如此巨大的数字是不切实际的。相反,标记 ID 只是它所属的字典中的标记索引。例如,字典中的前5个标记具有 id:0、1、2、3 和 4。

2 OpenCV与ArUco

参考1OpenCV文档-检测 ArUco 标记物
参考2OpenCV4学习笔记(72)——ArUco模块之aruco标记的创建与检测

ArUco模块是包含在OpenCV的contrib拓展库中的,需要自行下载OpenCV基础库和contrib拓展库进行联合编译才可以使用。(编译的时候选择AVX2指令集,相比起OpenCV默认的SSE3指令集有一定程度的优化,当然这个需要个人的电脑CPU支持才可以)
OpenCV中的aruco模块基于ArUco库,这是一个流行的库,用于检测由Rafael Muñoz和Sergio Garrido [89]开发的方形基准标记,包括了对aruco标记的创建和检测,以及将aruco标记用于姿势估计和相机矫正等应用的相关API,同时还提供了标记板等等。

2.1 ArUco的创建

首先我们创建aruco标记时,需要先指定一个字典,这个字典表示的是创建出来的aruco标记具有怎样的尺寸、怎样的编码等等内容。
通过在 aruco 模块中选择预定义的字典之一来创建对象。具体来说,此字典由250个标记和6x6位的标记大小(Dictionarycv::aruco::DICT_6X6_250)组成。
generateImageMarker的参数含义如下:
(1)创建的Dictionary对象;
(2)参数id:标记id,表示绘制字典中的哪一个aruco标记。每个字典由不同数量的标记组成,id有效范围是 [ 0,字典包含的标记数 )(如cv::aruco::DICT_6X6_250,有效 ID 从 0 变为 249),任何超出有效范围的特定 id 都会产生异常。
(3)参数 200 是输出标记图像的大小。在这种情况下,输出图像的大小为 200x200 像素。请注意,此参数应足够大,以存储特定字典的位数。因此,例如,您不能为 5x5 位的标记大小生成 6x6 像素的图像(并且不考虑标记边界)。此外,为避免变形,此参数应与位数 + 边框大小成正比,或者至少远高于标记大小(如示例中的 200),以便变形微不足道。
(4)参数是输出图像。
(5)参数是可选参数,用于指定标记黑色边框的宽度。大小与位数成比例指定。例如,值 2 表示边框的宽度将相当于两个内部位的大小。默认值为 1。

cv::Mat markerImage;
cv::aruco::Dictionary dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
cv::aruco::generateImageMarker(dictionary, 23, 200, markerImage, 1);
cv::imwrite("marker23.png", markerImage);

完整的工作示例包含在 .create_marker.cppmodules/aruco/samples/

2.2 ArUco的检测

给定包含ArUco标记的图像,检测过程必须返回检测到的标记列表。每个检测到的标记包括:其四个角在图像中的位置(按其原始顺序)和标记的 ID。
标记检测过程由两个主要步骤组成:
1.检测候选标记物。在此步骤中,对图像进行分析,以找到候选作为标记的正方形。它从自适应阈值开始以分割标记,然后从阈值图像中提取轮廓,并丢弃那些不凸或不近似为正方形的轮廓。还会应用一些额外的过滤(删除太小或太大的轮廓,删除彼此太近的轮廓等)。
2.候选检测后,有必要通过分析其内部编码来确定它们是否实际上是标记。此步骤首先提取每个标记的标记位。为此,首先应用透视转换以获取其规范形式的标记。然后,使用 Otsu 对规范图像进行阈值设置阈值,以分隔白色和黑色位。图像根据标记大小和边框大小分为不同的单元格。然后计算每个单元格中的黑像素或白像素数,以确定它是白色还是黑色位。最后,分析位以确定标记是否属于特定字典。必要时采用纠错技术。

//待续

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周陽讀書

周陽也想繼往聖之絕學呀~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值