Es ist eine etwas alte Technologie, aber Sie können sie an der Selbstpositionsschätzung des Robotersystems erkennen. Ich möchte den AR-Marker ausprobieren Ich habe versucht, ArUco mit dem Raspberry Pi zu erkennen, den ich bekommen habe.
Es sieht so aus, um das Ausführungsergebnis zu sehen. (https://www.youtube.com/watch?v=aepFM_JsxbU) Der Umriss des Markers sowie die ID- und xyz-Achsen werden angezeigt. Weil man auch Pitch Roll Yaw bekommen kann Es kann für verschiedene Zwecke verwendet werden.
Umgebung ・ RasPi4 (sollte mit RasPi3 funktionieren) ・ USB-Kamera (Logitech) → Raspi-Kamera ist ebenfalls erhältlich.
Zunächst nach folgendem Artikel von "Karaage" einrichten. OpenCV ist für die Erkennung erforderlich. Es war sehr glatt. Ich bin immer dankbar. ・ [Erstellen einer Bilderkennungsumgebung mit tiefem Erlernen von Raspberry Pi 4 von null bis 1 Stunde] (https://karaage.hatenadiary.jp/entry/rpi4-dl-setup)
Installieren Sie zusätzliche Pakete Wie im Artikel erwähnt, habe ich alles einmal eingefügt. ・ [Setup für erweitertes Lernen von Raspberry Pi 4] (https://note.com/npaka/n/n034c8ee6e5cc)
Jetzt bist du bereit.
Markergenerierung → Generierung finden Sie unter dem folgenden Link. ・ (Kamerakalibrierung) → Wenn Sie es vorerst verschieben möchten, schalten Sie es aus. ・ Markererkennung ・ Schätzung der AR-Markerhaltung mit Python
・ Sie sollten es durch Kopieren verwenden können.
ARdetect.py
#!/usr/bin/env python
# -*- coding: utf-8 -*
import numpy as np
import cv2
from cv2 import aruco
def main():
cap = cv2.VideoCapture(1) #Ändern Sie den Wert abhängig von der verwendeten Kamera
#Markergröße
marker_length = 0.056 # [m]
#Auswahl des Marker-Wörterbuchs
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
#camera_matrix = np.load("mtx.npy")
#distortion_coeff = np.load("dist.npy")
#Wenn Sie die Kamera kalibriert haben, verwenden Sie die oben genannten Schritte.
camera_matrix = np.array( [[1.42068235e+03,0.00000000e+00,9.49208512e+02],
[0.00000000e+00,1.37416685e+03,5.39622051e+02],
[0.00000000e+00,0.00000000e+00,1.00000000e+00]] )
distortion_coeff = np.array( [1.69926613e-01,-7.40003491e-01,-7.45655262e-03,-1.79442353e-03, 2.46650225e+00] )
while True:
ret, img = cap.read()
corners, ids, rejectedImgPoints = aruco.detectMarkers(img, dictionary)
aruco.drawDetectedMarkers(img, corners, ids, (0,255,255))
if len(corners) > 0:
#Prozess durch Marker
for i, corner in enumerate(corners):
rvec, tvec, _ = aruco.estimatePoseSingleMarkers(corner, marker_length, camera_matrix, distortion_coeff)
#Entfernen Sie unnötige Achsen
tvec = np.squeeze(tvec)
rvec = np.squeeze(rvec)
#Vom Rotationsvektor in Rodorigues konvertieren
rvec_matrix = cv2.Rodrigues(rvec)
rvec_matrix = rvec_matrix[0] #Aus Rodorigues extrahiert
#Übersetzung des Translationsvektors
transpose_tvec = tvec[np.newaxis, :].T
#Synthetik
proj_matrix = np.hstack((rvec_matrix, transpose_tvec))
#Umrechnung in Eulerwinkel
euler_angle = cv2.decomposeProjectionMatrix(proj_matrix)[6] # [deg]
print("ID : " + str(ids[i]))
#Visualisierung
draw_pole_length = marker_length/2 #Echte Länge[m]
aruco.drawAxis(img, camera_matrix, distortion_coeff, rvec, tvec, draw_pole_length)
cv2.imshow('drawDetectedMarkers', img)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
if __name__ == '__main__':
main()
Bitte verwenden Sie es, wenn das Generieren schwierig ist.
Recommended Posts