Bonjour
Tout nouveau, dans le monde de python, j’essaye d’exécuter un script que j’ai trouvé sur ChatGPT pouvant permettre grâce à la caméra de faire bouger la souris. Voici le script.
import cv2
import pyautogui
# Chargement du classificateur de visage
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# Initialisation de la capture vidéo
cap = cv2.VideoCapture(0)
# Boucle principale
while True:
# Capture d'une image
ret, frame = cap.read()
if not ret:
break
# Conversion en niveaux de gris
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Détection des visages
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
# Pour chaque visage détecté
for (x, y, w, h) in faces:
# Calcul de la position du centre du visage
center_x = x + w // 2
center_y = y + h // 2
# Déplacement de la souris
screen_width, screen_height = pyautogui.size()
pyautogui.moveTo(center_x * screen_width / frame.shape[1], center_y * screen_height / frame.shape[0])
# Dessiner un rectangle autour du visage (pour visualiser)
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
L’ordinateur sur lequel j’essaye d’exécuter le script est un iMac tournant sur Catalina. Lorsque je glisse le script dans ma console, j’ai le message ci-dessous.
L’erreur affichée par zsh signifie qu’il manque les droits d’exécution sur le fichier.
Une réponse facile est d’utiliser python main.py pour lancer le programme, invoquant donc directement l’interpréteur Python (qui est exécutable) avec le chemin du programme en argument.
L’autre manière de faire est de rendre le fichier exécutable (chmod +x main.py) et d’ajouter le shebang correspondant (#!/usr/bin/env python3 par exemple), je détaille ça par ici si tu veux.
Mais dans le fond ça revient au même : ça invoque Python en lui donnant le chemin du fichier.
En revanche ton programme semble avoir de gros problèmes d’indentation qui le rendront impossible à interpréter. Je ne sais pas si cela vient de ChatGPT ou du copier-coller, mais il te faudra corriger ça.
`python
import cv2
import pyautogui
# Chargement du classificateur de visage
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# Initialisation de la capture vidéo
cap = cv2.VideoCapture(0)
# Boucle principale
while True:
# Capture d'une image
ret, frame = cap.read()
if not ret:
break
# Conversion en niveaux de gris
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Détection des visages
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
# Pour chaque visage détecté
for (x, y, w, h) in faces:
# Calcul de la position du centre du visage
center_x = x + w // 2
center_y = y + h // 2
# Déplacement de la souris
screen_width, screen_height = pyautogui.size()
pyautogui.moveTo(center_x * screen_width / frame.shape[1], center_y * screen_height / frame.shape[0])
# Dessiner un rectangle autour du visage (pour visualiser)
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
# Affichage de l'image
cv2.imshow('Face Detection', frame)
# Quitter avec 'q'
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Libération des ressources
cap.release()
cv2.destroyAllWindows()
OK, j’ai ajouté l’encodage UT8, mais j’ai une nouvelle erreur
# -*- coding: utf-8 -*-
import cv2
import pyautogui
# Chargement du classificateur de visage
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# Initialisation de la capture vidéo
cap = cv2.VideoCapture(0)
# Boucle principale
while True:
# Capture d'une image
ret, frame = cap.read()
if not ret:
break
# Conversion en niveaux de gris
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Détection des visages
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5)
# Pour chaque visage détecté
for (x, y, w, h) in faces:
# Calcul de la position du centre du visage
center_x = x + w // 2
center_y = y + h // 2
# Déplacement de la souris
screen_width, screen_height = pyautogui.size()
pyautogui.moveTo(center_x * screen_width / frame.shape[1], center_y * screen_height / frame.shape[0])
# Dessiner un rectangle autour du visage (pour visualiser)
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
Oui, cette erreur est liée à ce que je disais à propos de l’indentation.
Python est un langage qui repose sur l’indentation (les espaces en début de ligne) : c’est ainsi que sont délimités les blocs.
Par exemple un bloc while comprend toutes les lignes qui le suivent qui sont indentées d’un niveau supérieur.
Dans ton cas l’instruction while n’est suivi d’aucune ligne indenté, il s’agit donc d’un bloc vide ce qui forme une erreur de syntaxe.
Je pense que rien ne remplacera la lecture d’un tutoriel pour comprendre comment fonctionne le langage. (et que ChatGPT n’est pas un bon candidat pour ça).
Mais pour le faire brièvement :
Si j’écris
a = int(input())
if a == 0:
print('Hello')
print('World')
print('Pouet')
Les lignes print('Hello') et print('World') sont indentées par rapport à la ligne if a == 0: : elles commencent par 4 espaces de plus.
Cela signifie qu’elles font partie du bloc formé par le if et sont donc conditionnées par cette instruction.
Ainsi “Hello” et “World” ne seront affichés que si l’on rentre dans le bloc (= que l’on exécute son contenu) donc que la condition est vraie, donc que la variable a vaut zéro.
“Pouet” quant à lui ne fait pas partie du bloc : il n’est pas indenté par rapport au if.
Son exécution ne dépend alors pas de la condition : il est exécuté dans tous les cas.
Dans ton code c’est la même chose, les lignes qui se terminent par : (comme le if a == 0: dans mon exemple) introduisent un bloc, elles devraient être suivies de lignes indentées qui forment le contenu du bloc.
C’est pourquoi le code est faux (erreurs de syntaxe) et qu’il faut corriger l’indentation pour qu’il soit valide : il faut indiquer clairement à Python comment sont délimités les blocs parce qu’il ne peut pas le deviner.
Il faut lui dire quelles lignes sont dans le bloc while, quelles lignes sont dans le bloc if, quelles lignes sont dans le bloc for.