🎯 使用 OpenCV 實現 ArUco 碼識別與坐標軸繪制(含Python源碼)
Aruco 是一種廣泛用于機器人、增強現實(AR)和相機標定的方形標記系統。本文將帶你一步一步使用 Python + OpenCV 實現圖像中多個 ArUco 碼的檢測與坐標軸顯示,最終實現“識別 + 姿態估計 + 坐標系可視化”的完整功能。
🧰 準備工作
首先,確保你安裝了 OpenCV 的完整版本(含 aruco
模塊):
pip install opencv-python opencv-contrib-python
📷 相機內參與畸變參數
要繪制每個 ArUco 碼的坐標軸,我們必須知道相機的內參和畸變參數。
示例內參(請替換為你自己的標定結果):
camera_matrix = np.array([[800, 0, 320],[0, 800, 240],[0, 0, 1]
], dtype=np.float32)dist_coeffs = np.zeros((5, 1)) # 假設無畸變
📌 注:真實使用中建議通過 OpenCV 標定獲得準確的相機參數,否則坐標軸可能會顯示錯誤。
🧪 ArUco 碼識別與坐標系繪制代碼
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.05if ids is not None:# 繪制檢測到的 ArUco 邊框與 IDaruco.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 碼
- 如何繪制檢測結果和每個碼的姿態坐標軸
- 如何利用相機內參進行精確的三維可視化