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