Opencv之Aruco码的检测和姿态估计

这篇具有很好参考价值的文章主要介绍了Opencv之Aruco码的检测和姿态估计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.介绍

Aruco码是由宽黑色边框和确定其标识符(id)的内部二进制矩阵组成的正方形标记。它的黑色边框有助于其在图像中的快速检测,内部二进制编码用于识别标记和提供错误检测和纠正。单个aruco 标记就可以提供足够的对应关系,例如有四个明显的角点及内部的二进制编码,所以aruco 标记被广泛用来增加从二维世界映射到三维世界时的信息量,便于发现二维世界与三维世界之间的投影关系,从而实现姿态估计、增强现实等应用。

2.码的创建

首先我们要指定一个字典,这个字典表示的是创建出来的aruco 标记具有怎样的尺寸、怎样的编码等我们使用:APlgetPredefined Dictionary ()来声明我们使用的字典。 些预定义字典。而且字典名称表示了该字典的aruco 标记数量和尺寸,例如DICT_7X7_50表示一个包含了50种7x7位标记的字典。
在OpenCv中提供了多种预定义字典,我们可以通过PREDEFINED_DICTIONARY_NAME来查看:

auto dictionary = aruco::getPredefinedDictionary(aruco::DICT_6X6_250);
可使用的字典:
        DICT_4X4_50=0,             
        DICT_4X4_100=1, 
        DICT_4X4_250=2,
        DICT_4X4_1000=3, 
        DICT_5X5_50=4, 
        DICT_5X5_100=5, 
        DICT_5X5_250=6, 
        DICT_5X5_1000=7, 
        DICT_6X6_50=8, 
        DICT_6X6_100=9,
        DICT_6X6_250=10, 
        DICT_6X6_1000=11, 
        DICT_7X7_50=12,
        DICT_7X7_100=13, 
        DICT_7X7_250=14, 
        DICT_7X7_1000=15, 
        DICT_ARUCO_ORIGINAL = 16

Aruco码和Aruco码板的创建:

#include <opencv2/highgui.hpp>
#include <opencv2/aruco.hpp>

using namespace cv;

namespace {
const char* about = "Create an ArUco grid board image main -w=2 -h=2 -l=10 -s=5 -d=16 -si=true ";
const char* keys  =
"{@outfile |<none> | Output image }"
"{w        |       | Number of markers in X direction }"
"{h        |       | Number of markers in Y direction }"
"{l        |       | Marker side length (in pixels) }"
"{s        |       | Separation between two consecutive markers in the grid (in pixels)}"
"{d        |       | dictionary: DICT_4X4_50=0, DICT_4X4_100=1, DICT_4X4_250=2,"
"DICT_4X4_1000=3, DICT_5X5_50=4, DICT_5X5_100=5, DICT_5X5_250=6, DICT_5X5_1000=7, "
"DICT_6X6_50=8, DICT_6X6_100=9, DICT_6X6_250=10, DICT_6X6_1000=11, DICT_7X7_50=12,"
"DICT_7X7_100=13, DICT_7X7_250=14, DICT_7X7_1000=15, DICT_ARUCO_ORIGINAL = 16}"
"{mid        | 0      | markerboard start id}"
"{m        |       | Margins size (in pixels). Default is marker separation (-s) }"
"{bb       | 1     | Number of bits in marker borders }"
"{si       | false | show generated image }";
}

int main(int argc, char *argv[]) {
    CommandLineParser parser(argc, argv, keys);
    parser.about(about);

    if(argc < 7) {
        parser.printMessage();
        return 0;
    }

    int markersX = parser.get<int>("w");
    int markersY = parser.get<int>("h");
    int markerLength = parser.get<int>("l");
    int markerSeparation = parser.get<int>("s");
    int dictionaryId = parser.get<int>("d");
    int margins = markerSeparation;
    if(parser.has("m")) {
        margins = parser.get<int>("m");
    }

    int borderBits = parser.get<int>("bb");
    bool showImage = parser.get<bool>("si");
    int marker_st_id = parser.get<int>("mid");
    String out = parser.get<String>(0);

    if(!parser.check()) {
        parser.printErrors();
        return 0;
    }

    Size imageSize;
    imageSize.width = markersX * (markerLength + markerSeparation) - markerSeparation + 2 * margins;
    imageSize.height =
        markersY * (markerLength + markerSeparation) - markerSeparation + 2 * margins;

    Ptr<aruco::Dictionary> dictionary =
    aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));

    Ptr<aruco::GridBoard> board = aruco::GridBoard::create(markersX, markersY, float(markerLength),
    float(markerSeparation), dictionary, marker_st_id);

    // show created board
    Mat boardImage;
    board->draw(imageSize, boardImage, margins, borderBits);

    if(showImage) {
        imshow("board", boardImage);
        waitKey(0);
    }

    imwrite(out, boardImage);

    return 0;
}

3.检测和姿态估计

3.1 Aruco标记的检测

cv::aruco::detectMarkers()

cv::aruco::detectMarkers(image_, dictionary_, corners, ids, detectorParams_, rejected);
参数:
(1)image :输入的需要检测标记的图像。 
(2)dictionary :进行检测的字典对象指针,这里的字典就是我们创建aruco 标记时所使用的字典,检测什么类型的aruco 标记就使用什么类型的字典。 
(3)corners :检测到的aruco 标记的角点列表,其四个角点均按其原始顺序返回 (从左上角开始顺时针旋转)(4)ids:检测到的每个标记的id,需要注意的是第三个参数和第四个参数具有相同的大小。 
(5)parameters:Detection parameters 类的对象,该对象包括在检测过程中可以自定义的所有参数。
(6)参数rejectedImgPoints 

3.2 单个Aruco码的姿态估计

Opencv之Aruco码的检测和姿态估计
cv::aruco::estimatePosesingleMarkers()

cv::aruco::estimatePoseSingleMarkers(corners, markerLength, intrinsic_matrix_, distortion_matrix_, rvecs, tvecs, _objPoints);
参数:
(1)corners :detectMarkers ()返回的检测到标记的角点列表; 
(2)markerLength :aruco 标记的实际物理尺寸,也就是打印出来的aruco标记的实际尺寸,以m为单位; 
(3)intrinsic_matrix_ :相机的内参矩阵;
(4)distortion_matrix_ :相机的畸变参数;
(5)rvecs : 标记相对于相机的旋转向量。 
(6)tvecs : 标记相对于相机的平移向量。 
(7)_objPoints :每个标记角点的对应点数组。 

通过检测到的corners,并分别对每个标记进行姿态估计。 因此,每个aruco 标记都将返回一个相对于相机的旋转向量和平移矢量,返回的点数组是将标记角点从每个标记坐标系转换到相机坐标系下的表示。 标记坐标系原点位于标记的中心,Z轴垂直于标记平面,每个标记的四个角点在其坐标系中的坐标为:(-markerLength/ 2, markerLength/2,0) (markerLength/ 2, markerLength/ 2, 0) (markerLength/2,-markerLength/2,0) (-markerLength /2,-markerLength /2,0),其中,markerLength 是aruco 标记的实际边长。

3.3 单个Aruco码板的姿态估计

Opencv之Aruco码的检测和姿态估计
1.创建aruco码板
cv::aruco::GridBoard::create()

// create board object
cv::Ptr<cv::aruco::GridBoard> gridboard =
cv::aruco::GridBoard::create(markersX, markersY, markerlength, markerseparation, dictionary_, ids[0]);
board.markerboard_ptr = gridboard.staticCast<cv::aruco::Board>();
参数:
(1)markersX: 码板的横向码的个数;
(2)markersY: 码板的纵向码的个数;
(3)markerlength: 每一个码的边长,单位m;
(4)markerseparation: 两个码之间的间隔宽度,单位m;
(5)dictionary_:字典;
(6)ids[0]:码板的第一个码的id值;

2.姿态估计
cv::aruco::estimatePoseBoard()

cv::aruco::estimatePoseBoard(corners, ids, markerboard_ptr, intrinsic_matrix_, distortion_matrix_, rvec, tvec);

码板识别的坐标系是以码板的左下角为坐标原点建立的坐标系,如图所示。

3.4 Aruco码可视化

1.坐标轴的可视化
cv::aruco::drawAxis()

cv::aruco::drawAxis(image_, intrinsic_matrix_, distortion_matrix_, rvecs[i], tvecs[i], markerLength * 2.5f);
参数:
(1)image_ :绘制坐标轴的图像;
(2)intrinsic_matrix_ :相机的内参矩阵;
(3)distortion_matrix_ :相机的畸变参数; 
(4)rvecs:旋转向量;
(5)tvecs:平移向量;
(6)markerLength :绘制坐标轴的长度,单位为m。

2.标记的可视化
cv::aruco::drawDetectedMarkers()

cv::aruco::drawDetectedMarkers(image_, board.match_corners, board.match_ids);
参数:
(1)image :绘制标记的图像;
(2)corners :检测到的aruco 标记的角点列表;
(3)ids:检测到的每个标记对应到其所属字典中的id ;
(4)borderColor :绘制标记外框的颜色;

4.应用

1.增强现实
Opencv之Aruco码的检测和姿态估计
2.激光雷达和相机的联合标定
Opencv之Aruco码的检测和姿态估计
还有很多其他的应用,这里就不举例了。文章来源地址https://www.toymoban.com/news/detail-433904.html

到了这里,关于Opencv之Aruco码的检测和姿态估计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于目标检测、跟踪 的人体姿态估计 算法进行跌倒检测 ---- fall detection

    前序文章: 深度学习与视频分析简介 视频分析:基于目标检测(YOLO)实现走路看手机检测、玩手机检测、跌倒检测等 基于深度学习算法的行为识别解决方案:打电话、玩手机、摔倒等行为动作的识别,跟踪

    2024年02月09日
    浏览(57)
  • 简要介绍 | 基于深度学习的姿态估计技术

    注1:本文系“简要介绍”系列之一,仅从概念上对基于深度学习的姿态估计技术进行非常简要的介绍,不适合用于深入和详细的了解。 注2:\\\"简要介绍\\\"系列的所有创作均使用了AIGC工具辅助 姿态估计 是计算机视觉领域的一个重要研究方向,它主要关注如何从图像或视频中提

    2024年02月09日
    浏览(40)
  • Mediapipe人体骨架检测和实时3d绘制——Mediapipe实时姿态估计

    大约两年前,基于自己的理解我曾写了几篇关于Mediapipe的文章,似乎帮助到了一些人。这两年,忙于比赛、实习、毕业、工作和考研。上篇文章已经是一年多前发的了。这段时间收到很多私信和评论,请原谅无法一一回复了。我将尝试在这篇文章里回答一些大家经常问到的问

    2024年02月03日
    浏览(60)
  • YOLOv5姿态估计:HRnet实时检测人体关键点

    前言: Hello大家好,我是Dream。 今天来学习一下 利用YOLOv5进行姿态估计,HRnet与SimDR检测图片、视频以及摄像头中的人体关键点 ,欢迎大家一起前来探讨学习~ 首先需要我们利用Pycharm直接克隆github中的姿态估计原工程文件,如果不知道怎样在本地克隆Pycharm,可以接着往下看,

    2024年01月17日
    浏览(68)
  • yolov8+多算法多目标追踪+实例分割+目标检测+姿态估计

    YOLOv8是一种先进的目标检测算法,结合多种算法实现多目标追踪、实例分割和姿态估计功能。该算法在计算机视觉领域具有广泛的应用。 首先,YOLOv8算法采用了You Only Look Once(YOLO)的思想,通过单次前向传递将目标检测问题转化为回归问题。它使用了深度卷积神经网络,能

    2024年02月20日
    浏览(47)
  • YOLOv8 人体姿态估计(关键点检测) python推理 && ONNX RUNTIME C++部署

    目录   1、下载权重 ​编辑2、python 推理 3、转ONNX格式 4、ONNX RUNTIME C++ 部署 utils.h utils.cpp detect.h detect.cpp main.cpp CmakeList.txt 我这里之前在做实例分割的时候,项目已经下载到本地,环境也安装好了,只需要下载pose的权重就可以 输出:   用netron查看一下:  如上图所是,YOLO

    2024年02月07日
    浏览(48)
  • aruco二维码检测原理详解与基于opencv的代码实现(自己详细整理)

    aruco二维码检测原理讲解及基于opencv的代码和ros功能包实现 20240403 aruco二维码介绍 aruco又称为aruco标记、aruco标签、aruco二维码等,其中 CharucoBoard GridBoard AprilTag 原理相通,只是生成字典不同,而AprilTag用于机器人领域或可编程摄像头比较多,而aruco CharucoBoard GridBoard则用于AR应用

    2024年04月13日
    浏览(49)
  • YOLOPose:除了目标检测,YOLO还能不花代价地估计人体姿态,对实时性能有要求必看!

    导读: YOLO,是一种流行的目标检测框架。如果将YOLO引入姿态检测任务中,将取得什么结果呢?这篇文章实现了单阶段的2D人体姿态检测,与自上而下或自下而上的方法不同,该方法将人体检测与关键点估计联合实现,在不采用数据增强如翻转、多尺度等情况下,实现COCO ke

    2024年02月06日
    浏览(42)
  • YOLOv8的目标对象的分类,分割,跟踪和姿态估计的多任务检测实践(Netron模型可视化)

    YOLOv8是目前最新版本,在以前YOLO版本基础上建立并加入了一些新的功能,以进一步提高性能和灵活性,是目前最先进的模型。YOLOv8旨在快速,准确,易于使用,使其成为广泛的 目标检测和跟踪,实例分割,图像分类和姿态估计任务 的绝佳选择。 YOLOv8的安装条件 Python=3.8 Py

    2024年02月11日
    浏览(40)
  • Python Opencv实践 - 人体姿态检测

            本文仍然使用mediapipe做练手项目,封装一个PoseDetector类用作基础姿态检测类。         mediapipe中人体姿态检测的结果和手部跟踪检测的结果是类似的,都是输出一些定位点,各个定位点的id和对应人体的位置如下图所示:         关于mediapipe的pose解决方案类更详细

    2024年02月03日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包