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 :

[OpenCV] ouvrir une image indirectement


Sujet :

Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut [OpenCV] ouvrir une image indirectement
    Bonjour, je débute a python et je rencontre un problème pour un de mes projets.

    J'utilise cv2.imread('chemin de l'image') pour lire une image, ce qui fonctionne quand je rentre le chemin manuellement.
    J'essaye maintenant d'ouvrir des images de façon aléatoire parmi une sélection d'images qui ne sont pas dans le même dossier. J'ai un fichier .txt avec les chemins de toutes mes images et un script qui choisi aléatoirement un des chemin et l’enregistre dans une variable de type string que j'ai appelé "path".

    J'essaye ensuite d'ouvrir l'image mais cv2.imread(path) me renvoi 'None'

    Est-il possible de charger une image indirectement comme j'essaye de le faire? Quand je rentre manuellement le même chemin avec les guillemets tout marche correctement.

    exemple de chemin que j'essaye d'ouvrir:
    path: \\\curvsd-hr\\F\\FlightPathInventory\\ImageDatabase\\NSW17222750\\finale\\Building_nDVI24984_3_9_5.99850237709.tif

    Faut-il que j'utilise une autre méthode ?

    Je vous remercie d'avance

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Ça doit fonctionner, le problème vient vraisemblablement de la manière dont tu l'écris.

    Éventuellement l'encodage peut faire défaut.

    J'utilise ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        def load_image(self, img):
            self.img = img.encode(sys.getfilesystemencoding())
            try:
                src_image = cv.LoadImage(self.img, 1)
            except Exception as why:
                # Traite l'erreur, retourne False
     
            if not src_image:
                # Traite l'erreur, retourne False
    Notes:
    - Les messages d'erreur d'OpenCV peuvent être inconsistant.
    - C'est quoi "\\\curvsd-hr" ?

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Salut, merci de ta réponse!

    curvsd-hr est l'ordinateur où sont stockées mes images, le dossier F étant partagé sur le réseau.

    Comme tu dis ça vient très certainement de la manière dont je l'ai écrit, je débute complètement en programmation.

    Voila mon 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
    #opening house blobs
     
    import numpy as np
    import cv2
    import random
     
    f = open('houses.txt','r') #fichier qui contient les chemins de mes images
    houses = f.readlines()
    randomPick = random.choice(houses)
    print randomPick
     
     
    if '\\' in randomPick:
        b = randomPick.replace('\\','\\\\') 
        print b
        c= b[3:]
    path = '\\'+'\\\curvsd-hr\\\F'+ c #permet d'avoir le chemin de la bonne forme
    print 'path: ' + path
    print path
     
     
    im =cv2.imread(path)
    print   im
     
    if (im is None):
        print "No image found! Check path."
    else:
        cv2.namedWindow('Display Window') 
        cv2.imshow('Display Window',im)
        cv2.waitKey(0)

    La deuxième partie du code c'est du bidouillage pour pouvoir arriver a avoir un 'path' identique au chemin qui fonctionne quand je le rentre manuellement. C'est surement pas très académique je fais comme je peux

  4. #4
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Résumons,

    Cette ligne:
    retourne : \\\curvsd-hr\\F\\FlightPathInventory\\ImageDatabase\\NSW17222750\\finale\\Building_nDVI24984_3_9_5.99850237709.tif

    Si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    im =cv2.imread("\\\curvsd-hr\\F\\FlightPathInventory\\ImageDatabase\\NSW17222750\\finale\\Building_nDVI24984_3_9_5.99850237709.tif")
    ça fonctionne, mais pas si tu fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    im =cv2.imread(path)
    Dans ce genre de situation, on commence par les vérifications simples.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print path, os.path.isfile(path)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    path = path.encode(sys.getfilesystemencoding())
    Après on verra.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    C'est tout à fait ça !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print path, os.path.isfile(path)
    retourne False et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    path = path.encode(sys.getfilesystemencoding())
    ne change rien.

    J'ai fais d'autres tests :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    path = '\\\curvsd-hr\\F'+ c 
    test= '\\\curvsd-hr\\F\\FlightPathInventory\\ImageDatabase\\NSW18283321\\finale\\Building_nDVI3375_5_9_4.55823898273.tif'
    retourne : \\curvsd-hr\F\FlightPathInventory\ImageDatabase\NSW18283321\finale\Building_nDVI3375_5_9_4.55823898273.tif
    et retourne la même chose.

    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    im = cv2.imread(test)
    ça fonctionne. Mais pas si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    im = cv2.imread(path)

  6. #6
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Si os.path.isfile(path) retourne False c'est clairement un problème chemin.

    Plutot que de le construire avec l'opérateur + utilise os.path.join() pour que ce soit Python lui-même qui construise le chemin du fichier en respect des règles de ton OS.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    os.path.join('\\\curvsd-hr', 'F', c)
    Pour les trois backslashs du début, faudra peut-être ajuster. jusqu'à ce que os.path.isfile(path) retourne True

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    J'avais essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    path = os.path.join('\\\curvsd-hr', 'F', c)
    mais print path retournait un chemin de type : F\FlightPathInventory\ImageDatabase\NSW18283321\finale\Building_nDVI3375_5_9_4.55823898273.tif ,
    sans le nom de l'ordinateur (\\curvsd-hr). J'ai essayé plusieurs combinaisons différentes avec les backslashs mais sans succès ..

  8. #8
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Et si tu essayes ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print os.path.isdir(os.path.join(r'\\curvsd-hr', 'F'))
    en jouant sur le nombre de backslashs du début.

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    J'ai recrée mon chemin petit a petit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    path = os.path.join(r'\\curvsd-hr', 'F')
    path1 = os.path.join(path,r'FlightPathInventory')
    path2 = os.path.join(path1,r'ImageDatabase')
    path3 = os.path.join(path2,randomPick[38:49])
    path4 = os.path.join(path3,r'finale')
    path5 = os.path.join(path4,randomPick[57:])
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print os.path.isdir(path4)
    me donne: True. Par contre,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print os.path.isfile(path5)
    me donne toujours False ..

    alors que
    me donne bien le bon chemin vers mon image..

    Et puis je suis pas super satisfait par la manière de créer le chemin car ça pourrait marcher ici car j'ai un dossier 'finale' dans chaque dossier 'NSWxxxxxxx' (qui est le nom de la propriété d'ou est tirée l'image) mais si ce n'était pas le cas?

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Je crois savoir d'où l'erreur vient mais je ne sais pas comment y remédier.. Je pense que python double les backslashs lorsqu'il veut accéder au fichier.

    Le chemin de mon fichier est : \\curvsd-hr\F\FlightPathInventory\ImageDatabase\NSW18243170\finale\Tree_nDVI9696_5_10_3.11421052253.tif

    Si je donne a python ce chemin il va essayer d'ouvrir : \\\\curvsd-hr\\F\\FlightPathInventory\\ImageDatabase\\NSW18243170\\finale\\Tree_nDVI9696_5_10_3.11421052253.tif

    alors que e chemin que python reconnait et arrive a ouvrir est: \\\curvsd-hr\\F\\FlightPathInventory\\ImageDatabase\\NSW18243170\\finale\\Tree_nDVI9696_5_10_3.11421052253.tif

    Problème, comment avoir 3 backslashs au début ?

  11. #11
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bon je ne sais pas pourquoi mais si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cv2.imread(path5.strip())
    ça marche.

    Je suppose qu'il y avait un caractère superflu a la fin de mon chemin du genre '\n' pourtant j'avais aussi essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cv2.imread(path5[:-1])
    sans succès. Si vous avez une explication ? Je n'aime pas utiliser un truc sans savoir pourquoi ça marche

    En tout cas merci pour ton temps et ton aide Vincent!

  12. #12
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Peur-être parce que sous Windows le fin de ligne est de deux caractères. Non ?

  13. #13
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2013
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    j'avais aussi essayé avec [:-2] .. enfin bon ça marche c'est l'essentiel

Discussions similaires

  1. Ouvrir une image avec CxImage
    Par le-makinero dans le forum MFC
    Réponses: 7
    Dernier message: 24/04/2006, 15h33
  2. Ouvrir une image au hasard
    Par rpoulin dans le forum Langage
    Réponses: 4
    Dernier message: 25/03/2006, 22h34
  3. [VBA-E] Ouvrir une image en ".bmp"
    Par Xavos dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/03/2006, 09h48
  4. [VBA-E]Ouvrir une image jpg àl'aide d'une macro
    Par delamarque dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 15/03/2006, 09h47
  5. Ouvrir une image avec paint depuis un formulaire
    Par gui38 dans le forum Access
    Réponses: 3
    Dernier message: 14/11/2005, 16h40

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