Dieses Mal, als ich eine Demo des Systems machte, um den Unterrichtsmaterialien zu folgen, war ich gezwungen, dem AR-Marker zu folgen, also mein eigenes Memo zu dieser Zeit.
Mit dem arconv von OpneCV können Sie AR-Marker identifizieren und deren Koordinaten und Winkel aus Bildern entnehmen. [^ 1]
Generieren Sie vorerst einen AR-Marker.
make.py
#/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import sys
#Aruco Bibliothek
aruco = cv2.aruco
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
def make():
for i in range(30):
generator = aruco.drowMarker(dictionary, i, 100)
cv2.imwrite('ar' + str(i) + 'png', generator)
if __name__ == '__main__';
make():
Wenn Sie diese Datei ausführen, sollten Sie 30 AR-Markierungsbilder haben.
Dieses Mal werden wir ar1.png verwenden.
Als nächstes schauen wir uns das eigentliche Programm an. Zunächst wird das Bild erfasst und die Bildgröße erfasst und in der Größe geändert.
main.py
while True:
#Holen Sie sich Bilder von der Videoaufnahme
ret, frame = cap.read()
#Holen Sie sich Größe
Height, Width = frame.shape[:2]
# resize
img = cv2.resize(frame,(int(Width),int(Height)))
Als nächstes wird der Marker erkannt und identifiziert und die Mittelkoordinaten werden erhalten.
main.py
#Marker erkennen
corners, ids, rejectedImgPoints = aruco.detectMarkers(img, dictionary)
if len(corners) > 0:
#print(ids[0])
#Wenn der Marker 01 erkannt wird
if ids[0] == 1:
square_points = np.reshape(np.array(corners), (4, -1))
G = np.mean(square_points, axis = 0)
x = G[0]
y = G[1]
#Geben Sie den Koordinatenpunkt an, mit dem Sie übereinstimmen möchten
markerrect = [[x,y-40]]
print(markerrect)
for rect in markerrect:
img_x = rect[0]
img_y = rect[1]
Zu diesem Zeitpunkt werden die Bewegungskoordinaten berechnet. Der Wert muss in Abhängigkeit vom Winkel geändert werden, in dem das Servo installiert ist. Passen Sie die Einstellungen entsprechend an. Da es außerdem erforderlich war, die Aufwärtsbewegung zu begrenzen, um zu verhindern, dass der Betriebsbereich überschritten wird, wurde der Wert kontinuierlich ersetzt, wenn die y-Koordinate den angegebenen Wert überschritt.
main.py
#Koordinatensatz verschieben
move_degree_x = now_degree_x - (img_x-160)*0.06
move_degree_y = now_degree_y - (img_y-50)*0.06
#Verhinderung des Überschreitens des Bewegungsbereichs
if move_degree_y > 650:
move_degree_y = 650
print('deg: ', move_degree_x , move_degree_y)
pwm.set_pwm(15, 0, int(move_degree_x))
pwm.set_pwm(14, 0, int(move_degree_y))
#Koordinatensatz nach dem Verschieben
now_degree_x = move_degree_x
now_degree_y = move_degree_y
Adafruit_PCA9685 wurde zur Steuerung des Servomotors verwendet. [^ 2] Damit können mehrere Servomotoren gesteuert werden.
Das Endergebnis ist wie folgt.
main.py
#/usr/bin/env python3
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import time
import Adafruit_PCA9685
#Aruco Bibliothek
aruco = cv2.aruco
dictionary = aruco.getPredefinedDictionary(aruco.DICT_4X4_50)
class MarkerCtl():
def arReader(self,Sb):
# initial
pwm = Adafruit_PCA9685.PCA9685()
pwm.set_pwm_freq(60)
pwm.set_pwm(14, 0, 600)
time.sleep(1)
pwm.set_pwm(15, 0, 450)
time.sleep(1)
#Starten Sie die Videoaufnahme
cap = cv2.VideoCapture(0)
cap.set(3, 320)
cap.set(4, 240)
color = (255, 255, 255)
#Aktueller Servostatus eingestellt
now_degree_x, now_degree_y, move_degree_x, move_degree_y = 450, 600, 0, 0
while True:
#Holen Sie sich Bilder von der Videoaufnahme
ret, frame = cap.read()
#Holen Sie sich Größe
Height, Width = frame.shape[:2]
# resize
img = cv2.resize(frame,(int(Width),int(Height)))
#Marker erkennen
corners, ids, rejectedImgPoints = aruco.detectMarkers(img, dictionary)
if len(corners) > 0:
#print(ids[0])
#Wenn der Marker 01 erkannt wird
if ids[0] == 1:
square_points = np.reshape(np.array(corners), (4, -1))
G = np.mean(square_points, axis = 0)
x = G[0]
y = G[1]
#Geben Sie den Koordinatenpunkt an, mit dem Sie übereinstimmen möchten
markerrect = [[x,y-40]]
print(markerrect)
for rect in markerrect:
img_x = rect[0]
img_y = rect[1]
#print('img: ',img_x, img_y)
#Koordinatensatz verschieben
move_degree_x = now_degree_x - (img_x-160)*0.06
move_degree_y = now_degree_y - (img_y-50)*0.06
#Verhinderung des Überschreitens des Bewegungsbereichs
if move_degree_y > 650:
move_degree_y = 650
print('deg: ', move_degree_x , move_degree_y)
pwm.set_pwm(15, 0, int(move_degree_x))
pwm.set_pwm(14, 0, int(move_degree_y))
#Koordinatensatz nach dem Verschieben
now_degree_x = move_degree_x
now_degree_y = move_degree_y
#Verarbeitung beenden
cap.release()
cv2.destroyAllWindows()
[^ 1]: "[Programmieren mit Python] Ich habe versucht, den AR-Marker mithilfe der Aruco-Bibliothek zu erkennen." Http://okatenari.com/2017/11/28/python-ar/
Recommended Posts