Detection of ArUco Markers

相机标定


姿态估计在许多计算机视觉的应用中都是十分重要的环节,在机器人导航、增强现实等场景中广泛运用。这个过程主要基于找到点在真实3d环境中的坐标和2d图像中的对应坐标。这通常是一个比较困难的步骤,因此运用通用的标记物或者标准标号来使这个问题简单一点。
使用二维码记号通常是一个常用的途径之一。这标记的主要优势是单个记号就提供了获取相机姿态的足够对应信息。同时,记号的内部二进制编码使得标记在错误检查和修正等方面保持一定的稳定性。
Aruco模块主要基于 ArUco library,是一个二维码识别中被广泛使用的库。
Markers and Dirctionaries
一个ArUco标记外围都有一组黑色边框,同时内部有着确定该标记ID的二维矩阵组合而成。黑色的边框能加速标记在图像中的检测速度,内部的二维编码能唯一识别该标记,同时进行错误检测和错误修复。标记的大小确定了内部矩阵的大小,例如4x4大小的标记有16个bit(5x5就有25bits?)。
Some examples of ArUco markers:

aruco_example.jpg

尤其需要注意到的是,标志在环境中通常存在旋转,然而,检测的过程需要确定旋转的初始方向,因此,每一个角点在二维编码的过程中就会被唯一确定。
标记字典是一组被用来进行特殊应用的标记,它大大简化了每个marker二维码列表。字典的主要属性就是字典的大小和标志的大小:

  • 字典大小:合成字典的marker的数量 (50 100 250 1000)
  • 标志大小:marker的大小(bits 16 25 49 ...)
    aruco模块中包含了一些已经预先定义好不同大小和数量的字典集
    有些人可能会想到,一个marker的id是从二维码中获取得到并转换成一个10进制的数值。然而,这对于高位marker由于有着太高的bits来实现这种管理是不实际的,因此marker的id简化在了所属的字典序列中。
    Marker Creation
    在检测之前,往往我们需要打印一些marker放到我们的环境中。Marker图案我们能通过drawMarker函数产生:
c++ cv::Mat markerImage; cv::aruco::Dictionary dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_6X6_250); 
cv::aruco::drawMarker(dictionary, 23, 200, markerImage, 1);

以上代码产生的Marker图片:

marker23.jpg

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

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

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

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

c++ 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);

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

c++ Mat cameraMatrix, distCoeffs; ... vector< Vec3d > rvecs, tvecs; 
cv::aruco::estimatePoseSingleMarkers(corners, 0.05, cameraMatrix, distCoeffs, rvecs, tvecs);
  • The corners parameter is the vector of marker corners returned by the detectMarkers() function.
  • The second parameter is the size of the marker side in meters or in any other unit. Note that the translation vectors of the estimated poses will be in the same unit
  • cameraMatrix and distCoeffs are the camera calibration parameters that need to be known a priori.
  • rvecs and tvecs are the rotation and translation vectors respectively, for each of the markers in corners.
    标记坐标系统是假设z轴是朝外的,x是朝右边,y朝前进方向。标志角点在左上角点。
    如图所示:


    marker坐标系
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容

  • /**转载自https://blog.csdn.net/xiaoxiaowenqiang/article/deta...
    Maxsium阅读 621评论 0 0
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,969评论 3 119
  • 幼儿园上周五布置了个作业,让小朋友观察下周围的世界,圆形有哪些? 因为周末都在外面,所以周一吃早饭的时候,我问了下...
    阿蕾阿蕾蕾阅读 300评论 0 0
  • 从未来过襄阳,却有止不住的好感,源于金庸老爷子的射雕英雄传,郭靖、黄蓉夫妇为保襄阳城不破,最后双双战死,蒙古大军一...
    queen98阅读 193评论 0 0
  • Creating Features from UDFsMethod Introduced:•pfcSolid.So...
    hothome99阅读 142评论 0 0