本文给出一个用 Python 实现的实时检测 apriltag 标识的程序,分为基础版和升级版,在ubuntu下连接USB摄像头就能实现实时检测,VMware虚拟机和树莓派都实测可用。

1、基础版

import cv2
import apriltag

# 创建 apriltag 检测器
options = apriltag.DetectorOptions(families='tagStandard41h12')
detector = apriltag.Detector(options)

# 打开摄像头
cap = cv2.VideoCapture(0)

while True:
    # 读取当前帧
    ret, frame = cap.read()

    # 将当前帧转化为灰度图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # 检测 apriltag 图像
    detections = detector.detect(gray)

    # 绘制检测框
    for detection in detections:
        pts = detection.corners
        pts = pts.astype(int)
        cv2.polylines(frame, [pts], True, (0, 255, 0), 2)

    # 显示帧
    cv2.imshow('frame', frame)

    # 按下 'q' 键退出程序
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

相关解释:
apriltag 库是一个基于 C++ 实现的标识检测算法库,可以实现在常规摄像头下直接检测标记。在 Python 中使用 apriltag 库需要将其封装为 Python 库,使用 apriltag.py 提供的接口。

在程序中,首先导入了 cv2 和 apriltag 库,然后创建了一个 DetectorOptions 对象,指定了所使用的标识族。然后创建一个 Detector 对象,后面会使用该对象中的方法来检测图像。

在程序的主循环中,先读取当前帧,然后将其转化为灰度图像。接着使用 detector.detect() 方法,检测图像中的标识,返回检测到的标记的位置和角度信息。最后绘制框出检测到的标记区域,并将当前帧显示出来。如果用户按下 ‘q’ 键,则退出程序,并释放相关资源。

在这个程序中,使用了 cv2 库进行图像处理和显示,使用了 apriltag 库进行标识检测。程序首先需要使用 pip 安装 cv2 库和 apriltag 库。若是python3则用pip3 install。

2、升级版

升级版的程序主要添加了以下功能:
1)在检测到标记时,输出相关的打印信息,包括检测到标记,并输出标记中心点与图像中心点的偏差
2)在未检测到标记时,输出相关的打印信息,指示未检测到标记
3)对图像进行放大,增加了可视性
4)添加了程序主循环的计时统计,包括总帧数、平均帧时间、最小帧时间和最大帧时间,最后打印统计结果

效果图:
请添加图片描述

升级版程序下载链接:
USB摄像头实时检测Apriltag的python代码树莓派ubuntu可用

Apriltag标准图片包下载:
Apriltag标准图片包

在线Apriltag / ArUco标签生成器:
https://chev.me/arucogen/

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐