OpenCV ArUco 标记
本篇文章将介绍使用 OpenCV 的 cv2.aruco.detectMarkers() 函数检测 ArUco 标记。
使用 OpenCV 检测 ArUco 标记
ArUco 标记是用于姿势估计、相机校准、机器人导航和增强现实应用的二进制图像。 在计算机视觉应用中,姿态估计非常重要和困难,但我们可以使用 ArUco 标记使其变得容易。
ArUco 标记是带有黑色边框的二进制正方形图像,内部主体为白色,根据标记而变化。 例如,ArUco 标记如下所示。
上面的 ArUco 标记是使用网站生成的。 我们必须选择字典、标记 ID 和标记大小才能使用该网站生成 ArUco 标记。
ArUco 标记由 ArUco 字典、标记大小和标记 ID 组成。 例如,一个 4x4_100 字典由 100 个标记组成,4x4 标记大小意味着标记由 25 位组成,每个标记将有一个唯一的 ID。
如果我们使用 ArUco 标记的预定义字典,则标记 ID 将从 0 开始,并以字典支持的最大标记数结束。 检测过程将返回 ArUco 标记的四个角和标记 ID。
在第一步中,该算法将分析给定的图像以找到方形图像。 该算法将获得给定图像中存在的所有形状的计数器,这将提供有关形状角的信息,而不是正方形的形状将被丢弃。
在第二步中,算法将分析剩余形状的内部编码。 标记位将使用阈值计算,白色和黑色位将被分开。
该算法将检查这些位是否属于任何 ArUco 词典。 如果这些位属于特定的 ArUco 字典,则将返回标记的 ID。
我们可以使用 OpenCV 的 detectMarkers() 函数来检测 ArUco 标记。 detectMarkers()
函数的第一个参数是包含 ArUco 标记的输入图像。
detectMarkers()
函数的第二个参数是我们要搜索以查找 ArUco 标记的字典。 第三个参数是检测参数,我们可以使用 cv2.aruco.DetectorParameters_create()
函数创建用于检测 ArUco 标记的默认参数。
detectMarkers()
函数返回三个输出参数:标记角、标记 ID 和拒绝标记。 找到 ArUco 标记的角后,我们将使用循环使用 cv2.line()
函数在检测到的标记周围绘制一个正方形。
我们还将使用 cv2.putText()
函数将标记 ID 放在检测到的标记之上。 我们还可以使用 cv2.circle()
函数标记标记的中心。
例如,让我们使用 cv2.aruco.detectMarkers()
函数检测图像中存在的 ArUco 标记。 请参阅下面的代码。
import imutils
import cv2
aruco_image = cv2.imread('aruco markers.png')
aruco_image = imutils.resize(aruco_image, width=600)
cv2.imshow('img',aruco_image)
cv2.waitKey(0)
Aruco_Dict = cv2.aruco.Dictionary_get(cv2.aruco.DICT_5X5_100)
Aruco_Params = cv2.aruco.DetectorParameters_create()
(marker_corners, marker_id, rejected_markers) = cv2.aruco.detectMarkers(aruco_image, Aruco_Dict,parameters=Aruco_Params)
if len(marker_corners) > 0:
marker_id = marker_id.flatten()
for (markerCorner, markerID) in zip(marker_corners, marker_id):
marker_corners = markerCorner.reshape((4, 2))
(top_Left, top_Right, bottom_Right, bottom_Left) = marker_corners
top_Right = (int(top_Right[0]), int(top_Right[1]))
bottom_Right = (int(bottom_Right[0]), int(bottom_Right[1]))
bottom_Left = (int(bottom_Left[0]), int(bottom_Left[1]))
top_Left = (int(top_Left[0]), int(top_Left[1]))
cv2.line(aruco_image, top_Left, top_Right, (255, 0, 0), 2)
cv2.line(aruco_image, top_Right, bottom_Right, (255, 0, 0), 2)
cv2.line(aruco_image, bottom_Right, bottom_Left, (255, 0, 0), 2)
cv2.line(aruco_image, bottom_Left, top_Left, (255, 0, 0), 2)
cX = int((top_Left[0] + bottom_Right[0]) / 2.0)
cY = int((top_Left[1] + bottom_Right[1]) / 2.0)
cv2.circle(aruco_image, (cX, cY), 4, (0, 255, 0), -1)
cv2.putText(aruco_image, str(markerID),(top_Left[0], top_Left[1]-5), cv2.FONT_HERSHEY_SIMPLEX,2, (255, 0, 0), 2)
print("Aruco Marker ID: {}".format(markerID))
cv2.imshow("Image", aruco_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出:
在上面的代码中,我们使用了 cv2.aruco.Dictionary_get()
函数来获取恢复的 ArUco 标记字典。 我们将在检测到的标记的角上循环以在它们周围画一个框并将它们的 ID 放在它们的顶部。
我们还使用了 if 语句来检查标记角是否可用。 cv2.line()
函数的第一个参数是我们想要画线的图像。
第二个和第三个参数是线的端点,第四个参数是 RGB 三元组格式的线的颜色。 第五个参数是线的宽度。
cv2.circle()
函数的第一个参数是我们要在其上绘制圆的输入图像,第二个参数是圆心,第三个参数是圆的半径,第四个参数是颜色 圆的,第五个参数用于填充圆。
cv2.putText()
函数的第一个参数是我们要放置文本的输入图像。
第二个参数是文本,第三个参数是我们要放置文本的点,第四个参数是字体样式,第五个参数是字体比例,第六个参数是文本的颜色,以及 第七个参数是文本的行宽。 我们必须使用相同的字典来创建和检测标记。
相关文章
OpenCV 包配置
发布时间:2023/06/01 浏览次数:159 分类:Python
-
OpenCV 是一个机器学习库,提供与计算机视觉应用程序相关的各种功能。 OpenCV 可以与 C++、Python、Java 和 MATLAB 一起使用。下面我们将列出安装和运行 OpenCV 时的一些常见问题以及如何解决这些问
使用 OpenCV 在图像上使用 Bitwise_AND
发布时间:2023/06/01 浏览次数:199 分类:Python
-
按位运算符通常用于对使用单个位操作的位或二进制数的模式执行按位运算。 OpenCV 使用相同的概念来处理和提取图像中的信息。在本文中,我们将具体了解如何使用 Python OpenCV 库来使用 Bitwi
OpenCV 中的图像遮罩
发布时间:2023/06/01 浏览次数:55 分类:Python
-
如果我们想过滤掉图像的某些部分,然后将这个过滤掉的部分与另一幅图像结合起来,那么这可以使用遮罩来完成。 在 OpenCV 中,按位与运算符用于将两个不同的图像合并为一个,或者它可以将
Mac 中 Python 没有名为 CV2 的模块
发布时间:2023/06/01 浏览次数:83 分类:Python
-
我们将通过示例介绍如何在Python中正确安装和导入OpenCV模块。在 Python 的 Mac 中没有名为 CV2 的模块 首先,我们必须了解什么是 OpenCV 以及为什么在 Python 中使用它。
用 Python 发送带附件的电子邮件
发布时间:2023/06/01 浏览次数:84 分类:Python
-
本篇文章将介绍如何使用Python发送带附件的邮件。 为此,我们不需要外部库来发送邮件。 相反,我们导入一个名为 smtplib 的模块并使用它,因为邮件是通过 SMTP 协议发送的。 让我们看看我们该
在 Python 中验证电子邮件地址
发布时间:2023/06/01 浏览次数:76 分类:Python
-
有一些内置功能(例如正则表达式)和库(例如 dnspython)可以帮助完成这些过程。 本文将解释如何使用这些功能和库在 Python 中验证电子邮件。在 Python 中使用正则表达式验证电子邮件
使用 Python 向多个地址发送电子邮件
发布时间:2023/06/01 浏览次数:125 分类:Python
-
在本文中,我们将演示如何使用 Python 编程语言向使用不同电子邮件地址的不同收件人发送电子邮件。 具体来说,我们将向许多不同的人发送电子邮件。使用 Python 向多个地址发送电子邮件
Python 中的 SendGrid
发布时间:2023/06/01 浏览次数:129 分类:Python
-
SendGrid 是一家 SMTP 服务提供商,提供 Web API 以允许客户处理集成信息。 通过该服务提供的 API 密钥,可以在很短的时间内轻松发送各种电子邮件。
Python 线程优先级
发布时间:2023/06/01 浏览次数:159 分类:Python
-
使用 Python 线程,我们可以同时运行程序的不同部分,使您的程序设计更容易。 如果您了解一些 Python,我们将向您展示如何使用线程来加速您的 Python 程序。Python 中的线程