Opencv学习笔记 - ArUco,一个开源的微型的现实增强库

        姿势估计在许多计算机视觉应用中非常重要:机器人导航,增强现实等等。该过程基于发现真实环境中的点与其2d图像投影之间的对应关系。这通常是一个困难的步骤,因此通常使用合成或基准标记来简化操作。最受欢迎的方法之一是使用二进制方形基准标记。这些标记的主要优点是单个标记可以提供足够的对应关系(四个角)来获得相机的姿势。而且,内部二进制编码使它们特别健壮,从而允许应用错误检测和纠正技术。

        最受欢迎的方法之一是使用二进制方形基准标记。 这些标记的主要优点是单个标记可以提供足够的对应关系(四个角)来获得相机的姿势。 而且,内部二进制编码使它们特别健壮,从而允许应用错误检测和纠正技术。

        aruco模块基于ArUco库,该库是由RafaelMuñoz和Sergio Garrido开发的用于检测方形基准标记的流行库:

        Aruco功能包括在:#include <opencv2/aruco.hpp>;ArUco标记是由宽黑色边框和确定其标识符(id)的内部二进制矩阵组成的合成正方形标记。 黑色边框有助于其在图像中的快速检测,并且二进制编码允许其识别以及错误检测和纠正技术的应用。 标记大小决定内部矩阵的大小。 例如,标记大小4x4由16位组成。

        ArUco下载地址:https://sourceforge.net/projects/aruco/files/(可以下载2.0.19或3.0.0)

  ArUco的Marker生成网址:http://terpconnect.umd.edu/~jwelsh12/enes100/markergen.html(可以定制Marker的size、ID以及Padding)

        该库主要的类主要有:

  aruco::Marker----视觉标志类; 
  aruco::MarkerDetector----视觉标志检测类;
  aruco::MarkerPoseTracker----视觉标志姿态预估类;
  aruco::MarkerMap-----视觉标志地图类; 
  aruco::MarkerMapPoseTracker----视觉标志地图姿态预估类;
  aruco::CvDrawingUtils----绘图类;

        Markers and Dirctionaries
        一个ArUco标记外围都有一组黑色边框,同时内部有着确定该标记ID的二维矩阵组合而成。黑色的边框能加速标记在图像中的检测速度,内部的二维编码能唯一识别该标记,同时进行错误检测和错误修复。标记的大小确定了内部矩阵的大小,例如4x4大小的标记有16个bit。

         Marker Creation

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

        Marker Detection

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

    在包含ArUco标志的图片中,检测过程通常能返回被检测到的marker序列。每一个检测的Marker结果包括:

  • marker四个角点在图片中的位置
  • marker的id

    Marker检测过程主要有两个步骤:

  1. 检测Marker的候选区域。
  2. 通过分析二维码确定marker
    在opencv的ArUco模块中,主要通过detectMarkers()函数来完成,这个函数是整个模块中最重要的函数了,因为后续的函数处理几乎都依赖于该函数的检测结果。

        Pose Estiimation

        当获取得到Marker的识别结果之后,就是确定相机姿态了。为了确定相机姿态,首先得知道相机的标定参数,内参和畸变。在估计每个ArUco标记的时候,我们能单独估计每个marker。如果你希望能从一系列的marker中估计一个pose,你需要了解ArUco Boards.相机相对于marker的姿态是一个3d的旋转,从marker坐标系到camera坐标系。这个通过一个旋转和一个平移向量和描述。

Mat cameraMatrix, distCoeffs; ... vector< Vec3d > rvecs, tvecs; 
cv::aruco::estimatePoseSingleMarkers(corners, 0.05, cameraMatrix, distCoeffs, rvecs, tvecs);

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/113769010