使用 OpenCV 实现 ArUco 码识别与坐标轴绘制

🎯 使用 OpenCV 实现 ArUco 码识别与坐标轴绘制(含Python源码)

Aruco 是一种广泛用于机器人、增强现实(AR)和相机标定的方形标记系统。本文将带你一步一步使用 Python + OpenCV 实现图像中多个 ArUco 码的检测与坐标轴显示,最终实现"识别 + 姿态估计 + 坐标系可视化"的完整功能。


🧰 准备工作

首先,确保你安装了 OpenCV 的完整版本(含 aruco 模块):

bash 复制代码
pip install opencv-python opencv-contrib-python

📷 相机内参与畸变参数

要绘制每个 ArUco 码的坐标轴,我们必须知道相机的内参和畸变参数。

示例内参(请替换为你自己的标定结果):

python 复制代码
camera_matrix = np.array([
    [800, 0, 320],
    [0, 800, 240],
    [0,   0,   1]
], dtype=np.float32)

dist_coeffs = np.zeros((5, 1))  # 假设无畸变

📌 注:真实使用中建议通过 OpenCV 标定获得准确的相机参数,否则坐标轴可能会显示错误。


🧪 ArUco 码识别与坐标系绘制代码

python 复制代码
import cv2
import cv2.aruco as aruco
import numpy as np

# 读取图像
image = cv2.imread('your_image.jpg')  # 替换为你的图像路径
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 加载 ArUco 字典和检测参数
aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)
parameters = aruco.DetectorParameters_create()

# 检测 ArUco 标记
corners, ids, rejected = aruco.detectMarkers(gray, aruco_dict, parameters=parameters)

# 相机参数(需根据你自己相机情况修改)
camera_matrix = np.array([
    [800, 0, 320],
    [0, 800, 240],
    [0,   0,   1]
], dtype=np.float32)

dist_coeffs = np.zeros((5, 1))  # 简化处理,假设无畸变

# 设置坐标轴长度(单位视实际情况而定)
axis_length = 0.05

if ids is not None:
    # 绘制检测到的 ArUco 边框与 ID
    aruco.drawDetectedMarkers(image, corners, ids)

    # 遍历每个检测到的 ArUco 码,估计姿态并绘制坐标轴
    for i in range(len(ids)):
        rvec, tvec, _ = aruco.estimatePoseSingleMarkers(corners[i], 0.05, camera_matrix, dist_coeffs)
        aruco.drawAxis(image, camera_matrix, dist_coeffs, rvec, tvec, axis_length)
    
    print("Detected ArUco IDs:", ids.flatten())
else:
    print("No ArUco markers detected.")

# 显示结果图像
cv2.imshow("Aruco Marker with Axes", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

🔍 运行效果

运行后你会看到每个 ArUco 码不仅被识别并绘制出边框,还会有一个三维坐标轴覆盖在上面:

  • 红色:X 轴
  • 绿色:Y 轴
  • 蓝色:Z 轴(垂直于平面)

这对于调试机器人视觉系统或验证相机姿态估计非常有用。


🧠 常见问题

❓ 没有检测到 ArUco 码?

  • 检查图像中是否清晰可见 ArUco 码。
  • 确保使用了正确的字典(如:DICT_6X6_250)。
  • 尝试增加图像对比度或使用高分辨率图像。

❓ 坐标轴显示不对?

  • 检查相机内参是否正确。
  • 确保 ArUco 实际尺寸与你设置的一致(代码中 0.05 代表码的边长是 5cm)。

📘 总结

通过本文你已经学会了:

  • 如何使用 OpenCV 检测 ArUco 码
  • 如何绘制检测结果和每个码的姿态坐标轴
  • 如何利用相机内参进行精确的三维可视化

相关推荐
测试员周周7 小时前
【Appium 系列】第16节-WebView-H5上下文切换 — 混合应用的自动化难点
运维·开发语言·人工智能·功能测试·appium·自动化·测试用例
测试19987 小时前
软件测试 - 单元测试总结
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
K姐研究社9 小时前
怎么用AI制作电商口播视频,开拍APP一键生成
人工智能·音视频
LaughingZhu9 小时前
Product Hunt 每日热榜 | 2026-05-21
前端·人工智能·经验分享·chatgpt·html
曲幽9 小时前
我用了FastApiAdmin后,连夜把踩过的坑都整理出来了
redis·python·postgresql·vue3·fastapi·web·sqlalchemy·admin·fastapiadmin
传说故事10 小时前
【论文阅读】MotuBrain: An Advanced World Action Model for Robot Control
论文阅读·人工智能·具身智能·wam
北京耐用通信10 小时前
全域适配工业场景耐达讯自动化Modbus TCP 转 PROFIBUS 网关轻松实现以太网与现场总线互通
网络·人工智能·网络协议·自动化·信息与通信
火山引擎开发者社区10 小时前
TRAE × 火山引擎 Supabase:为你的 AI 应用装上“数据引擎”
人工智能
小a彤11 小时前
GE 在 CANN 五层架构中的位置
人工智能·深度学习·transformer
前端若水11 小时前
会话管理:创建、切换、删除对话历史
前端·人工智能·python·react.js