【OpenCV】ArUco Marker

这篇博客介绍了如何利用OpenCV的Aruco模块创建、检测Aruco标记,并进行标志块的位姿估计。首先展示了创建不同ID和尺寸的Aruco标记的代码,然后演示了在图像中检测多个Aruco标记的过程,最后通过相机矩阵和畸变系数估算标记的旋转和平移向量。

1. 创建

import cv2 as cv
import numpy as np

# 创建
dictionary = cv.aruco.getPredefinedDictionary(dict=cv.aruco.DICT_6X6_250)
img = cv.aruco.drawMarker(dictionary, id=23, sidePixels=200, borderBits=1)
# id         指定该Marker在字典中的索引ID,该例中合法的ID为[0, 249]
# sidePixels 指定输出的Marker图像的尺寸,单位是像素,该例中为(200,200)
#            如果使用DICT_6X6_250,则编码区域被划分为6X6个等大小的模块
#            参数borderBits=1,所以整个标志块区域被划分为8X8个等大小的模块
#            模块的尺寸必须大于一个像素。因此该例中,此参数最小值为8
# borderBits 指定编码区域到标志块区域的距离。单位是编码模块。取值必须大于等于1
print(img.shape)
cv.imshow("Aruco Marker", img)
cv.waitKey()

在这里插入图片描述

2. 检测

2.1 创建检测图像

# 创建图像
img_detected = np.ones((800, 600), dtype=np.uint8) * 255
img_detected[50:100, 50:100] = cv.aruco.drawMarker(dictionary, id=23, sidePixels=50, borderBits=1)
img_detected[350:400, 350:400] = cv.aruco.drawMarker(dictionary, id=18, sidePixels=50, borderBits=1)
img_detected[450:500, 450:500] = cv.aruco.drawMarker(dictionary, id=33, sidePixels=50, borderBits=1)
cv.imshow("img_detected", img_detected)
cv.waitKey()

在这里插入图片描述

2.2 检测

corners, ids, rejectedImgPoints = cv.aruco.detectMarkers(image=img_detected,
                                                         dictionary=dictionary,
                                                         parameters=None)
img_color = cv.cvtColor(img_detected, cv.COLOR_GRAY2BGR)
cv.aruco.drawDetectedMarkers(img_color, corners, ids)
cv.imshow("DectectedMarker", img_color)
cv.waitKey()

在这里插入图片描述

3. 标志块位姿估计

camera_matrix = np.array([[532.79536562, 0, 342.4582516],
                          [0, 532.91928338, 233.90060514],
                          [0, 0, 1.]])
dist_coefs = np.array([-2.81086258e-01, 2.72581018e-02, 1.21665908e-03, -1.34204275e-04, 1.58514022e-01])

rvecs, tvecs, _objPoints = cv.aruco.estimatePoseSingleMarkers(corners, 0.05, camera_matrix, dist_coefs)
for i in range(len(rvecs)):
    cv.aruco.drawAxis(img_color, camera_matrix, dist_coefs, rvecs[i], tvecs[i], 0.05)

cv.imshow("Pose Estimation", img_color)
cv.waitKey()

在这里插入图片描述

### OpenCV Aruco 使用教程 #### 简介 ArUco模块属于OpenCV contrib扩展库的一部分,因此要正常工作需先安装该扩展库[^1]。此模块允许开发者利用特定的标记进行诸如增强现实的任务处理[^2]。 #### 安装依赖项 为了能够使用ArUco功能,除了常规版本外还需要额外配置带有contrib支持的OpenCV环境。可以通过pip命令来完成这一操作: ```bash pip install opencv-contrib-python ``` #### 创建并显示ArUco标记 可以借助Python脚本来生成所需的ArUco标签图片文件。这里给出一段简单示例代码用于创建单个ID编号为`marker_id=0`的标准4x4_50字典下的ArUco标记图像,并保存至本地磁盘位置。 ```python import numpy as np import cv2 def generate_aruco_marker(marker_size, marker_id, dictionary=cv2.aruco.DICT_4X4_50): aruco_dict = cv2.aruco.Dictionary_get(dictionary) tag = np.zeros((300, 300), dtype=np.uint8) cv2.aruco.drawMarker(aruco_dict, marker_id, marker_size, tag, 1) filename = f'marker_{dictionary}_{marker_id}.png' cv2.imwrite(filename, tag) if __name__ == '__main__': generate_aruco_marker(300, 0) ``` 这段程序会基于给定参数自动生成对应规格大小及唯一识别码的黑白方格图案作为最终输出结果之一[^5]。 #### 检测ArUco标记 对于已知场景内的ArUco标记定位任务而言,则可通过调用`cv2.aruco.detectMarkers()`函数快速获取目标区域内所有可见标记的具体坐标信息。以下是具体实现过程中的几个关键环节说明[^3]: - **指定使用的ArUco字典**: 这里指定了想要解析的那种类型的编码体系; - **设置检测器参数对象**: 调整一些影响算法性能表现的因素选项; - **执行实际探测动作**: 对输入帧数据集实施扫描分析进而返回匹配成功的实例列表。 下面是完整的Python代码片段用来读取摄像头流并对其中出现过的任意符合条件的对象作出响应: ```python import cv2 from cv2 import aruco cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) aruco_dict = aruco.getPredefinedDictionary(aruco.DICT_6X6_250) parameters = aruco.DetectorParameters_create() corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, aruco_dict, parameters=parameters) if ids is not None: aruco.drawDetectedMarkers(frame, corners, ids) cv2.imshow('frame', frame) key = cv2.waitKey(1) & 0xFF if key == ord('q'): break cap.release() cv2.destroyAllWindows() ``` 上述循环结构将持续不断地从设备采集最新画面直至用户主动终止进程为止,在这期间每当发现新的有效信号源即刻更新可视化界面以直观反映当前状态变化情况[^4]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhy29563

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值