[PYTHON] Folgen Sie der AR-Markierung mit einem 2-Achsen-Servo

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.

Implementierungsablauf

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. スクリーンショット 2019-07-27 14.01.53.PNG

Dieses Mal werden wir ar1.png verwenden. スクリーンショット 2019-07-27 14.01.53.jpg

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

Folgen Sie der AR-Markierung mit einem 2-Achsen-Servo
Folgen Sie der Dateihierarchie mit fts
Durchsuche das Labyrinth mit dem Python A * -Algorithmus
Ein Memo, das die Achsenspezifikation der Achse erklärt
Ein Modell, das die Gitarre mit fast.ai identifiziert
[Python] Holen Sie sich die Dateien mit Python in den Ordner
So zeichnen Sie ein 2-Achsen-Diagramm mit Pyplot
Finden Sie mit NumPy die Position über dem Schwellenwert
Speichern Sie das Objekt in einer Datei mit pickle
Erstellen Sie ein Übersetzungswerkzeug mit dem Translate Toolkit
matplotlib: Ersetzen Sie die Achse selbst durch eine andere.
Zeichnen Sie mit PyQtGraph Teil 5 ein Diagramm. Erhöhen Sie die Y-Achse
Ein Memo zum visuellen Verstehen der Achse von Pandas.Panel
So erstellen Sie ein Untermenü mit dem Plug-In [Blender]
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
Machen Sie mit Python einen Haltepunkt auf der c-Ebene
Die Geschichte, eine harte Zeit mit der gemeinsamen Menge HTTP_PROXY = ~ zu haben
Versuchen Sie, den Servomotor mit RasPi (180-Grad-Version) zu bewegen.
Füllen Sie den Hintergrund mit einer einzigen Farbe mit OpenCV2 + Python
Visualisieren Sie das charakteristische Vokabular eines Dokuments mit D3.js.
Erstellen Sie eine Tweet-Heatmap mit der Google Maps-API
Ein Memo, dass ich den Datenspeicher mit Python berührt habe
Übergang zum Update-Bildschirm mit dem Django-Tag
Berechnen Sie das Produkt von Matrizen mit einem Zeichenausdruck?