翻译OpenCV文档:ArUco Marker的检测 (Detection of ArUco Markers)

英文原文链接:Detection of ArUco Markers

姿态估计(Pose estimation)在计算机视觉领域扮演着十分重要的角色:机器人导航、增强现实以及其它。这一过程的基础是找到现实世界和图像投影之间的对应点。这通常是很困难的一步,因此我们常常用自己制作的或基本的Marker来让这一切变得更容易。
最为流行的一个途径是基于二进制平方的标记。这种Marker的主要便利之处在于,一个Marker提供了足够多的对应(四个角)来获取相机的信息。同样的,内部的二进制编码使得算法非常健壮,使得应用错误检测和校正技术成为可能。
aruco模块基于ArUco库,这是一个检测二进制marker的非常流行的库,是由Rafael Mu?oz和Sergio Garrido完成的。
aruco的函数包含在

 #include <opencv2/aruco.hpp>

Marker和字典

一个ArUco marker是一个二进制平方标记,它由一个宽的黑边和一个内部的二进制矩阵组成,内部的矩阵决定了它们的id。黑色的边界有利于快速检测到图像,二进制编码可以验证id,并且可以应用错误检测和校正技术。marker的大小决定了内部矩阵的大小。例如,一个4x4的marker由16位组成。

应当注意到,我们能够检测到一个Marker在空间中发生了旋转,但是,检测的过程需要确定它的初始旋转,所以每个角点都应该是清晰可见的,确定的,不能有歧义,这也是通过二进制编码来做的。
markers的字典是在一个特殊应用中使用到的marker的集合。这仅仅是每个marker的二进制编码的链表。

  • 字典的主要性质是字典的大小和Marker的大小:
  • 字典的大小是指组程字典的marker的数量
  • marker的大小是这些marker的尺寸(位的个数)
  • aruco模块包含了一些预定义的字典,这些字典涵盖了一系列的字典大小和Marker尺寸。

有些人可能会认为marker的id是通过将二进制编码转换成十进制获得的。但是这实际上是不可能的,因为尺寸大的marker的位数会很大,管理如此多的数据并不现实。事实上,一个marker的id仅仅是marker在它所在的字典的下标。例如,一个字典里的五个marker的id是:0,1,2,3和4。
更多有关字典的信息在“Selecting a dictionary”部分提及。

创建Marker

在检测之前,markers需要被打印出来,以把它们放到环境中。marker的图像可以使用drawMarker()函数生成。
举个例子,让我们分析一下如下的调用:

cv::Mat markerImage;
cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
cv::aruco::drawMarker(dictionary, 23, 200, markerImage, 1);

首先,通过选择aruco模块中一个预定义好的字典来创建一个Dictionary对象。就当前例子而言,这个字典是由250个marker组成的,每个marker的大小为6x6位(DICT_6X6_250)
drawMarker的参数如下:

  • 第一个参数是之前创建的Dictionary对象。
  • 第二个参数是marker的id,在这个例子中选择的是字典DICT_6X6_250 的第23个marker。注意到每个字典是由不同数目的Marker组成的,在这个例子中的字典中,有效的Id数字范围是0到249。不在有效区间的特定id将会产生异常。
  • 第三个参数,200,是输出Marker图像的大小。在这个例子中,输出的图像将是200x200像素大小。注意到这一参数需要满足能够存储特定字典 的所有位。举例来说,你不能为6x6大小的marker生成一个5x5图像(这还没有考虑到Marker的边界)。除此之外,为了避免变形,这一参数最好和位数+边界的大小成正比,或者至少要比marker的大小大得多(如这个例子中的200),这样变形就不显著了。
  • 第四个参数是输出的图像。
  • 最终,最后一个参数是一个可选的参数,它指定了Marer黑色边界的大小。这一大小与位数数目成正比。例如,值为2意味着边界的宽度将会是2的倍数。默认的值为1。
    生成的图像如下:

详细的例子在模块示例文件夹中的create_marker.cpp

检测Marker

给定一个可以看见ArUco marker的图像,检测程序应当返回检测到的marker的列表。每个检测到的marker包括:

  • 图像四个角的位置(按照原始的顺序)
  • marker的ID
    marker检测过程由以下两个主要步骤构成:
  1. 检测候选marker。在这一阶段我们分析图像,以找到那些可能是marker的方形。首先要做的是利用自适应性阈值来分割marker,然后从阈值化的图像中提取外形轮廓,并且舍弃那些非凸多边形的,以及那些不是方形的。我们还使用了一些额外的滤波(来剔除那些过小或者过大的轮廓,过于相近的凸多边形,等)
  2. 检测完marker候选之后,我们有必要分析它的内部编码来确定它们是否确实是marker。此步骤首先提取每个标记的标记位。为了达到这个目的,首先,我们需要对图像进行透视变换,来得到它规范的形态(正视图)。然后,对规范的图像用Ossu阈值化以分离白色和黑色位。这一图像根据marker大小和边界大小被分为许多不同格子,我们通过统计落在每个格子中的黑白像素数目来决定这是黑色还是白色的位。最终,我们分析这些位来决定这个marker是属于哪个特定字典的,如果有必要的话,需要对错误进行检测。

对于如下图像:

这些是检测出来的marker(用绿色标记):

以下是识别阶段被剔除的Marker候选(用红色标记):

在aruco模块,检测是由detectMarkers()函数完成的,这一函数是这个模块中最重要的函数,因为剩下的所有函数操作都基于detectMarkers()返回的检测出的markers。
一个marker检测的例子:

cv::Mat inputImage;
std::vector<int> markerIds;
std::vector<std::vector<cv::Point2f>> markerCorners, rejectedCandidates;
cv::Ptr<cv::aruco::DetectorParameters> parameters;
cv::Ptr<cv::aruco::Dictionary> dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250);
cv::aruco::detectMarkers(inputImage, dictionary, markerCorners, markerIds, parameters, rejectedCandidates);

detectMarkers 的参数为:

  • 第一个参数是待检测marker的图像。
  • 第二个参数是字典对象,在这一例子中是预先定义的字典 (DICT_6X6_250).
    检测出的markers存储在markerCornersmarkerIds结构中:
  • markerCorners是检测出的图像的角点的列表。对于每个marker,将返回按照原始顺序排列的四个角(从左上角开始顺时针旋转)。因此,第一个点是左上角的角,然后是右上角、右下角和左下角。
    -markerIds是在markerCorners检测出的所有maker的ID列表.注意返回的markerCornersmarkerIds的vetcor具有相同的大小。
  • 第四个参数是类型的对象 DetectionParameters. 这一对象包含了检测过程中的所有可以定制的参数。这一参数将在 下一章节详细介绍。
  • 最后一个参数, rejectedCandidates, 是返回的所有marker候选, 例如, 那些被检测出来但不是有效编码的方形。每个候选同样由它的四个角定义,形式和markerCorners的参数一样。这一参数可以被省略,它仅仅用于debug阶段,或是用于“再次寻找”策略(详见refineDetectedMarkers()

detectMarkers()之后,接下来你想要做的事情可能是检查你的marker是否被正确地检测出来了。幸运的是,aruco模块提供了一个函数,它能在输入图像中来绘制检测出来的markers,这个函数就是drawDetectedMarkers() ,例子如下:

cv::Mat outputImage;
cv::aruco::drawDetectedMarkers(image, markerCorners, markerIds); 
  • image是输入/输出图像,程序将在这张图上绘制marker。(它通常就是检测marker的那张图像)
  • markerCornersmarkerIds 是检测出marker的结构,它们的格式和detectMarkers()函数提供的一样。

请注意这个函数仅仅用于可视化,而没有别的什么用途。
使用这两个函数我们完成了基本的marker识别步骤,我们可以从相机中检测出Marker了。

未完待续

原文地址:https://www.cnblogs.com/elliottzheng/p/8227576.html

时间: 2024-10-13 01:54:55

翻译OpenCV文档:ArUco Marker的检测 (Detection of ArUco Markers)的相关文章

翻译qmake文档(三) Creating Project Files

上一篇: 翻译qmake文档(二) Getting Started 原英文文档:http://qt-project.org/doc/qt-5/qmake-project-files.html 创建项目文件 项目文件包含qmake构建你的应用程序,库文件,或插件需要的所有信息.通常,你会在项目文件里使用一系列的声明指定资源,但是对简单程序构造的支持,允许你为不同的平台或环境描述不同的构建过程. 项目文件元素 qmake使用的项目文件格式可以支持简单和复杂的构建系统使用.简的项目文件使用简单的声明样

翻译qmake文档 目录

翻译qmake文档 目录 利用空闲时间把qmke的文档翻译出来,翻译水平有限,有些地方翻译的不好,请谅解, 如果您能指出来,我会很感激并在第一时候做出修改. 翻译qmake文档(一) qmake指南和概述 翻译qmake文档(二) Getting Started 翻译qmake文档(三) Creating Project Files 翻译qmake文档(四) Building Common Project Types http://www.cnblogs.com/li-peng/p/402613

翻译qmake文档(四) Building Common Project Types

翻译qmake文档 目录 本章原英文文档:http://qt-project.org/doc/qt-5/qmake-common-projects.html 构建常见的项目类型 本章描述如何设置基于Qt的应用程序.库和插件的三种常见项目类型的qmake项目项目文件.虽然所有的项目类型使用大量相同的变量,但是它们中的每一个都使用项目特定的变量来自定义输出文件. 这里不会描述特定于平台的变量.更多详细修改请查看  Qt for Windows - Deployment 和 Qt for Mac OS

翻译qmake文档(二) Getting Started

上一篇文章:  翻译qmake文档(一) qmqke指南和概述 原英文文档: http://qt-project.org/doc/qt-5/qmake-tutorial.html 本教程教讲授qmake基础知识.这个手册里的其它专题包含更详细的使用qmke信息. 从简单开始 假设你已经完成了应用程序的基本实现,并且你创建了下边的文件: hello.cpp hello.h main.cpp qt分布的目录 examples/qmake/tutorial 中,你可以找到这些文件.你只需要知道的另一件

如何使用PDF编辑器翻译PDF文档

在工作和学习中,有时候看到PDF文件上密密麻麻的外文,是不是常常有种无力感?这一点,需要经常接触外国文献或者文件资料的朋友可能深有感触. 现在就给大家介绍一款可以翻译PDF文档的PDF工具--福昕PDF编辑器! 用PDF编辑器打开文件,左键拉选需要翻译的文本,然后点击顶部菜单栏"主页"-"翻译" 这样就可以翻译外文了,操作非常简单,希望能帮到大家. 原文地址:https://www.cnblogs.com/vincebin/p/9936611.html

怎样翻译word文档中的英文,仅需三分钟即可搞定

怎样翻译word文档中的英文?在职场办公当中,难免会遇到外国客户.在与外国客户沟通.合作的过程当中,所使用得合作文件.资料的内容几乎都是英文.这也就使得英文不好的职员,除了准备合作资料外还需要花费大量时间去查阅单词,翻译语句,大大降低了工作效率.今天小编就将告诉大家如何快速有效地翻译word文档中的英文. 使用工具:迅捷pdf转换https://www.xunjiepdf.com/converter 1.大部分翻译工具,都只能单个单词或者逐句翻译,就算能翻译整段也是有次数限制.这样就会导致翻译出

Word文档怎么翻译?翻译word文档简单步骤讲解

将文档进行翻译是我们经常遇到的事情,市面上也出现了很多翻译文档的工具,但是使用起来总觉得不是那么好用,一款易上手的工具对我们来说是非常重要的,今天的课堂就是小编给大家分享使用工具将word文档进行翻译的三个小技巧,一起来了解下吧! 文档翻译工具一:在线转换器 1.进入PDF在线转换器页面,在菜单栏中找到文档处理,在弹出的子栏目中找到word在线翻译: 2.通过点击选择文件将需要进行翻译的文件上传至指定区域即可,在自定义转换设置中可以根据自己的需要选择翻译的语种: 3.点击开始翻译,当进度条显示转

文档翻译软件怎么用?怎么翻译Word文档

如何翻译Word文档?跟国外合作的项目发送给中文内容的文件天猫肯定看不明白,为了尊重对方,我们需要将中文的文件翻译成英文的,文件内容那么多,你还在想一句句人工翻译吗?别搞错了,现在翻译文件都在用文档翻译器了好吧,不仅准确率高,而且效率也没什么可挑剔的.下面小编就来为大家介绍一下文档翻译软件的使用方法,帮助你轻松翻译Word文档!具体操作如下:(方法参照文档翻译器)1:打开文档翻译器,在页面中我们可以看到有四种翻译的功能,我们选择文档翻译就好了,不过这个也是默认的操作功能.2:之后上传需要翻译的文

如何翻译PPT文档?PPT文档翻译一招搞定

PPT文档怎么翻译?PPT文件中有需要翻译的内容的时候,你还在一个个的复制进网页中搜索然后进行翻译吗?这个方法已经淘汰了,不仅麻烦,还拉低你的工作效率,今天小编来为大家介绍一个翻译PPT文档的方法,教你摆脱死板的翻译方法,翻译PPT也可以轻松搞定!准备工具:文档翻译器还需要提前准备好需要翻译的PPT文件,当然电脑也少不了,这是一个基本的辅助工具哦.好啦,上面的工作就绪后,开始翻译啦:1:打开文档翻译器后,点击左侧功能栏中的文档翻译功能,之后点击页面内的[点击上传文档]按钮添加要进行翻译的PPT文