一、什麼是Aruco?
Aruco 是一款基於OpenCV的開源圖像識別軟件包,用於解決物體的識別、姿態估計、跟蹤等問題。其中「AR」使用電腦圖像技術實現了對象的增強現實。
二、Aruco的工作流程
在圖像處理中,一般流程是:
- 獲取圖像,
- 對圖像進行預處理,如降噪、增強對比度等操作,
- 識別目標,
- 標定目標位置。
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