Sprungbewegung in Python 3

Zweck des Artikels

Es gibt einen Motion Tracker namens Leap Motion. Mit dieser API für Python habe ich versucht, den Abstand zwischen Daumen und Zeigefinger in Echtzeit zu ermitteln. Es gibt viele Artikel, die Ihnen zeigen, wie Sie Leap Motion in Python verwenden, aber in meiner Umgebung lief es nicht reibungslos. Also werde ich die Methode als mein eigenes Memo belassen.

Umgebung

Zuerst in Python 2.x.

Die Python-API von Leap Motion unterstützt nur Python 2.x. Ich werde es später auf Python 3 ausführen, aber zuerst werde ich es auf Python 2.7 ausführen. Erstellen Sie mit Anaconda eine Python 2.7-Umgebung.

Vorbereiten des Leap Motion SDK

Laden Sie dann das Desktop SDK (https://developer.leapmotion.com/setup/desktop) von der Leap Motion Developer Site (https://developer.leapmotion.com/setup) herunter. Es gibt V2- und V4-Optionen, aber wählen Sie V2.

Wenn Sie die DL-Zip-Datei entpacken, befindet sich ein Installationsprogramm im Inneren. Führen Sie es also aus. (← Ist es nicht notwendig, wenn Sie Visualizer nicht benötigen?) danach, C:\Program Files\Leap Motion Core Services\Visualizer.exe Wenn Sie ausführen, können Sie die Funktion von Leap Motion überprüfen. Versuchen wir es also.

ss1.png

Wenn in Visualizer nichts angezeigt wird, lesen Sie bitte diesen Artikel und führen Sie dpinst64.exe aus, um den Treiber zu installieren.

Zusammen mit dem Installationsprogramm gibt es einen Ordner namens LeapSDK. Darüber hinaus scheint es, dass durch das Importieren von lib / Leap.py darin Leap Motion von Python aus verarbeitet werden kann. Wenn Sie beispielsweise in dasselbe Verzeichnis wie Leap.py und "import" wechseln, wird "Importfehler: Kein Modul mit dem Namen LeapPython" angezeigt. Unter Bezugnahme auf diesen Artikel mit Leap.py Kopieren Sie den Inhalt von LeapSDK / lib / x64 und \ _ \ _ init \ _ \ _.py (leere Datei) in einen Ordner (hier leapmotion genannt). Wenn Sie in das Verzeichnis wechseln, in dem sich leapmotion befindet, und "aus leapmotion Leap" aus Python importieren, können Sie die Leap Motion-API verwenden.

Verwenden der Leap Motion-API

Artikel hier und [Offizielle Dokumente](https://developer-archive.leapmotion.com/documentation/v2/python/ Verwenden Sie devguide / Leap_Overview.html) und dir (), um den Abstand zwischen Daumen und Zeigefinger auszugeben.

Wenn Sie Folgendes tun, können Sie anscheinend die Informationen der Hand in diesem Moment als "Rahmen" abrufen.

controller = Leap.Controller()
frame = controller.frame()

Übrigens, wenn Sie "controller.frame (1)" ausführen, scheinen Sie die Informationen einen Frame zuvor abrufen zu können.

Die Fingerinformationen von "frame" werden in "frame.fingers" gespeichert. Die Informationen jedes Fingers scheinen wie folgt abgerufen zu werden.

frame.fingers[0]    # <-Daumen
frame.fingers[1]    # <-Zeigefinger
frame.fingers[2]    # <-Mittelfinger (Mittelfinger)
frame.fingers[3]    # <-Ring (Medizinfinger
frame.fingers[4]    # <-Pinky (kleiner Finger

Gehen Sie wie folgt vor, um den Abstand zwischen der Spitze Ihres Daumens und dem Zeigefinger auszugeben.

pos_thumb = frame.fingers[0].tip_position
pos_index = frame.fingers[1].tip_position
print(pos_thumb.distance_to(pos_index))

Zusammenfassend sieht es so aus.

from time import sleep

from packages.leapmotion import Leap

controller = Leap.Controller()

THUMB = 0
INDEX = 1
MIDDLE = 2
RING = 3
PINKY = 4

while not controller.is_connected:
    print('Connecting...')
    sleep(.5)
    pass
print('...Connected!')

while True:
    sleep(.01)
    frame = controller.frame()

    pos_thumb = frame.fingers[THUMB].tip_position
    pos_index = frame.fingers[INDEX].tip_position

    print(pos_thumb.distance_to(pos_index))

Läuft auf Python 3

Dieser Artikel Ich werde es basierend auf tun. Der Unterschied zur Einstellung im Artikel besteht darin, dass Sie 64-Bit-Windows und Python Ver. Is 3.7 verwenden.

Swig Verwenden Sie Swig, um ein Programm für Python zu generieren.

Installation

Installieren Sie Swig unter Windows unter Diese Site. Die neueste Version zum Zeitpunkt des Schreibens des Artikels war 4.0.1, aber es scheint einen Fehler zu verursachen, wenn es 4.0.0 oder höher ist (Referenz). Ich erhalte (wahrscheinlich) keinen Fehler in 3.0.12, aber ich verwende 2.0.9, wie im Artikel erwähnt. Gehen wir so weit, den Pfad zu swig.exe zur Umgebungsvariablen PATH hinzuzufügen.

Das Skript überarbeiten

Erstellen Sie einen geeigneten Ordner und kopieren Sie die folgenden Dateien.

Ich kann Swig in diesem Ordner ausführen, aber Leap.i scheint nicht gut genug zu sein und ich erhalte eine Fehlermeldung. Lesen Sie diesen Artikel und beheben Sie ihn manuell. Öffnen Sie Leap.i in einem Texteditor. Der Teil in% pythoncode {%}} ist der Code für Python, aber es gibt einen Fehler im Einzug (Absenken). Korrigieren Sie die Teile, die nicht eingerückt werden müssen, z. B. vor "def", so dass keine Einrückungen vorhanden sind und die anderen Einrückungen leer sind. Verlassen Sie vorerst Repaired Leap.i.

Geben Sie an der Eingabeaufforderung "cd" an den Speicherort dieses Ordners ein und geben Sie den folgenden Befehl ein.

swig -c++ -python -o LeapPython.cpp -interface LeapPython Leap.i

Wenn Sie eine Fehlermeldung erhalten, überprüfen Sie den Leap.i-Einzug basierend darauf erneut. Bei Erfolg werden Leap.py, LeapPython.cpp und LeapPython.h im selben Ordner erstellt.

Visual Studio Kompilieren Sie mit Visual Studio die zuvor generierte LeapPython.cpp, damit sie in Python ausgeführt werden kann.

Installation

Für Python 3.7 müssen Sie die Version 2017 anstelle der neuesten Version 2019 vorbereiten (Referenz. )), Also werde ich das DL. https://docs.microsoft.com/ja-jp/visualstudio/releasenotes/vs2017-relnotes ss2.png Wählen Sie Download Enterprise 2017 und DL und starten Sie das Installationsprogramm. ss4.png Ich wusste nicht, was ich tun sollte, also habe ich die Desktop-Entwicklung mit C ++ auf der Registerkarte Workload überprüft und installiert.

Erstellen Sie ein leeres Projekt

Wählen Sie in der Menüleiste [Datei] → [Neu] → [Projekt]. Wählen Sie im Menü links [Visual C ++] → [Projekt leeren]. Legen Sie einen Namen und einen Ort fest und klicken Sie auf [OK]. ss9.png Kopieren Sie den gesamten Inhalt des Ordners, in den Sie Swig verschoben haben, in den Projektordner (nur LeapPython.cpp?). Es ist dasselbe Verzeichnis wie die Datei mit den Filtern.

Verschiedene Einstellungen

[Ansicht] → [Projektmappen-Explorer]. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Projektnamen und wählen Sie [Hinzufügen] → [Vorhandenes Element]. [Hinzufügen] aller Dateien, die Sie zuvor aus dem Swig-abgeschlossenen Ordner kopiert haben.

Klicken Sie anschließend erneut mit der rechten Maustaste auf den Projektnamen und wählen Sie [Eigenschaften]. Wenn Sie keine Eigenschaften sehen, wechseln Sie mit den Symbolen oben von der Ordneransicht zur Lösungsansicht (siehe Abbildung unten). ss5.png Klicken Sie auf Configuration Manager und ändern Sie die Kalibrierung in Release und die Plattform in x64. Wählen Sie das Menü [Allgemein], setzen Sie [Zielname] auf LeapPython und setzen Sie [Konfigurationstyp] auf Dynamische Bibliothek (.dll). ss6.png Öffnen Sie als Nächstes das Menü [C / C ++] -> [Allgemein] und geben Sie den Python-Include-Ordner im zusätzlichen Include-Verzeichnis an. Zum Beispiel in meiner Anaconda (Miniconda) -Umgebung C: \ Benutzer \ (Benutzername) \ Miniconda3 \ envs \ (Umgebungsname) \ include Es ist wie es ist. ss7.png Wechseln Sie dann zum Menü Linker-> Eingabe und fügen Sie den vollständigen Pfad zu Leap.lib und python37.lib in den zusätzlichen Abhängigkeiten hinzu. python37.lib sollte sich an der folgenden Stelle befinden. C: \ Benutzer \ (Benutzername) \ Miniconda3 \ envs \ (Umgebungsname) \ libs \ python37.lib ss8.png Die Einstellung ist abgeschlossen. Lassen Sie uns das Grundstück schließen.

Bauen

Führen Sie die Kompilierung aus. Klicken Sie mit der rechten Maustaste auf den Projektnamen → [Erstellen] Wenn Sie eine Fehlermeldung erhalten, stellen Sie sicher, dass python33.lib und Leap.lib für 64-Bit sind. Wenn der Build abgeschlossen ist, wird LeadPython.dll im angezeigten Verzeichnis erstellt. Benennen Sie es in .pyd um. Setzen Sie vorerst Generated LeadPython.pyd.

Führen Sie Python 3.7 aus

Öffnen Sie den Ordner, in dem Sie \ _ \ _ init \ _ \ _. Py erstellt haben, indem Sie sich in den Inhalt des Leap SDK vertiefen, das unter Python 2.7 ausgeführt wurde. Ersetzen Sie von diesen Leap.py und LeapPython.pyd durch die von Swig oder Visual Studio generierten.

Schließlich müssen Sie auch Leap.py manuell reparieren. Öffnen wir es mit einem Texteditor. Hier und da gibt es zusätzliche%, also löschen Sie sie bitte. Es ist schneller, wenn Sie 2 Leerzeichen mit halber Breite +% ersetzen und löschen. Überarbeiteter Leap.py ist hier.

Jetzt können Sie die Leap Motion-Daten in Python 3.7 wie in Python 2.7 abrufen.

Kombiniere mit PsychoPy (Bonus)

Schreiben Sie ein Skript wie dieses ↓

leapmotion.py


from time import sleep

from .leapsdk import Leap


class LeapMotion:
    def __init__(self):
        self.controller = Leap.Controller()
        self.fingers = {'thumb': 0,
                        'index': 1,
                        'middle': 2,
                        'ring': 3,
                        'pinky': 4}

        while not self.controller.is_connected:
            sleep(.5)

    def calc_dist(self, finger_from: str, finger_to: str):
        frame = self.controller.frame()
        pos_from = frame.fingers[self.fingers[finger_from]].tip_position
        pos_to = frame.fingers[self.fingers[finger_to]].tip_position
        return pos_from.distance_to(pos_to)

Bewegen Sie es so ↓

from time import sleep

from packages.device.leapmotion import LeapMotion

from psychopy import visual

leapmotion = LeapMotion()
window = visual.Window(
    colorSpace='rgb255',
    fullscr=False,
    size=(900, 900),
    allowGUI=True,
    wintype='pygame',
    units='pix')
circle = visual.Circle(window, size=1, autoDraw=True)

while True:
    circle.size = leapmotion.calc_dist('thumb', 'index')
    window.flip()
    sleep(.01)
    print(leapmotion.calc_dist('thumb', 'index'))

Es sieht aus wie das! ↓ ezgif-7-145ce88082b1.gif

MinGW anstelle von Visual Studio (fehlgeschlagen)

Ich habe versucht, es mit g ++ zu kompilieren, das mit MinGW installiert wurde, aber es hat nicht funktioniert. Führen Sie eine Aufzeichnung, bis sie stecken bleibt.

Installation

Installieren Sie MinGW-w64 basierend auf diesem Artikel. Es ist in Ordnung, wenn Sie es Ihrem Pfad hinzufügen. Übrigens habe ich in meinem Fall Folgendes hinzugefügt. C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin

Dann, an der Eingabeaufforderung, cd in den Swig-Ordner und

g++ -I C:\Users\issakuss\Miniconda3\envs\study09t\include LeapPython.cpp Leap.lib C:\Users\issakuss\Miniconda3\envs\study09t\libs\python37.lib -shared -o LeapPython.pyd 

Ich dachte, ich könnte das Gleiche tun wie in Visual Studio, aber ich hatte viele Fehler. ss10.png Wenn ich es hier tun könnte, wäre es einfacher gewesen, weil ich Visual Studio nicht installieren müsste.

Recommended Posts

Sprungbewegung in Python 3
Holen Sie sich LeapMotion-Daten in Python.
Versuchen Sie es mit LeapMotion mit Python
So führen Sie LeapMotion mit Nicht-Apple Python aus
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Doppelte Pendelbewegungsgleichung in Python
Sortierte Liste in Python
Clustertext in Python
AtCoder # 2 jeden Tag mit Python
Täglicher AtCoder # 6 in Python
Täglicher AtCoder # 18 in Python
Bearbeiten Sie Schriftarten in Python
Singleton-Muster in Python
Dateioperationen in Python
Lesen Sie DXF mit Python
Täglicher AtCoder # 53 in Python
Tastenanschlag in Python
Verwenden Sie config.ini mit Python