IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Problème avec scan OCR sur VM en Python


Sujet :

Python

  1. #1
    Membre habitué
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Alternant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2022
    Messages : 12
    Par défaut Problème avec scan OCR sur VM en Python
    Bonjour,
    Je vous expose mon problème :
    J'ai fais un programme en Python qui fais un scan OCR et qui clique à l'endroit ou il trouve l'image que je cherche. Ce code fonctionne parfaitement bien sur mon pc sous windows 10 mais ne fonctionne pas sur ma VM et je ne comprend pas pourquoi.
    Voici la base du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    import time
    import os
    import random
    from pymemuc import PyMemuc
    import pyautogui
    import pyperclip
    import cv2
     
    def save_screenshot(file_path):
        screen_shot = pyautogui.screenshot()
        screen_shot.save(file_path)
     
    def find_word_coordinates(image_path, word):
        image = cv2.imread(image_path)
        gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        template = cv2.imread(f'C:\\Users\\Damien\\Pictures\\bouton_{num_bouton}.png', 0)
        width, height = template.shape[::-1]
     
        result = cv2.matchTemplate(gray_image, template, cv2.TM_CCOEFF_NORMED)
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
     
        if max_val > 0.8:
            x, y = max_loc
            return x + width / 2, y + height / 2
        else:
            return None
     
    screenshot_file = 'C:\\Users\\'+ username +'\\Pictures\\screenshot.png'
    save_screenshot(screenshot_file)
     
    screenshot_file = 'C:\\Users\\'+ username +'\\Pictures\\screenshot.png'
        save_screenshot(screenshot_file)
        num_bouton = num_bouton + 1 #1
        word = 'bouton_1'
        coordinates = find_word_coordinates(screenshot_file, word)
        if coordinates is not None:
            pyautogui.click(coordinates[0], coordinates[1])
            time.sleep(5)
        else:
            print(f"'{word}' n'a pas été trouvé dans l'image.")
            time.sleep(5)
     
    screenshot_file = 'C:\\Users\\'+ username +'\\Pictures\\screenshot.png'
        save_screenshot(screenshot_file)
        num_bouton = num_bouton + 1 #2
        word = 'bouton_2'
        coordinates = find_word_coordinates(screenshot_file, word)
        if coordinates is not None:
            pyautogui.click(coordinates[0], coordinates[1])
            time.sleep(5)
        else:
            print(f"'{word}' n'a pas été trouvé dans l'image.")
            time.sleep(5)
    Cette partie la du code se répète donc plusieurs fois en rajoutant +1 à la variable "num_bouton" pour tomber à chaque fois sur l'image suivante (dans mon dossier C/users/damien/pictures les images sont appelés "bouton_1.png", "bouton_2.png", "bouton_3.png", etc.....

    La ou je me questionne c'est que ce code fonctionne parfaitement sur mon pc, mais si j'essaye de l'exécuter sur une machine virtuelle (sous w10 22h2), le premier bouton fonctionne, mais ensuite le programme va sur la partie "else" des boucles "if coordinates" ce qui me renvoie "{word}' n'a pas été trouvé dans l'image." ('{word}' étant le numéro du bouton).

    J'ai donc l'impression qu'il ne les trouve pas sur les screen qu'il fais, alors qu'après avoir vérifier manuellement les screens, les boutons sont bien présent mais le scan OCR ne les détectent visiblement pas, alors qu'il détecte bien le premier bouton et que sur mon windows physique je n'est aucune problème le programme s’exécute en entier sans entrer dans aucune boucle "else".

    Merci pour votre lecture et merci d'avance si vous me trouvez une solution !

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Salut,

    Si on dit "la fonction cv2.matchtemplate ne trouve pas button_2.png dans le screenshot de l'écran lorsqu'on l'exécute sur une machine virtuelle", ça veut dire qu'en exécutant cette fonction avec ce fichier image sur le PC, ça devrait marcher (et trouver le mot)".

    Si ça ne marche pas, c'est sans doute une problème de threshold à ajuster côté matchtemplate (et ouvrir la documentation...).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre habitué
    Homme Profil pro
    Alternant
    Inscrit en
    Décembre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Alternant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2022
    Messages : 12
    Par défaut
    ça marche sur mon pc c'est bien ça le problème, il va jusqu'au bouton 22 sur mon pc sans soucis, mais sur la VM le bouton 1 fonctionne et il n'en trouve aucun autre, j'ai vérifier les adresses et les noms des fichiers, tout est bon, je ne sais plus trop quoi faire 😅

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Je vous ai suggéré une démarche: prendre l'image où vous voyez le mot et la tester sur les 2 environnements. Si votre théorie est vraie (c'est à cause de l'environnement virtuel), vous devriez reproduire le problème sinon c'est un problème de "threshold".
    Ce qui vous indique quoi faire...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 520
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 520
    Par défaut
    Le template est dans un dossier de l'utilisateur Damien, les autres chemins sont définis avec username.

    Sur la VM, ton nom utilisateur c'est quoi ? si ce n'est pas Damien, c'est peut-être là le souci, les dossiers utilisateurs ne sont pas accessibles à tous les autres utilisateurs. De plus cv2.imread() renvoie une matrice vide si le fichier n'est pas lisible (à cause de son accessibilité par exemple) https://www.geeksforgeeks.org/python...imread-method/

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 816
    Billets dans le blog
    1
    Par défaut
    Bonjour

    La remarque sur l'user "Damien" est assez pertinente. J'ajoute qu'on peut utiliser pathlib.Path.home() pour éviter les chemins en dur et adapter le code à l'user qui s'en sert...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 699
    Par défaut
    Citation Envoyé par umfred Voir le message
    Le template est dans un dossier de l'utilisateur Damien, les autres chemins sont définis avec username.

    Sur la VM, ton nom utilisateur c'est quoi ? si ce n'est pas Damien, c'est peut-être là le souci
    Cette théorie n'explique pas que ça fonctionne pour le premier template.
    Mais vérifier que les autres templates sont présents et contiennent bien les images attendues ne fera pas de mal.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 319
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 319
    Par défaut
    bonjour

    hors le problème VM (désolé)
    Citation Envoyé par damien.1l2 Voir le message

    Cette partie la du code se répète donc plusieurs fois en rajoutant +1 à la variable "num_bouton" pour tomber à chaque fois sur l'image suivante (dans mon dossier C/users/damien/pictures les images sont appelés "bouton_1.png", "bouton_2.png", "bouton_3.png", etc.....
    ...

    1-) Pourquoi ne pas faire une boucle et recopier ce code ? ok, si tu n'as jamais coder (mais ce n'est pas le cas!).
    2-) Dans ton code, tu modifies "num_bouton" et "word" (donc un de trop) pour passer "word" à ta fonction find_word_coordinates() qui elle ... n'utilise pas son paramètre mais une variable globale num_bouton
    3-) dans find_word_coordinates() tu refais à chaque fois sur ta même copie écran un cv2.imread() et cv2.cvtColor(), pourquoi pas si on a du temps et des ressources à perdre. Autant passer "gray_image" en paramètre.
    4-) dans une boucle "chaque bouton", il serait judicieux de tester si l'image existe et si non, alors sortir (avec un message pour debug)

    En résumé, même si ton code fonctionne dans une VM, il est impératif de le réécrire. Je dirais même que c'est une chance qu'il ne fonctionne pas (vu le code).
    ---
    Pour ton problème, a toi de mettre pas mal de print(xxx) pour voir le déroulement


    ps: les "boomer" ont encore un reste de mémoire

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 816
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 816
    Billets dans le blog
    1
    Par défaut
    On peut rajouter aussi une indentation inutile (donc en réalité ce code ne peut pas fonctionner, ni sur une VM ni sur un host réel) entre les lignes 31 et 32. Et pareil entre les lignes 43 et 44.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Problème avec fonction tuple sur Python 3.4.1
    Par inconnito2 dans le forum Général Python
    Réponses: 4
    Dernier message: 28/12/2014, 12h57
  2. Problème avec les indexes sur une base de données.
    Par osoudee dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 09/02/2006, 09h24
  3. Problème avec ma connexion sur hotmail
    Par shukin dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 30/01/2006, 14h09
  4. Problème avec port Série sur Win XP
    Par alexorel dans le forum MFC
    Réponses: 9
    Dernier message: 27/10/2005, 15h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo