ArUco标记检测

OpenCV  3.2.0-dev  http://docs.opencv.org/master/d9/d6d/tutorial_table_of_content_aruco.html

开篇 说明

aruco标记二进制基准标记可用于摄像机位姿估计。他们的主要好处是,他们的检测是强大的,快速和简单。

aruco模块包括这些类型的标记和检测工具使用姿势估计和相机校正。

此外,ChArUco功能结合ArUco标记与传统棋盘,允许一个简单的和通用的角落检测。 模块还包括功能检测ChArUco角落和用于估计和相机校准。

【计算机视觉】 相机姿态估计之标记检测-ArUco标记检测1【计算机视觉】 相机姿态估计之标记检测-ArUco标记检测1

检测ArUco标记

姿态估计是非常重要的在许多计算机视觉应用程序:机器人导航、增强现实,和许多更多。 这个过程是基于找到对应点之间在现实环境和他们的2 d图像投影。 这通常是一个困难的一步,因此通常使用合成或基准标记使它更容易。

最受欢迎的方法是使用二进制广场基准标记。 这些标记的主要好处是一个标记提供了足够的通讯(四角)获得相机的姿势。 同时,内部二进制编纂使他们特别健壮,允许应用错误检测和校正技术的可能性。

aruco模块是基于 ArUco图书馆 ,一个受欢迎的图书馆广场的检测基准标记由拉斐尔•穆尼奥斯和塞尔吉奥·加里多:

s . Garrido-Jurado r . Munoz-Salinas f . j . Madrid-Cuevas和m . j . Marin-Jimenez。 2014年。 “自动生成和检测遮挡下的高度可靠的基准标记”。 模式Recogn。47岁,6(2014年六月),2280 - 2292。 DOI = 10.1016 / j.patcog.2014.01.005

aruco功能包括:

# include < opencv2 / aruco.hpp >

标记和字典

ArUco标记是一种合成广场标志由一个广阔的黑色边框和内部二进制矩阵决定它的标识符(id)。 黑色边境促进其快速检测在图像和二进制编纂允许其识别和错误检测和校正技术的应用。 标记的大小决定了内部矩阵的大小。 例如一个标记的大小4 x4是由16位。

的一些例子ArUco标记:

【计算机视觉】 相机姿态估计之标记检测-ArUco标记检测1
标记图像的例子

必须指出一个标志可以旋转的环境,然而,检测过程需要能够确定原来的旋转,标识明确,以便每个角落。 这也是基于二进制编纂完成的。

字典的标记是一组标记被认为是在一个特定的应用程序。 它仅仅是二进制的法典编纂的列表的每个标记。

的主要属性字典词典的大小,标记大小。

  • 字典大小的标记的数量由字典。
  • 这些标记的标记尺寸大小(比特)的数量。

aruco模块包括一些预定义的字典包括一系列不同的字典大小和标记大小。

有人可能认为标记id是获得将二进制的文件转换为十进制数字。 然而,这是不可能的,因为高标记尺寸太高的比特数和管理大量是不实际的。 相反,标记id只是标记指数在字典它属于。 例如,第一个5内标记字典id:0,1,2,3,4。

更多信息字典中提供了“选择字典”部分。

标记创建

前检测,标记需要印刷为了被放置在环境。 可以使用生成标记图像 drawMarker()函数。

例如,可以分析以下电话:

简历:垫markerImage;
简历:Ptr <简历::aruco::字典>字典=简历::aruco:getPredefinedDictionary(简历::aruco::DICT_6X6_250);
简历:aruco::drawMarker(markerImage字典,23岁,200年,1);

首先, 字典对象是由选择预定义的字典之一aruco模块。 具体地说,这本词典是由250标记和标记的大小6 x6位( DICT_6X6_250)。

的参数 drawMarker是:

  • 第一个参数是 字典以前创建的对象。
  • 第二个参数是标记的id,在这种情况下,标记23的字典 DICT_6X6_250。 注意,每个词典是由不同数量的标记。 在这种情况下,有效的id从0到249。 任何特定的id的有效范围将产生一个异常。
  • 200年,第三个参数是输出标记图像的大小。 在这种情况下,输出图像会有200 x200型像素的大小。 注意,这个参数应该足够大的存储特定的比特数字典。 例如,你不能为标记生成5 x5的图像像素的大小6 x6比特(这是没有考虑到标记边界)。 此外,为了避免变形,这个参数应该是成正比的比特数+边界大小,或者至少远高于标记大小(如200例),所以变形是无关紧要的。
  • 第四个参数是输出图像。
  • 最后,最后一个参数是一个可选参数指定标记黑色边框的宽度。 指定的大小是成正比的比特数。 例如2的值意味着边界将宽度相当于两个内部的大小。 默认值是1。

生成的图像:

【计算机视觉】 相机姿态估计之标记检测-ArUco标记检测1
生成的标记

一个完整的工作包含在示例 create_marker.cpp模块内的样本文件夹。

注意:样品现在通过命令行通过输入 OpenCV命令行解析器 。 这个文件的示例参数

“/用户/ Sarthak / Dropbox / OpenCV_GSoC /标记。 png”- d = 10 id = 1

标记检测

给定一个形象,一些ArUco标记随处可见,检测过程返回检测到标记的列表。 每个检测到的标志包括:

  • 图像的四个角的位置(在原来的订单)。
  • 标记的id。

标记的检测过程由两个主要步骤:

  1. 检测标记的候选人。 在这一步中图像分析为了找到广场形状候选人被标记。 它开始于一个自适应的阈值分割标记,然后从阈值图像轮廓提取和那些不凸或不近似正方形形状被丢弃。 一些额外的过滤也应用(删除太小或太大轮廓,消除轮廓太接近对方,等等)。
  2. 候选人后检测,有必要确定它们是否实际上标记通过分析他们的内心的编纂。 这一步首先提取每一个标记的标志位。 要做到这一点,首先,视角转换应用于获得规范形式的标记。 然后,规范化形象使用大津阈值分离白人和黑人。 图像分割在不同的细胞根据标记大小和边界大小和黑色或白色像素的数量在每个细胞数来确定它是一种白色或黑色。 最后,分析了位确定标记属于特定的字典和纠错技术是必要时使用。

考虑下面的图片:

【计算机视觉】 相机姿态估计之标记检测-ArUco标记检测1
原始图像和标记

这些发现标记(绿色):

【计算机视觉】 相机姿态估计之标记检测-ArUco标记检测1
具有检测到标记的图像

这些标记候选人遭到拒绝在识别步骤(粉红色):

【计算机视觉】 相机姿态估计之标记检测-ArUco标记检测1
图像与拒绝候选人

aruco模块,检测的执行 detectMarkers()函数。 这个函数模块是最重要的,因为所有的其他功能都是基于前面的检测标记返回的 detectMarkers()



探测器参数

的参数之一 detectMarkers()函数是一个 DetectorParameters对象。 这个对象包含所有选项,可以定制标记检测过程中。

在本节中,所有这些参数都评论。 参数可分为根据过程涉及:

阈值

标记检测过程的第一个步骤是一个输入图像的自适应阈值。

例如,阈值图像示例图像上面使用的是:

【计算机视觉】 相机姿态估计之标记检测-ArUco标记检测1
阈值图像

可以定制这个阈值在以下参数:

  • int adaptiveThreshWinSizeMinint adaptiveThreshWinSizeMaxint adaptiveThreshWinSizeStep

的 adaptiveThreshWinSizeMin和 adaptiveThreshWinSizeMax参数代表的区间阈值选择窗口大小(以像素为单位)的自适应阈值(见OpenCV

{阈值()' ' ' }
参数' ' ' adaptiveThreshWinSizeStep ' ' '显示窗口大小上的增量
“‘adaptiveThreshWinSizeMin’‘adaptiveThreshWinSizeMax ' ' '。
例如,对于值' ' ' adaptiveThreshWinSizeMin ' ' ' = 5,adaptiveThreshWinSizeMax ' ' ' = 21
' ' ' adaptiveThreshWinSizeStep ' ' ' = 4,会有5与窗口大小的阈值的步骤5,9、13、17和21。
在每个阈值图像,提取标志候选人。
低价值的窗口大小可以“打破”标记边界标记的尺寸太大,和
它不会被探测到,像以下图片:
! (破碎的形象标志)(图片/ singlemarkersbrokenthresh.png)
而另一方面,过高的值会产生同样的效果如果标记太小,而且它还可以
降低性能。 此外过程全局阈值,失去了自适应的好处。
最简单的例子是使用相同的值' ' ' adaptiveThreshWinSizeMin ' ' '
' ' ' adaptiveThreshWinSizeMax ' ' ',这产生一个单一的阈值的步骤。 然而,它通常是更好的使用
窗口大小范围的值,尽管很多阈值的步骤也可以大大减少性能。
默认值:
' ' ' adaptiveThreshWinSizeMin ' ' ':3,' ' ' adaptiveThreshWinSizeMax ' ' ':23岁' ' ' adaptiveThreshWinSizeStep ' ' ':10
——“‘adaptiveThreshConstan两倍

这个参数代表了不断增值的阈值条件(见OpenCV

{阈值()' ' ' }
默认值:7
# # # #轮廓过滤
阈值后,检测到轮廓。 然而,并非所有的轮廓
是标记的候选人。 他们过滤掉这样的轮廓在不同的步骤
很可能被标记被丢弃。 在本节中定义的参数
这个过滤过程。
必须指出的是,在大多数情况下这是一个平衡的问题检测能力
和性能。 所有考虑的轮廓将在接下来的处理阶段,通常
较高的计算成本。 所以,宁愿抛弃错误的候选人在这一阶段的后期。
另一方面,如果过滤条件过于严格,真正的标记轮廓可以丢弃,
因此,没有检测到。
' ' '双minMarkerPerimeterRate ' ' ',' ' ' maxMarkerPerimeterRat两倍

这些参数确定的最小和最大大小标记,具体的最大和最小周长标志。 他们不是绝对的像素值中指定,而是指定相对于输入图像的最大尺寸。

例如,一个图像大小640 x480和最小相对标记周长为0.05将导致最小标记的周长640 x0.05 = 32像素,自640年以来的最大尺寸的图像。 同样的申请 maxMarkerPerimeterRate参数。

如果 minMarkerPerimeterRate太低,它可以大大处罚以来检测表现更多的轮廓会考虑未来的阶段。 这个处罚是不明显的 maxMarkerPerimeterRate参数,因为通常有许多更小的轮廓比大的轮廓。 一个 minMarkerPerimeterRate值为0, maxMarkerPerimeterRate4(或更多)的价值将相当于考虑所有图像中轮廓,然而这并不是推荐性能的原因。

默认值:

{ minMarkerPerimeterRate ' ' ' }
——“‘polygonalApproxAccuracyRat两倍

多边形近似法应用于每一个候选人,只有那些近似正方形形状被接受。 这个值决定了多边形近似的最大误差会产生(见 approxPolyDP()函数的更多信息)。

这个参数是相对于候选人长度(以像素为单位)。 因此,如果候选人的周长为100像素的值 polygonalApproxAccuracyRate0.04,最大误差是100 x0.04 = 5.4像素。

在大多数情况下,默认值是可以的,但可能需要更高的误差值高扭曲的图像。

默认值:0.05

  • 双minCornerDistanceRate

任何一对角落之间最小距离相同的标记。 它是表示相对于周边标志。 最小距离像素* minCornerDistanceRate周长。

默认值:0.05

  • 双minMarkerDistanceRate

任何一对角落之间最小距离从两个不同的标记。 它是表示相对于最低标记周边的两个标记。 如果两个候选人太近,小的被忽略。

默认值:0.05

  • int minDistanceToBorder

最小距离的任何角落标志图像边界(以像素为单位)。 标记部分闭塞的图像边界可以正确地发现如果闭塞很小。 然而,如果其中一个角落被挡住,返回的角落通常是放置在一个错误的位置的图像边界附近。

如果标记角落的位置是很重要的,例如,如果你想做姿势估计,最好丢弃标记的任何角落太靠近图像边界。 在其他地方,没有必要。

默认值:3

位提取

候选人检测后,每个候选人的信息进行分析以确定它们是否标记。

分析二进制代码本身之前,部分需要提取。 删除,角度变形和由此产生的图像是用大津阈值阈值分离黑白像素。

这是一个形象的例子删除标记的透视变形后得到:

【计算机视觉】 相机姿态估计之标记检测-ArUco标记检测1
的角度删除

然后,图像划分网格中相同的细胞比标志位的数量。 在每个细胞,黑白像素的数量计算决定分配的一些细胞(从大多数值):

【计算机视觉】 相机姿态估计之标记检测-ArUco标记检测1
标记的细胞

有几个参数,可以定制这个过程:

  • int markerBorderBits

这个参数表示标记边界的宽度。 每个点的大小是相对的。 值2显示边界的宽度有两个内部碎片。

这个参数需要配合的边界大小标记您正在使用。 标记的边界大小可以配置等功能 drawMarker()

默认值:1

  • 双minOtsuStdDev

这个值决定了最低标准偏差执行大津阈值的像素值。 如果偏差是低,这可能意味着所有的广场是黑色(或白色)和应用首先进行没有意义。 如果是这种情况,所有的位都设置为0(1)根据均值是否高于或低于128。

默认值:5.0

  • int perpectiveRemovePixelPerCell

这个参数决定了像素的数量(每个细胞)在删除后获得的图像角度变形(包括边界)。 这是上图中红色方块的大小。

例如,让我们假设我们正在处理5 x5的标志位和边境1位(见的大小 markerBorderBits)。 然后,细胞的总数/位/尺寸是5 + 2 * 1 = 7(边界必须计算两次)。 细胞的总数是7 x7。

如果该值的 perpectiveRemovePixelPerCell是10,那么获得图像的大小10 * 7 = 70 - > 70 x70像素。

更高的价值,这个参数可以提高信息提取过程(某种程度上),但是它可以惩罚性能。

默认值:4

  • 双perspectiveRemoveIgnoredMarginPerCell

提取的每一个细胞时,黑白像素的数量统计。 在一般情况下,不建议考虑所有细胞像素。 相反最好忽略一些像素的边缘细胞。

这个的原因是,删除透视失真后,细胞的颜色,一般来说,不是完全分离和白细胞可以入侵一些像素的黑色细胞(反之亦然)。 因此,最好忽略一些像素只是为了避免计数错误的像素。

例如,在以下图片:

【计算机视觉】 相机姿态估计之标记检测-ArUco标记检测1
标记细胞的利润率

只考虑绿色方块内的像素。 它可以看到正确的图像,得到的像素包含从邻居细胞数量的噪音较低。 的 perspectiveRemoveIgnoredMarginPerCell参数表示的区别红色和绿色的方块。

这个参数是相对于细胞的总大小。 例如如果细胞大小40像素,该参数的值为0.1,40 * 0.1 = 4像素的边缘被忽略的细胞。 这意味着像素的总量将分析每个单元会32 x32,而不是40 x40。

默认值:0.13

识别标志

位已经提取后,下一步是检查如果提取的代码属于字典和标志,如果有必要,可以执行纠错。

  • 双maxErroneousBitsInBorderRate

标记的边界应该是黑色的。 这个参数指定了允许在边境的错误比特数,即白位在边境的最大数量。 它是相对于标志位的总数。

默认值:0.35

  • 双errorCorrectionRate

每一个标记字典有理论最大可以纠正的比特数( Dictionary.maxCorrectionBits)。 然而,这个值可以修改的 errorCorrectionRate参数。

例如,如果允许,可以纠正的比特数(使用字典)是6和的值 errorCorrectionRate是0.5,真正的最大的比特数,可以纠正是6 * 0.5 = 3位。

这个值是有用的减少误差修正能力为了避免假阳性。

默认值:0.6

角落里改进

标记已发现和确认后,最后一步是进行亚像素细分在角落位置(见OpenCV cornerSubPix()和 简历:aruco::CornerRefineMethod)

注意,这一步是可选的,是有意义如果标记角落的位置必须准确,例如姿势估计。 它通常是一个非常耗时的步骤,默认情况下是禁用的。

  • int cornerRefinementMethod

这个参数决定是否角落里亚像素执行过程。 它可以禁用如果准确的角落并不是必要的。

默认值: CORNER_REFINE_NONE

  • int cornerRefinementWinSize

这个参数决定了亚像素细分过程的窗口大小。

高值可以产生的效果关闭图像角落都包含在窗口区域,以便标记移动到另一个角落,过程中错误的位置。 而且它会影响性能。

默认值:5

  • int cornerRefinementMaxIterations双cornerRefinementMinAccuracy

这两个参数确定的停止准则亚像素细分的过程。 的 cornerRefinementMaxIterations表明迭代和的最大数量 cornerRefinementMinAccuracy最小误差值之前停止的过程。

如果迭代次数太高了,它会影响性能。 另一方面,如果太低,它可以产生一个可怜的亚像素细分。

默认值:

cornerRefinementMaxIterations:30, cornerRefinementMinAccuracy




相关文章: