Maison >Périphériques technologiques >IA >Gestes virtuels de l'IA pour jouer à la bataille d'avion

Gestes virtuels de l'IA pour jouer à la bataille d'avion

王林
王林avant
2023-05-17 11:34:061310parcourir

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.

1. Préparez le programme de guerre des avions

Trouvez une version Python du programme de guerre des avions sur Github, installez Pygame et exécutez-le.

Gestes virtuels de lIA pour jouer à la bataille davion

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.

2. Reconnaître les gestes

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.

Gestes virtuels de lIA pour jouer à la bataille davion

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.

3. Contrôle gestuel pour mettre le jeu en pause

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.

Gestes virtuels de lIA pour jouer à la bataille davion

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

Gestes virtuels de lIA pour jouer à la bataille davion

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.

4. Contrôle gestuel du mouvement de l'avion

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.

Gestes virtuels de lIA pour jouer à la bataille davion

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer