迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

OpenCV ArUco 标记

作者:迹忆客 最近更新:2023/06/01 浏览次数:

本篇文章将介绍使用 OpenCV 的 cv2.aruco.detectMarkers() 函数检测 ArUco 标记。


使用 OpenCV 检测 ArUco 标记

ArUco 标记是用于姿势估计、相机校准、机器人导航和增强现实应用的二进制图像。 在计算机视觉应用中,姿态估计非常重要和困难,但我们可以使用 ArUco 标记使其变得容易。

ArUco 标记是带有黑色边框的二进制正方形图像,内部主体为白色,根据标记而变化。 例如,ArUco 标记如下所示。

aruco marker

上面的 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()

输出:

detected markers

在上面的代码中,我们使用了 cv2.aruco.Dictionary_get() 函数来获取恢复的 ArUco 标记字典。 我们将在检测到的标记的角上循环以在它们周围画一个框并将它们的 ID 放在它们的顶部。

我们还使用了 if 语句来检查标记角是否可用。 cv2.line() 函数的第一个参数是我们想要画线的图像。

第二个和第三个参数是线的端点,第四个参数是 RGB 三元组格式的线的颜色。 第五个参数是线的宽度。

cv2.circle() 函数的第一个参数是我们要在其上绘制圆的输入图像,第二个参数是圆心,第三个参数是圆的半径,第四个参数是颜色 圆的,第五个参数用于填充圆。

cv2.putText() 函数的第一个参数是我们要放置文本的输入图像。

第二个参数是文本,第三个参数是我们要放置文本的点,第四个参数是字体样式,第五个参数是字体比例,第六个参数是文本的颜色,以及 第七个参数是文本的行宽。 我们必须使用相同的字典来创建和检测标记。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

Pandas read_csv()函数

发布时间:2024/04/24 浏览次数:254 分类:Python

Pandas read_csv()函数将指定的逗号分隔值(csv)文件读取到 DataFrame 中。

Pandas 追加数据到 CSV 中

发布时间:2024/04/24 浏览次数:352 分类:Python

本教程演示了如何在追加模式下使用 to_csv()向现有的 CSV 文件添加数据。

Pandas 多列合并

发布时间:2024/04/24 浏览次数:628 分类:Python

本教程介绍了如何在 Pandas 中使用 DataFrame.merge()方法合并两个 DataFrames。

Pandas loc vs iloc

发布时间:2024/04/24 浏览次数:837 分类:Python

本教程介绍了如何使用 Python 中的 loc 和 iloc 从 Pandas DataFrame 中过滤数据。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便