【讲解+样例】使用opencv对aruco Markers识别

news2024/9/27 14:22:09

aruco标记与传统棋盘格功能相似,但是更快更便捷。棋盘格使用移步:【鱼眼+普通相机】相机标定

一、 aruco简介

aruco又称为aruco标记、aruco标签、aruco二维码。ArUco 标记通常是正方形的黑白图案。由黑色边框和内部的二进制矩阵组成。内部矩阵编码了一个唯一的 ID。
它有不同大小的 Aruco 标记,如 4x4, 5x5, 6x6, 7x7 等,指的是内部矩阵的尺寸。aruco二维码生成网站:https://chev.me/arucogen/
在这里插入图片描述

不同的字典定义了不同的标记集,如 DICT_6X6_250 表示 6x6 大小的 250 个唯一标记。
在这里插入图片描述

1.1 aruco码具有以下优点:

  • 快速检测:设计允许快速、可靠的检测。
  • 唯一识别:每个标记都有唯一的 ID。
  • 姿态估计:可以用于计算相机相对于标记的位置和方向。
  • 抗干扰:设计考虑了抗干扰性,如旋转、部分遮挡等。 应用:

1.2 aruco码可以实现以下功能:

  1. 增强现实(AR):作为参考点来放置虚拟对象。
  2. 机器人导航:帮助机器人定位和导航。
  3. 相机校准:用于相机参数的快速校准。
  4. 物体跟踪:在视频中跟踪物体的移动。

1.3 aruco码检测过程:

图像预处理(如灰度转换、阈值化)→ 轮廓检测 → 多边形近似(找到方形候选区域) → 透视变换 → 内部矩阵解码

二、样例

1.代码

import cv2
import numpy as np

print(cv2.__version__)

# 从文件读取图像
image = cv2.imread('./markers.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 指定字典类型
dict_type = cv2.aruco.DICT_6X6_1000

# 加载预定义字典
dictionary = cv2.aruco.getPredefinedDictionary(dict_type)

# 创建Aruco参数
aruco_params = cv2.aruco.DetectorParameters()
aruco_params.adaptiveThreshWinSizeMin = 3  #
aruco_params.adaptiveThreshWinSizeMax = 80  #
aruco_params.adaptiveThreshWinSizeStep = 10  # 代表自适应阈值的窗口大小
aruco_params.adaptiveThreshConstant = 7  # 代表自适应阈值的常数
aruco_params.minMarkerPerimeterRate = 0.1  # 假设marker至少占图像的10%
aruco_params.maxMarkerPerimeterRate = 10.0  # 允许marker最大占图像的80%
aruco_params.polygonalApproxAccuracyRate = 0.1  # 代表多边形逼近的精度
aruco_params.minCornerDistanceRate = 0.05  # 代表marker的最小角距离
aruco_params.minDistanceToBorder = 0  # 代表marker的最小边界距离

# 创建Aruco检测器
detector = cv2.aruco.ArucoDetector(dictionary, aruco_params)

# 检测Aruco markers
corners, ids, rejected = detector.detectMarkers(gray)
print(f"Adaptive Threshold - Detected: {len(corners)}, Rejected: {len(rejected)}")

rej_img = image.copy()
for r in rejected:
    try:
        pts = r.reshape((-1, 1, 2)).astype(np.int32)
        cv2.polylines(rej_img, [pts], True, (0, 0, 255), 2)
    except Exception as e:
        print(f"Error drawing rejected candidate: {e}")

# 如果检测到markers,绘制它们
if ids is not None:
    print(f"Detected Aruco markers: {ids}")
    cv2.aruco.drawDetectedMarkers(image, corners, ids)

    # 遍历每个检测到的marker
    for i in range(len(ids)):
        c = corners[i][0]
        cv2.putText(image, f"id: {ids[i][0]}", (int(c[0][0]), int(c[0][1]) - 15),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

        # 绘制marker的边界框
        cv2.polylines(image, [np.int32(c)], True, (0, 255, 0), 2)

        # 计算marker的中心
        cx = int((c[0][0] + c[2][0]) / 2)
        cy = int((c[0][1] + c[2][1]) / 2)
        cv2.circle(image, (cx, cy), 2, (0, 0, 255), -1)

        # 计算marker的方向
        cv2.line(image, (cx, cy), (int(c[0][0]), int(c[0][1])), (255, 0, 0), 2)
        cv2.line(image, (cx, cy), (int(c[1][0]), int(c[1][1])), (0, 255, 0), 2)

        # 计算marker的旋转角度
        dx = c[0][0] - c[1][0]
        dy = c[0][1] - c[1][1]
        angle = np.arctan2(dy, dx)
        angle = np.degrees(angle)
        cv2.putText(image, f"angle: {angle:.1f}", (cx, cy + 15),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
        # 计算marker的尺寸
        size = np.sqrt(dx * dx + dy * dy)
        cv2.putText(image, f"size: {size:.1f}", (cx, cy + 30),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

        # 计算marker的坐标
        cv2.putText(image, f"({cx},{cy})", (cx, cy + 45),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

# 显示结果
cv2.imshow('gray', gray)
cv2.imshow('Image with rejected candidates', rej_img)
cv2.imshow("Aruco markers", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.结果

在这里插入图片描述

三、参考

  1. opencv: https://docs.opencv.org/3.1.0/d5/dae/tutorial_aruco_detection.html
  2. 开源AR库ArUco的原理与位姿估计实战
  3. [OpenCV] aruco Markers识别
  4. https://blog.csdn.net/sinat_16643223/article/details/137357584

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2170216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

63.HDMI显示器驱动设计与验证-彩条实验

(1)常见的视频传输接口有三种: VGA 接口、 DVI 接口和 HDMI 接口,目前的显示设备都配有这三种视频传输接口。三类视频接口的发展历程为 VGA→DVI→HDMI。其中 VGA 接口出现最早,只能传输模拟图像信号; 随后…

CSS 背景属性概览:颜色、图像、位置、组合及透明

目录 非 VIP 用户可前往公众号回复“css”进行免费阅读 background - color background - image background - repeat background - position background - attachment background组合 背景透明 非 VIP 用户可前往公众号回复“css”进行免费阅读 background - color …

Stable Diffusion绘画 | SDXL模型的优缺点及模型推荐

现在 SD 已经开始全面进入 SDXL 的高分辨率时代。 SDXL 模型的优点 学习参数最多的模型:参数总量超过100亿,可对标 Midjourney 分辨率提升4倍:底模分辨率直接为 1024 x 1024 多出 Refiner 采样重构器:能增加更多的细节 更强的提示…

2024上海工博会,正运动展位新品与应用方案(二)

上海,9月26日,上海工博会已成功开展三天。正运动展位(6.1H-E261)依然人气高涨,吸引了众多专业观众和行业同仁的关注。精彩仍在继续~ 展会现场 01 多元工业应用场景方案展示 DEMO应用演示在本次展会上&…

云打包p12苹果证书和profile文件在线制作流程

使用hbuilderx的uniapp框架,除了开发小程序外,还可以打包出原生的安卓或苹果应用。 假如是打包安卓应用个,则需要安卓证书。 而假如打包ios应用,则需要p12格式的苹果证书和苹果证书的profile文件。其中苹果证书可以理解为基于非…

c++----继承(初阶)

大家好呀,今天我们也是多久没有更新博客了,今天来讲讲我们c加加中的一个比较重要的知识点继承。首先关于继承呢,大家从字面意思看,是不是像我们平常日常生活中很容易出现的,比如说电视剧里面什么富豪啊,去了…

CDF 累积分布函数图 怎么看

以上图为例,图中有五个数据集,每条曲线代表每个数据集中流的数量,然后我以蓝色的线条为例去解释怎么看这个图。 红色的方框的点说明,dataset-1中流数量少于500的app占全部app的20%;紫色的方框的点说明,da…

win10下NAT 端口转发及ssh VMware ubuntu24虚拟机

问题:win10无法访问VMware ubuntu24虚拟机。ping不通,ssh不通。 现象: 无法设置网桥模式。原因不明。win10 网络连接 中没有vmnet0 网桥模式。win10 网络连接 中,有vmnet8的NAT模式,有vmnet1的仅主机模式。VMware ub…

【Redis】Linux下安装配置及通过C++访问Redis

文章目录 一、Linux Centos 7.0版本下的安装及配置二、通过C访问Redis 一、Linux Centos 7.0版本下的安装及配置 通过源来安装,此次安装的版本为 redis 5.0 的,要通过其他源进行安装,首先安装 scl 源 yum install centos-release-scl-rh再安…

【LeetCode】每日一题 2024_9_26 数组元素和与数字和的绝对差(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动! 题目:数组元素和与数字和的绝对差 代码与解题思路 func differenceOfSum(nums []int) int {sum1, sum2 : 0, 0for _, v : range nums {sum1 vfor v > 0 {sum2 v%10v / 10}}return sum1-s…

教师工作量在线管理服务

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…

dockerfile部署springboot项目(构建镜像:ebuy-docker:v1.0)

文章目录 1、docker部署Mysql2、dockerfile构建镜像1.1、在idea中导入课件中的项目资料\day01\ebuy-docker1.2、修改项目application.yml数据库连接参数1.3、启动项目访问测试:http://localhost:8081/1.4、执行mvn package命令进行项目打包1.5、虚拟机中新建目录/op…

高性能计算秘密武器:NVIDIA B100与B200如何让你的HPC性能飙升?

嘿,各位科技界的狂热粉丝、AI领域的探索先锋,你们是否正站在高性能计算(HPC)的十字路口,寻找那把能开启全新纪元的钥匙?今天,就让我带你深入剖析NVIDIA的最新力作——B100与B200,一同…

C++结尾

面试题 1.什么是虚函数?什么是纯虚函数 在定义函数时前面加virtual。虚函数是为了,父子类中只有一个该函数。如果在子类重写虚函数,那么用的就是子类重写的虚函数;如果子类没有重写虚函数,那么调用的是父类继承的虚函…

【JAVA开源】基于Vue和SpringBoot的网上租赁系统

本文项目编号 T 050 ,文末自助获取源码 \color{red}{T050,文末自助获取源码} T050,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计5.4.1 用…

生信软件37 - 基于测序reads的变异进行单倍型分型工具WhatsHap

1. WhatsHap简介 WhatsHap是一种使用DNA测序reads的基因组变异进行定相(分型)的软件,即基于reads的定相或单倍型组装,特别适用于长reads (三代测序数据),但也兼容短reads的定相。 Whatshap特点…

Ubuntu22.04安装cudnn详细步骤

下载指定版本的cudnn https://developer.nvidia.com/rdp/cudnn-archive#a-collapse804-111 安装 sudo dpkg -i cudnn-local-repo-ubuntu2204-8.9.7.29_1.0-1_amd64.deb 根据上步提示: sudo cp /var/cudnn-local-repo-ubuntu2204-8.9.7.29/cudnn-local-08A7D361-…

【C++】STL标准模板库容器set

🦄个人主页:修修修也 🎏所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 📌关联式容器set(集合)简介 📌set(集合)的使用 🎏set(集合)的模板参数列表 🎏set(集合)的构造函数 🎏set(集合)的迭代…

【算法题】72. 编辑距离-力扣(LeetCode)

【算法题】72. 编辑距离-力扣(LeetCode) 1.题目 下方是力扣官方题目的地址 72. 编辑距离 给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。 你可以对一个单词进行如下三种操作: 插入一个字符删除一个字符替换一个…

哈希算法以及容器实现

哈希 一,哈希算法1.什么是哈希2.哈希产生的原因3.常见哈希算法4.闭散列( 哈希表)1.线性探测2.二次探测 5.开散列(哈希桶)1.开散列插入2.开散列扩容 二,代码实现1.哈希表2.哈希桶1.迭代器的实现2.底层容器的…