📜  显示 aruco 标记轴 opencv python (1)

📅  最后修改于: 2023-12-03 14:55:11.645000             🧑  作者: Mango

显示 ArUco 标记轴 OpenCV Python

ArUco 是一种常用的视觉标记,用于室内机器人的定位和姿态估计,其具有良好的鲁棒性和易于检测的特性。本文将介绍如何使用 OpenCV Python 模块来检测 ArUco 标记并显示相应的标记轴。

安装 OpenCV

要使用 OpenCV Python 模块,需要先安装 OpenCV。以下是在 Ubuntu 系统上安装 OpenCV 的命令:

sudo apt-get install python3-opencv

在其他平台上安装 OpenCV 的方法可以在 OpenCV 官网上找到。

检测 ArUco 标记

要检测 ArUco 标记,首先需要生成相应的标记。可以使用 OpenCV Python 模块提供的 cv2.aruco 函数来生成标记:

import cv2
dictionary = cv2.aruco.Dictionary_get(cv2.aruco.DICT_6X6_250)
marker_image = cv2.aruco.drawMarker(dictionary, 23, 200)

以上代码将生成一个 6×6 字典中 ID 为 23 的标记,并返回标记图像。

下一步是检测图像中的 ArUco 标记。可以使用 cv2.aruco 模块中的 cv2.aruco.detectMarkers 函数进行检测,并返回标记的 ID、标记的角点位置和相机内外参等信息:

import cv2
dictionary = cv2.aruco.Dictionary_get(cv2.aruco.DICT_6X6_250)
parameters = cv2.aruco.DetectorParameters_create()
corners, ids, rejectedImgPoints = cv2.aruco.detectMarkers(image, dictionary, parameters=parameters)

以上代码将检测图像中的 ArUco 标记,并返回标记的角点位置和标记的 ID。

显示标记轴

要显示标记轴,可以使用 cv2.aruco 模块中的 cv2.aruco.drawAxis 函数。该函数需要传入相机内外参和标记角点的位置信息,并返回带有标记轴的图像。

import cv2
dictionary = cv2.aruco.Dictionary_get(cv2.aruco.DICT_6X6_250)
parameters = cv2.aruco.DetectorParameters_create()
corners, ids, rejectedImgPoints = cv2.aruco.detectMarkers(image, dictionary, parameters=parameters)

rvecs, tvecs, _ = cv2.aruco.estimatePoseSingleMarkers(corners, marker_length, camera_matrix, dist_coeffs)

image = cv2.aruco.drawAxis(image, camera_matrix, dist_coeffs, rvecs, tvecs, marker_length)

以上代码将估计标记的旋转向量和平移向量,并在图像上绘制带有标记轴的标记。

完整代码

以下代码展示了如何检测并显示 ArUco 标记轴。在这里,我们使用预先保存的图像来进行检测。

import cv2

image = cv2.imread("marker.png")
marker_length = 1

dictionary = cv2.aruco.Dictionary_get(cv2.aruco.DICT_6X6_250)
parameters = cv2.aruco.DetectorParameters_create()
corners, ids, rejectedImgPoints = cv2.aruco.detectMarkers(image, dictionary, parameters=parameters)

if ids is not None:
    rvecs, tvecs, _ = cv2.aruco.estimatePoseSingleMarkers(corners, marker_length, camera_matrix, dist_coeffs)

    image = cv2.aruco.drawDetectedMarkers(image, corners)
    image = cv2.aruco.drawAxis(image, camera_matrix, dist_coeffs, rvecs, tvecs, marker_length)

cv2.imshow("ArUco Marker", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
结语

本文介绍了使用 OpenCV Python 模块来检测 ArUco 标记并显示标记轴的方法。希望读者可以通过本文了解到这一技术,并在实际应用中得到更好的性能。