本帖用作中国机器人大赛暨RoboCup机器人世界杯中国赛、中国高校智能机器人创意大赛某些赛项视觉部分的参考。

众所周知,某些机器人竞赛的视觉部分往往需要对二维码进行定位,然后才能进行一系列操作,比如对贴有二维码的标靶进行攻击从而将其击倒。

在这一过程中,最常用的方法就是AprilTag,可以获取二维码角点坐标、中心点坐标等信息。下面代码可用作参考:

import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'simHei' # 正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号

img_path = r"你自己的图像" # 换成你自己二维码图像的路径

# 读取图像
img_bgr = cv2.imread(img_path, cv2.IMREAD_COLOR)
img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)

# AprilTag 检测
detections = None
backend = None


from pupil_apriltags import Detector
backend = "pupil_apriltags"
detector = Detector(
    families="tag36h11",  # 常用家族;如果你用别的家族可改
    nthreads=2,
    quad_decimate=1.0,
    quad_sigma=0.0,
    refine_edges=1,
    decode_sharpening=0.25,
    debug=0
)


detections = detector.detect(img_gray, estimate_tag_pose=False)


if len(detections) == 0:
    print("未发现目标")


# 取第一个检测到的tag(如果图里有多个,可按需要筛选)
det = detections[0]


corners = np.array(det.corners, dtype=np.float32)  # shape (4,2)
center = np.array(det.center, dtype=np.float32)    # shape (2,)

for i, (x, y) in enumerate(corners):
    print(f"角点坐标[{i}]: ({x:.2f}, {y:.2f})")
    
print(f"中心点(x, y): ({center[0]:.2f}, {center[1]:.2f})")


# 在图像上绘制角点+中心点
vis = img_bgr.copy()
radius = 3
thickness = -1  # 实心

# 角点:绿色
for (x, y) in corners:
    cv2.circle(vis, (int(round(x)), int(round(y))), radius, (0, 255, 0), thickness)

# 中心点:红色
cv2.circle(vis, (int(round(center[0])), int(round(center[1]))), radius, (0, 0, 255), thickness)

# 绘制二维码边线
for i in range(4):
    p1 = tuple(np.round(corners[i]).astype(int))
    p2 = tuple(np.round(corners[(i + 1) % 4]).astype(int))
    cv2.line(vis, p1, p2, (255, 0, 0), 2)


vis_rgb = cv2.cvtColor(vis, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(10, 8))
plt.imshow(vis_rgb)
plt.title("AprilTag二维码角点与中心点定位")
plt.axis("off")
plt.show()

做出来效果长这样:

有些人可能会问了,煮波煮波,我不用AprilTag可以吗,我之前采集了差不多一千张二维码图像用来训练YOLOv8,mAP50可以干到0.98,鲁棒性也比AprilTag强。我的看法是,涉及二维码识别的问题,AprilTag应该是最传统、最有效的方法之一,就煮波打过的比赛里面,二维码识别问题用的方法全是AprilTag,效果足以应付比赛需求,而且速度也很快。用YOLOv8之类的乱七八糟的方法的确在精度上也能达到媲美甚至超越AprilTag的水平,但是机器人竞赛要兼顾视觉部分的实时性和准确性,虽然某些方法可能有更高的抗干扰能力,但是实际比赛中能让AprilTag失效的极端环境似乎并不常见?而且它们的帧率在我看来很难达到AprilTag的水平,可能会拖慢机器的运行速度。

机器人竞赛中,为了便于二维码检测,往往会将机器调整到正对二维码的位置,此时双目相机视线可近似为垂直于二维码平面,双目相机视线与二维码平面的角点近似于二维码平面中心点。机器所配置相机在获取图像时,图像畸变、图像噪声等干扰因素几乎可以忽略。完全正对时,二维码图案近似为长宽比为1的矩形,不考虑矩形透射变换操作。针对机器高速运动时所获取图像中的运动模糊问题,可适当降低机器运动速度、或加入目标点位停顿功能、或在软件层面加入一系列图像预处理。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐