學習如何使用Aruco進行圖像識別和跟蹤

一、什麼是Aruco?

Aruco 是一款基於OpenCV的開源圖像識別軟件包,用於解決物體的識別、姿態估計、跟蹤等問題。其中「AR」使用電腦圖像技術實現了對象的增強現實。

二、Aruco的工作流程

在圖像處理中,一般流程是:

  1. 獲取圖像,
  2. 對圖像進行預處理,如降噪、增強對比度等操作,
  3. 識別目標,
  4. 標定目標位置。

Aruco的工作流程大致也是如此,只是在第三和第四步中的所識別和標定的目標是二維碼、碼盤等圖形。

三、如何進行二維碼的識別與標定

下面一個完整的Aruco二維碼的識別以及標定工作示例:

import cv2
import cv2.aruco as aruco

# 讀取圖像,轉為灰度圖像
img = cv2.imread('marker.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 創建aruco字典對象
aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)

# 創建aruco參數對象
parameters = aruco.DetectorParameters_create()

# 檢測所有的角落
corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, aruco_dict, parameters=parameters)

# 繪製所有的角落
img = aruco.drawDetectedMarkers(img, corners)

# 顯示圖像
cv2.imshow("result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

這段代碼中,我們首先讀入一張圖片,並將其轉為灰度圖像。接着,我們創建了一個aruco字典對象,並創建了一個aruco參數對象。然後,我們調用aruco.detectMarkers()方法檢測出所有的角落。最後,我們使用aruco.drawDetectedMarkers()方法將所有的角落繪製出來並顯示圖像。

四、如何進行姿態估計

下面一個完整的Aruco二維碼的姿態估計工作示例:

import cv2
import cv2.aruco as aruco
import numpy as np

# 讀取圖像,轉為灰度圖像
img = cv2.imread('marker.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 創建aruco字典對象
aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)

# 創建aruco參數對象
parameters = aruco.DetectorParameters_create()

# 檢測所有的角落
corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, aruco_dict, parameters=parameters)

# 獲取相機矩陣和畸變係數
camera_matrix = np.array([[500, 0, 320], [0, 500, 240], [0, 0, 1]])
dist_coeffs = np.zeros((4, 1))

# 估計每個marker的位姿
rvec, tvec, _ = aruco.estimatePoseSingleMarkers(corners, 1, camera_matrix, dist_coeffs)

# 把位姿估計結果繪製到圖像上
for i in range(len(ids)):
    aruco.drawAxis(img, camera_matrix, dist_coeffs, rvec[i], tvec[i], 1)
    
# 顯示圖像
cv2.imshow("result", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

這段代碼中,我們首先讀入一張圖片,並將其轉為灰度圖像。接着,我們創建了一個aruco字典對象,並創建了一個aruco參數對象。然後,我們調用aruco.detectMarkers()方法檢測出所有的角落。接下來,我們給出相機的內參和畸變參數。然後,我們調用aruco.estimatePoseSingleMarkers()方法估計每個marker的位姿。最後,我們使用aruco.drawAxis()方法將位姿繪製出來並顯示圖像。

五、如何進行跟蹤

下面是一個Aruco二維碼跟蹤示例:

import cv2
import cv2.aruco as aruco
import numpy as np

# 獲取相機矩陣和畸變係數
camera_matrix = np.array([[500, 0, 320], [0, 500, 240], [0, 0, 1]])
dist_coeffs = np.zeros((4, 1))

# 創建aruco字典對象
aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)

# 創建aruco參數對象
parameters = aruco.DetectorParameters_create()

# 打開攝像頭
cap = cv2.VideoCapture(0)

# 執行跟蹤
while True:
    ret, frame = cap.read()
    if ret:
        # 轉為灰度圖像
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        
        # 檢測所有的角落
        corners, ids, rejectedImgPoints = aruco.detectMarkers(gray, aruco_dict, parameters=parameters)

        # 估計每個marker的位姿
        rvecs, tvecs, _ = aruco.estimatePoseSingleMarkers(corners, 1, camera_matrix, dist_coeffs)

        # 把位姿估計結果繪製到圖像上
        if ids is not None:
            for i in range(len(ids)):
                aruco.drawAxis(frame, camera_matrix, dist_coeffs, rvecs[i], tvecs[i], 1)
                  
        # 顯示圖像
        cv2.imshow("frame", frame)
        
        # 按Esc鍵退出程序
        if cv2.waitKey(1) == 27:
            break
            
# 釋放攝像頭並銷毀所有窗口
cap.release()
cv2.destroyAllWindows()

這段代碼中,我們首先給出相機的內參和畸變參數。然後,我們創建了一個aruco字典對象,並創建了一個aruco參數對象。接下來,我們打開攝像頭,不斷執行跟蹤。
在循環中,我們首先讀取一幀圖像,並將其轉為灰度圖像。接着,我們調用aruco.detectMarkers()方法檢測出所有的角落,再使用aruco.estimatePoseSingleMarkers()方法估計每個marker的位姿,最後使用aruco.drawAxis()方法將位姿繪製出來並在圖像上顯示。

六、總結

本文詳細講解了如何使用Aruco進行圖像識別和跟蹤。通過本文的學習,讀者可以掌握Aruco的基本使用,了解其在圖像識別和跟蹤中的應用。讀者可以在此基礎上進一步擴展相關應用,突破更多技術難題。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/247409.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:20
下一篇 2024-12-12 13:20

相關推薦

發表回復

登錄後才能評論