Maison >Périphériques technologiques >IA >Gestes virtuels de l'IA pour jouer à la bataille d'avion
Bonjour à tous.
Décomposons ce petit projet et vous emmenons le mettre en œuvre étape par étape. À la fin de l'article, nous obtiendrons le code source complet du projet.
Trouvez une version Python du programme de guerre des avions sur Github, installez Pygame et exécutez-le.
Le fonctionnement du jeu est simple. Dans le coin supérieur droit se trouve le bouton pause/démarrage du jeu, qui peut être actionné en cliquant avec la souris.
Les touches A, D, W et S du clavier sont utilisées pour contrôler la direction du mouvement de l'avion, correspondant respectivement à gauche, droite, haut et bas.
Notre programme d'IA doit donc remplir deux fonctions principales : premièrement, reconnaître les gestes ; deuxièmement, convertir les gestes en opérations de la souris et du clavier pour contrôler le jeu.
Ici, nous utilisons opencv pour lire le flux vidéo de la caméra.
Envoyez chaque image du flux vidéo au modèle de détection de paume dans mediapipe pour identifier 21 points clés de la paume.
Dans notre projet, seuls l'index et le majeur sont utilisés, qui sont les 8ème et 12ème points à gauche et à droite.
Le code de base est le suivant :
ret, frame = cap.read() results = hands.process(frame[:, :, ::-1]) if results.multi_hand_landmarks: # 遍历每个手掌 for hand_landmarks in results.multi_hand_landmarks: finger_axis_8 = hand_landmarks.landmark[8] finger_axis_12 = hand_landmarks.landmark[12]
frame est chaque image du flux vidéo, et les mains sont le modèle de détection de la paume.
Les objets finger_axis_8 et finger_axis_12 analysés stockent respectivement les coordonnées x et y de l'index et du majeur.
Calculez la distance entre les coordonnées de l'index et du majeur Si elle est supérieure à un certain seuil, déplacez la souris et cliquez sur le bouton pause du jeu.
Le jeu est en pause
Si la distance entre les coordonnées de l'index et du majeur est inférieure à un certain seuil, déplacez la souris et cliquez sur le bouton Démarrer le jeu
Le jeu démarre
Le calcul de la distance est très simple, aucun code n'est posté ici. Maintenant, concentrons-nous sur Python contrôlant la souris.
J'utilise la bibliothèque PyUserInput, qui fournit deux classes, PyMouse et PyKeyboard, pour contrôler respectivement la souris et le clavier.
Lorsque nous voulons utiliser un programme Python pour contrôler la pause et le démarrage du jeu, il suffit de déplacer la souris sur le bouton et d'effectuer une opération de clic.
# 定义鼠标对象 self.mouse = PyMouse() def pause_or_start_game(self, dist): """ 判断是否需要暂停(开始)游戏 :param dist: :return: """ if (not self.is_pause and dist > 80) or (self.is_pause and dist < 80): self.mouse.move(915, 125) self.mouse.click(915, 125) self.is_pause = not self.is_pause
Le paramètre dist de la fonction pause_or_start_game est la distance entre l'index et le majeur.
Les coordonnées du bouton pause/démarrage sont (915, 125). Les coordonnées de chaque ordinateur sont différentes. Vous devez recalculer en fonction de votre situation réelle.
L'idée de calcul est très simple. La taille de la bordure du jeu est de (480, 700). Le jeu démarre au milieu de l'écran. Tant que la taille de l'écran est obtenue, les coordonnées des boutons peuvent être. approximativement estimé. Après avoir appelé la fonction move de PyMouse, vérifiez-la et affinez-la. La fonction move de
PyMouse est utilisée pour déplacer la position de la souris, et la fonction click est utilisée pour effectuer des opérations de clic de souris.
Ici, vous devez calculer la direction du mouvement et la distance des coordonnées x et y de l'index dans deux images adjacentes. Cela détermine sur lequel des claviers A, D, W et S vous appuyez.
De même, la direction et la distance de mouvement sont très simples et ne seront pas abordées ici. L'accent est mis sur le module PyKeyboard contrôlant les touches du clavier.
self.key_board = PyKeyboard() # 按下按键 self.key_board.press_key(key) # 停留一段时间 time.sleep(press_dwell) # 释放按键 self.key_board.release_key(key)
Entre les fonctions press_key et release_key, time.sleep(press_dwell) est appelé pour contrôler la durée de la touche Si la touche est enfoncée longtemps, la distance parcourue par l'avion sera longue, au contraire. la touche est enfoncée pendant un court instant, la distance parcourue par l'avion sera courte.
Donc, la difficulté ici est de savoir comment mapper la distance de mouvement de l'index à la durée de la pression sur la touche.
J'ai utilisé le code suivant pour le mesurer
for i in range(n): kb.press_key('A') time.sleep(0.05) kb.release_key('A')
La durée fixe de la clé est de 0,05 seconde, et l'avion de test se déplace du milieu vers l'extrême gauche, ce qui nécessite le plus petit n.
L'avion se déplace du milieu vers l'extrême gauche et la distance de déplacement est de 240. Par conséquent, 240 / (n * 0,05) est la distance de déplacement de l'avion par seconde.
J'ai mesuré n=7, donc la distance parcourue par l'avion par seconde est de 685,7142857.
Calculez simplement la distance de mouvement de l'index et divisez-la par 685,7142857 pour obtenir la durée des touches du clavier.
Le code complet pour le contrôle gestuel du mouvement des avions est :
def press_key_board(self, direction, move_dist): """ 将手指移动距离,换算为按键间隔,并执行按键操作 :param direction:移动方向 :param move_dist:移动距离 :return: """ dist_per_sec = 685.7142857 if direction == 'x': key = 'A' if move_dist < 0 else 'D' elif direction == 'y': key = 'W' if move_dist < 0 else 'S' else: return press_dwell = math.fabs(move_dist / dist_per_sec) self.key_board.press_key(key) time.sleep(press_dwell) self.key_board.release_key(key)
La partie centrale du projet a été expliquée et le code complet a été trié. Si vous en avez besoin, laissez simplement un message dans la zone de commentaires.
Après avoir obtenu le code, regardez d'abord le fichier steps.txt en cours d'exécution.
Si vous pensez que cet article vous est utile, veuillez cliquer sur "Lire le" pour m'encourager. Je continuerai à partager d'excellents projets Python+AI à l'avenir.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!