Leap Motion dans Python 3

Objet de l'article

Il existe un suivi de mouvement appelé Leap Motion. En utilisant cette API pour Python, j'ai essayé d'obtenir la distance entre le pouce et l'index en temps réel. Il existe de nombreux articles qui vous montrent comment utiliser Leap Motion en Python, mais cela ne s'est pas déroulé sans heurts dans mon environnement. Je vais donc laisser la méthode comme mon propre mémo.

environnement

Première en Python 2.x

L'API Python de Leap Motion ne prend en charge que Python 2.x. Je l'exécuterai plus tard sur la série Python 3, mais je l'exécuterai d'abord sur Python 2.7. Créez un environnement Python 2.7 à l'aide d'Anaconda.

Préparation du SDK Leap Motion

Ensuite, téléchargez le SDK de bureau (https://developer.leapmotion.com/setup/desktop) à partir du site des développeurs Leap Motion (https://developer.leapmotion.com/setup). Il existe des options V2 et V4, mais choisissez V2.

Lorsque vous décompressez le zip DL, il y a un programme d'installation à l'intérieur, alors exécutons-le. (← Est-ce inutile si vous n'avez pas besoin de Visualizer?) ensuite, C:\Program Files\Leap Motion Core Services\Visualizer.exe Si vous exécutez, vous pouvez vérifier le fonctionnement de Leap Motion, alors essayons-le.

ss1.png

Si rien ne s'affiche dans Visualizer, reportez-vous à cet article et exécutez dpinst64.exe pour installer le pilote.

Avec le programme d'installation, il existe un dossier appelé LeapSDK. De plus, il semble que Leap Motion puisse être géré depuis Python par ʻimport lib / Leap.py dedans. Cependant, par exemple, si vous vous déplacez dans le même répertoire que Leap.py et ʻimport, vous obtiendrez ʻErreur d'importation: aucun module nommé Leap Python. En référence à [cet article](https://blog.mezquita.jp/archives/4043), avec Leap.py Copiez le contenu de LeapSDK / lib / x64 et \ _ \ _ init \ _ \ _.py (fichier vide) dans un dossier (nommé leapmotion ici). Si vous vous déplacez vers le répertoire où se trouve leapmotion et que vous effectuez from leapmotion import Leap` depuis Python, vous pouvez utiliser l'API Leap Motion.

Utilisation de l'API Leap Motion

Articles par ici et [Documents officiels](https://developer-archive.leapmotion.com/documentation/v2/python/ Utilisez devguide / Leap_Overview.html) et dir () pour afficher la distance entre votre pouce et votre index.

Si vous faites ce qui suit, il semble que vous pouvez obtenir les informations de la main à ce moment-là en tant que frame.

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

Au fait, si vous faites controller.frame (1), il semble que vous puissiez obtenir les informations une image avant.

Les informations de doigt de «frame» sont stockées dans «frame.fingers». Les informations de chaque doigt semblent être récupérées comme suit.

frame.fingers[0]    # <-Pouce
frame.fingers[1]    # <-Index (index
frame.fingers[2]    # <-Milieu (majeur
frame.fingers[3]    # <-Anneau (doigt de médecine
frame.fingers[4]    # <-Pinky (petit doigt

Pour afficher la distance entre le bout de votre pouce et votre index, procédez comme suit.

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

En résumé, ça ressemble à ça.

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))

Fonctionne sur Python 3

Cet article Je le ferai basé sur. La différence avec le paramètre de l'article est que vous utilisez Windows 64 bits et Python Ver. Is 3.7.

Swig Demandez-leur de générer un programme pour Python en utilisant Swig.

Installation

Installez Swig sur Windows en vous référant à Ce site. La dernière version au moment de la rédaction de l'article était 4.0.1, mais elle semble provoquer une erreur si elle est 4.0.0 ou ultérieure (Référence). Je n'obtiens pas d'erreur (probablement) dans la version 3.0.12, mais j'utilise la version 2.0.9 comme mentionné dans l'article. Allons jusqu'à ajouter le chemin de swig.exe à la variable d'environnement PATH.

Retravailler le script

Créez un dossier approprié et copiez les fichiers suivants.

Je peux exécuter Swig dans ce dossier, mais Leap.i ne semble pas être assez bon et j'obtiens une erreur. Reportez-vous à cet article et corrigez-le manuellement. Ouvrez Leap.i dans un éditeur de texte. La partie incluse dans % pythoncode {%}} est le code pour Python, mais il y a une erreur dans le retrait (abaissement). Corrigez les parties qui n'ont pas besoin d'être indentées, comme avant «def», afin qu'il n'y ait pas d'indentations et que les autres indentations soient vides. Pour le moment, quittez Repaired Leap.i.

À l'invite de commande, cd à l'emplacement de ce dossier et entrez la commande suivante.

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

Si vous obtenez un message d'erreur, vérifiez à nouveau le retrait Leap.i en fonction de celui-ci. En cas de succès, Leap.py, LeapPython.cpp et LeapPython.h seront créés dans le même dossier.

Visual Studio À l'aide de Visual Studio, compilez le LeapPython.cpp généré précédemment afin qu'il puisse être exécuté à partir de Python.

Installation

Pour Python 3.7, vous devez préparer la version 2017 au lieu de la dernière version 2019 (Référence )), Donc je vais DL ça. https://docs.microsoft.com/ja-jp/visualstudio/releasenotes/vs2017-relnotes ss2.png Sélectionnez Télécharger Enterprise 2017 et DL et lancez le programme d'installation. ss4.png Je ne savais pas quoi faire, alors j'ai vérifié Desktop Development avec C ++ dans l'onglet Workload et l'ai installé.

Créer un projet vide

Dans la barre de menus, sélectionnez [Fichier] → [Nouveau] → [Projet]. Sélectionnez [Visual C ++] → [Projet vide] dans le menu de gauche. Choisissez un nom et un emplacement, puis [OK]. ss9.png Copiez tout le contenu du dossier dans lequel vous avez déplacé Swig dans le dossier du projet (LeapPython.cpp seul?). C'est le même répertoire que le fichier contenant des .filters.

Divers réglages

[Affichage] → [Explorateur de solutions]. Cliquez avec le bouton droit sur le nom du projet dans l'Explorateur de solutions et sélectionnez [Ajouter] → [Élément existant]. [Ajouter] tous les fichiers que vous avez copiés à partir du dossier terminé par Swig précédemment.

Ensuite, cliquez à nouveau avec le bouton droit sur le nom du projet et sélectionnez [Propriétés]. Si vous ne voyez pas Propriétés, utilisez les icônes en haut pour passer de la vue des dossiers à la vue des solutions, comme indiqué dans l'écran ci-dessous. ss5.png Cliquez sur Configuration Manager et modifiez l'étalonnage sur Release et la plate-forme sur x64. Sélectionnez le menu [Général], définissez [Nom de la cible] sur LeapPython et définissez [Type de configuration] sur Bibliothèque dynamique (.dll). ss6.png Ensuite, ouvrez le menu [C / C ++] -> [Général] et spécifiez le dossier d'inclusion Python dans le répertoire d'inclusion supplémentaire. Par exemple, dans mon environnement Anaconda (Miniconda) C: \ Users \ (nom d'utilisateur) \ Miniconda3 \ envs \ (nom de l'environnement) \ include C'est comme ça. ss7.png Ensuite, accédez au menu Linker-> Input et ajoutez le chemin complet vers Leap.lib et python37.lib dans les dépendances supplémentaires. python37.lib doit se trouver à l'emplacement suivant. C: \ Users \ (nom d'utilisateur) \ Miniconda3 \ envs \ (nom de l'environnement) \ libs \ python37.lib ss8.png Le réglage est terminé. Fermons la propriété.

Construire

Exécutez la compilation. Cliquez avec le bouton droit sur le nom du projet → [Build] Si vous obtenez un message d'erreur, assurez-vous que python33.lib et Leap.lib sont pour 64 bits. Lorsque la construction est terminée, LeadPython.dll sera créé dans le répertoire affiché. Renommez-le en .pyd. Pour le moment, mettez Generated LeadPython.pyd.

Exécuter sur Python 3.7

Ouvrez le dossier dans lequel vous avez créé \ _ \ _ init \ _ \ _. Py en creusant dans le contenu du SDK Leap qui a été exécuté sur Python 2.7. Parmi ceux-ci, remplacez Leap.py et LeapPython.pyd par ceux générés par Swig ou Visual Studio.

Enfin, vous devez également corriger manuellement Leap.py. Ouvrons-le avec un éditeur de texte. Il y a des % s supplémentaires ici et là, donc veuillez les supprimer C'est plus rapide si vous remplacez 2 espaces demi-largeur +% et que vous les effacez. Reworked Leap.py est ici.

Vous pouvez maintenant obtenir les données Leap Motion dans Python 3.7 comme vous l'avez fait dans Python 2.7.

À combiner avec PsychoPy (bonus)

Écrivez un script comme celui-ci ↓

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)

Bouge comme ça ↓

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'))

Ça ressemble à ça! ↓ ezgif-7-145ce88082b1.gif

MinGW au lieu de Visual Studio (échec)

J'ai essayé de le compiler en utilisant g ++ installé avec MinGW, mais cela n'a pas fonctionné. Gardez un dossier jusqu'à ce qu'il reste bloqué.

Installation

Installez MinGW-w64 en vous basant sur cet article. Ce n'est pas grave si vous l'ajoutez à votre PATH. Au fait, dans mon cas, j'ai ajouté ce qui suit. C:\Program Files\mingw-w64\x86_64-8.1.0-posix-seh-rt_v6-rev0\mingw64\bin

Ensuite, à l'invite de commande, cd dans le dossier Swig terminé et

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 

Je pensais pouvoir faire la même chose que j'ai fait dans Visual Studio, mais je suis resté coincé avec beaucoup d'erreurs. ss10.png Si je pouvais le faire ici, cela aurait été plus facile car je n'aurais pas à installer Visual Studio.

Recommended Posts

Leap Motion dans Python 3
Obtenez des données LeapMotion en Python.
Essayez d'utiliser LeapMotion avec Python
Comment exécuter LeapMotion avec Python non-Apple
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
Equation de mouvement à double pendule en python
Liste triée en Python
Texte de cluster en Python
AtCoder # 2 tous les jours avec Python
Daily AtCoder # 6 en Python
Daily AtCoder # 18 en Python
Modifier les polices en Python
Motif singleton en Python
Opérations sur les fichiers en Python
Lire DXF avec python
Daily AtCoder # 53 en Python
Séquence de touches en Python
Utilisez config.ini avec Python