一、ArUco简介及安装步骤

ArUco: a minimal library for Augmented Reality applications based on OpenCV,是科尔多瓦大学“人工视觉应用”研究小组(A.V.A)设计开发的一个微型现实增强库。ArUco主要用于检测平面标记并估计相机位姿。CSDN有篇博客:ArUco----一个微型现实增强库的介绍及视觉应用 介绍的挺好,可以参考一下。还有一篇基于OpenCV的:[OpenCV] aruco Markers识别

ArUco源码下载地址:https://sourceforge.net/projects/aruco/files/?source=navbar (源码持续更新)

1、Windows系统下编译安装(不推荐)

ArUco在Linux系统支持较好,用Windows的话操作比较麻烦,看你用什么IDE,一般我们都用Visual Studio,那就要把源码下载解压后用cmake-gui构建一个与你IDE版本匹配的项目,然后再用IDE编译安装。cmake-gui下载地址:https://cmake.org/download/,注意自己的Windows系统是32位还是64位。

ArUco项目依赖于OpenCV(version>=2.4.9)和Eigen3(项目源码中已经包含,不需安装),所以建议直接安装OpenCV3.0以上的版本,OpenCV下载地址:https://opencv.org/releases.html 。在Windows中安装OpenCV是最好下载源码自己用CMake编译安装,以避免与自己的系统和IDE版本不匹配。OpenCV源码可以直接在GitHub上下载,源码地址:https://github.com/opencv/opencv/releases 。在构建ArUco项目前一定要先把OpenCV编译安装好,不然ArUco会提示找不到OpenCV。

用cmake-gui构建ArUco时一定要以管理员身份运行cmake-gui,按照常规步骤一般不会出错。注意在添加OpenCV模块的时候一定要选择事先编译安装好OpenCV的文件夹,版本要一致,注意x86与x64之分,文件夹中必须包含OpenCVConfig.cmake这个文件。

获取ArUco的另一个途径是下载安装OpenCV的附加库opencv_contrib,因为ArUco已经集成到OpenCV3.0以上版本的opencv_contrib里了。opencv_contrib源码下载地址:https://github.com/opencv/opencv_contrib/releases ,注意:下载附加库源码的版本一定要与OpenCV源码版本一致。 如何编译附加库参考:https://blog.csdn.net/linshuhe1/article/details/51221015

附 Visual Studio 配置OpenCV四步曲(以VS2013 32位编译器 OpenCV3.3.1为例):

(1)在“环境变量/系统变量/Path”中添加OpenCV安装目录下对应版本(编译器位数和VS版本)bin目录的完整路径,点击“确定”,重启系统。

(2)VC++目录–>包含目录,添加:
D:\opencv331\opencv\mybuild\install\include
D:\opencv331\opencv\mybuild\install\include\opencv
D:\opencv331\opencv\mybuild\install\include\opencv2

(3)VC++目录–>库目录,添加:
D:\opencv331\opencv\mybuild\install\x86\vc12\lib
D:\opencv331\opencv\mybuild\install\x86\vc12\staticlib

(4)链接器–>输入–>附加依赖项,添加 .lib文件,注意添加的库与编译选项要一致,debug版本带d,release版本不带d。

命令行生成文件列表小技巧: 进入lib文件夹打开命令窗,运行命令dir /b >libs.txt,即会将该文件夹下的所有文件名生成在名为libs的文本文档里。

2、Linux(Ubuntu14.04)系统下编译安装

请从源码地址将ArUco任一Linux版本的源码包下载至本地,这里以aruco-3.0.6为例。安装ArUco之前一定要先安装OpenCV,最好是3.0以上版本,不能低于2.4.9。

  • 默认路径安装 /usr/local/
$ unzip aruco-3.0.6.zip
$ cd aruco-3.0.6
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install

  • 指定路径安装
$ mkdir aruco306_installed
$ unzip aruco-3.0.6.zip
$ cd aruco-3.0.6
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_INSTALL_PREFIX=<absolute path of aruco306_installed>
$ make
$ sudo make install

如上图所示,安装完成后会在安装路径下生成四个文件夹:bin、include、lib 和 share,分别包含了可执行文件、头文件、库文件和cmake配置文件。当我们的程序中要用到ArUco时,就可以在对应的CMakeLists.txt文件里加上find_packge(aruco REQUIRED)。如果cmake提示找不到aruco,那么就在 find_package 前面加上一句set(aruco_DIR <absolute path of aruco306_installed>/share/aruco/cmake),指出arucoConfig.cmake所在的位置,然后将 aruco_INCLUDE_DIRS 和 aruco_LIBS 加入 include_directories 和 target_link_libraries 即可。

但是: 不知道什么原因,在博主电脑上,ArUco3.0及以上版本的arucoConfig.cmake文件中并不包含ArUco的头文件路径和库文件信息,所以find_package无效,只能在CMakeLists.txt里手动添加set(aruco_INCLUDE_DIRS <absolute path of aruco306_installed>/include/aruco)set(aruco_LIBS <absolute path of aruco306_installed>/lib/libaruco.so)

再附上一篇关于cmake用法的博客:cmake使用示例与整理总结

二、ArUco项目源码简析

声明: 以下内容均是在Ubuntu系统下进行操作,用Windows的同学亦可参考,但博主推荐大家一开始就使用Ubuntu系统,因为后面可能会涉及到视觉SLAM方面的内容。

1、首先来看一下ArUco项目的源码结构

cd 到你ArUco的安装目录,运行命令$ tree -L 2,你将会看到:

bin目录下有一些源码自动生成的可执行文件,像是一些demo,我们可以用它们实现ArUco的一些基本功能,比如相机标定、生成二维码、检测二维码等等。这些可执行文件的源码都可以在你的源码包中找到,当然日后我们自己写程序的时候完全可以参考这些源码。因为个人感觉这个项目的源码不是特别清晰,下面简单梳理一下我们可以在哪个文件夹下找到哪些可执行文件的源码:

  • utils文件夹:aruco_batch_processing、aruco_print_dictionary、aruco_print_marker、aruco_simple、aruco_test、aruco_tracker
  • utils_calibration文件夹:aruco_calibration、aruco_calibration_fromimages
  • utils_markermap文件夹:aruco_create_markermap、aruco_markermap_pix2meters、aruco_simple_markermap、aruco_test_markermap
  • utils_svm文件夹:aruco_test_svm

如果你用IDE(推荐KDevelop或CLion)查看的话,这些还是很容易找到的。细心的同学可能会发现,源码包中还有好多源码没有被生成可执行文件,这是因为在cmake配置文件中把它们屏蔽掉了。如果想一探究竟可以打开源码包目录下的CMakeLists.txt,里面有这么一段:

这里不解释了,应该很容易理解,然后再打开cmake文件夹下的options.cmake,里面有这么一段:
这里写图片描述
现在你应该知道,如果想把tests文件夹下的源码生成可执行文件,需要把option(BUILD_TESTS "Set to OFF to not compile utils " OFF)这句改成option(BUILD_TESTS "Set to OFF to not compile utils " ON),其他同理。

接下来我们再看看include文件夹下都有哪些头文件,cd 到include文件夹,同样运行命令:$ tree -L 2,你会看到:

这里列出了ArUco库中包含的所有头文件,其实看起来并不是很复杂,每个头文件对应的源码都能在源码包中的src文件夹下找到。

再cd 到lib目录下,运行命令$ tree

我们可以很清楚地看到三个共享库之间的链接关系,所以在自己的CMakeLists.txt中要设置为libaruco.so,而不是libaruco.so.3.0或libaruco.so.3.0.6。

2、接下来运行源码中几个比较常用的demo

  • 运行 aruco_calibration 进行相机标定

cd 到ArUco安装目录的bin目录下,运行:$ ./aruco_calibration,如果你不是默认路径安装,可能会遇到类似下面的错误:

解决办法:“error while loading shared libraries: xxx.so.x” 错误的原因和解决办法

其实我们完全没有必要非得在这个目录下运行,比如,我们可以cd 到在编译安装ArUco时新建的build文件夹下,里面的内容应该是酱紫的:

根据前面的介绍,要运行aruco_calibration,就要先cd 到utils_calibration文件夹下,然后运行$ ./aruco_calibration,结果是:

这是一个用ArUco板标定相机的程序,因为你没有给它合适的入口参数,所以程序打印一段“Usage:”就直接退出了。根据上面的用法介绍,正确的命令应该是:

$ ./aruco_calibration live:1 out_camera_calibration.yml -m aruco_calibration_grid_board_a4.yml -size 0.048

运行命令前看一下你的当前文件夹下有没有aruco_calibration_grid_board_a4.pdf 和aruco_calibration_grid_board_a4.yml 这两个文件,将pdf文件打印出来或者在另一台电脑上打开全屏显示(双显示器的就更方便啦),然后用直尺量出单个marker的边长(单位是米),如果跟我的不一样要修改“-size”后面的值。

运行效果如上图所示,窗口左上角有操作提示,不赘述了。运行完了ESC键退出即可,相机标定文件保存在当前文件夹下。

  • 运行 aruco_print_marker 生成单个 marker

cd 到build目录的utils文件夹下,运行:

$ ./aruco_print_marker 0 marker0.jpg -d ARUCO

或者

$ ./aruco_print_marker 0 marker00.jpg -d ARUCO -e

这两个命令行都是生成ARUCO字典中ID为0的marker,但两者生成的marker看起来有些不同:

很明显,后者(encloded marker)的四个角上各多了一个黑方块,而这并不影响marker内部的编码,且它们的ID都是0。在检测marker的角点时,后者会比前者稍微复杂一些,但精度更高。

  • 运行 aruco_print_dictionary 批量生成 markers

cd 到build目录的utils文件夹下,运行:

$ mkdir ARUCO
$ ./aruco_print_dictionary ARUCO/ ARUCO

或者

$ mkdir ARUCO_MIP_36h12
$ ./aruco_print_dictionary ARUCO_MIP_36h12/ ARUCO_MIP_36h12

这样会在ARUCO文件夹下生成1023个ArUco字典中的marker,或在ARUCO_MIP_36h12文件夹下生成250个ARUCO_MIP_36h12字典中的marker。现在我们看到,ArUco每个字典的容量不尽相同,这跟它的编码过程有关系,此处暂不介绍。

**温馨提示:**用ArUco官方库生成的marker左下角自带水印,为该marker的ID;用OpenCV的aruco module生成的marker不带水印。重要的是,两者虽然是同样的编码原理,但生成的很多marker不能互相识别,说明它们二者之间的字典内容还是有所不同的。因此,有时即使是用的同一个字典名,ArUco可能也无法识别OpenCV生成的marker。

  • 运行 aruco_test 检测识别 markers

cd 到build目录的utils文件夹下,运行:

$ ./aruco_test live:1 -c ../utils_calibration/out_camera_calibration.yml -s 0.048 -d ARUCO_MIP_36h12

还用刚才的那个ArUco板,来看一下这次的运行效果:

怎么样?图片是不是很炫酷!但这个东西其实对我们没什么用,真正有用的是在终端里显示的那一串串字符。每一行字符串代表的含义是:marker的id以及该marker的四个角点在图像中的像素坐标,Txyz为相机坐标系到该marker坐标系的平移向量,Rxyz为相机坐标系到该marker坐标系的旋转向量。

好了,demo就先示范这几个吧,其他的以后用得到再讲。相信认真阅读并做实验的同学已经对ArUco有了初步了解,学习能力强的同学其他demo应该也会触类旁通。下一篇我将介绍如何利用ArUco实现相机的位姿估计,并简述其原理。


致谢山东青岛 美丽的