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 :

Changer de source vidéo avec un combobox et tkinter


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2023
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2023
    Messages : 40
    Points : 23
    Points
    23
    Par défaut Changer de source vidéo avec un combobox et tkinter
    Bonjour, j'ai encore un problème de code.

    J'ai codé une fenêtre qui permet d'ouvrir la camera et l'afficher.

    Le programme arrive a afficher la source vidéo mais lorsque je sélectionne une autre source vidéo et que je fais open , la sa ne marche pas et je n'ai pas de message d'erreur.

    Voici mon code que j'ai réduit car mon projet est plus gros.

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    from tkinter import *
    from tkinter import messagebox
    from tkinter.ttk import Combobox  # Importez Combobox depuis ttk
    import cv2
    from PIL import Image, ImageTk
     
     
    def open_camera():
        global vid
        global source
        framewidth = 640
        frameheight = 480
        source = source_video.get()  #recupere la valeur du combobox
        if not source or source== "":
            source=0
            source= int(source)
        print("source video--------------->: " + str(source))
        vid = cv2.VideoCapture(source)  # Ouvre la caméra par défaut
        vid.set(3, framewidth)
        vid.set(4, frameheight)
        vid.set(10, 100)  # Brightness id = 10 and 100 intensity level
     
     
    # Fonction pour fermer la caméra
    def close_camera():
        global vid
        if vid is not None and vid.isOpened():
            vid.release()
     
     
    # Fonction pour ouvrir la caméra
    def update():
        if vid is not None:
            ret, frame = vid.read()
            if ret :
                frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                photo = ImageTk.PhotoImage(image=Image.fromarray(frame))
                canvas.create_image(0, 0, image=photo, anchor=NW)
                canvas.photo = photo
        root.after(10, update)   # mise a jour toute les 10 ms
     
     
     
    # Initialisation de Tkinter
    root = Tk()
    root.title("Test camera")
    root.bind('<Escape>', lambda e: root.quit())  #fermer avec echap
     
    # Bouton pour ouvrir la caméra
    button1 = Button(root, text="Open Camera", command=open_camera)
    button1.pack()
     
    # Bouton pour fermer la caméra
    button1 = Button(root, text="Close Camera", command=close_camera)
    button1.pack()
     
    # ajout combobox pour selectionner la source video
    options = ["0", "1", "2", "3", "4", "5"]
    source_video = StringVar()
    combobox_source_video = Combobox(root, state='readonly', textvariable=source_video, values=options)
    combobox_source_video.pack()
     
    #fentre principale en 700x600
    root.geometry("700x600")
    canvas = Canvas(root, width=640, height=480, bg='yellow')
    canvas.pack()
     
    delay = 10  # Met à jour la vidéo toutes les 10 millisecondes
    vid = None  # Variable pour stocker la capture vidéo
    root.after(delay, update)
    # Lancer l'interface Tkinter
    root.mainloop()
    Aperçu de la fenêtre:

    Nom : source_video_combobox.png
Affichages : 93
Taille : 360,8 Ko

    J'ai fait de nombreux tests mais je ne trouve pas le problème.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Et comment sait-on que vous avez bien autant de cameras qui fonctionnent (correctement)?

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

  3. #3
    Membre habitué
    Homme Profil pro
    Animateur Numérique
    Inscrit en
    Février 2013
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Animateur Numérique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 132
    Points : 187
    Points
    187
    Par défaut
    Slt,

    Ton erreur est en ligne 13, la variable source récupère une chaine alors que cv2.VideoCapture() attend un entier, de plus la condition ligne 14 peut être évitée avec la méthode set() de Combobox :
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    from tkinter import *
    from tkinter import messagebox
    from tkinter.ttk import Combobox  # Importez Combobox depuis ttk
    import cv2
    from PIL import Image, ImageTk
     
     
    def open_camera():
        global vid
        framewidth = 640
        frameheight = 480
        source = int(source_video.get())  #recupere la valeur du combobox
        print("source video--------------->: " + str(source))
        vid = cv2.VideoCapture(source)  # Ouvre la caméra par défaut
        vid.set(3, framewidth)
        vid.set(4, frameheight)
        vid.set(10, 100)  # Brightness id = 10 and 100 intensity level
     
     
    # Fonction pour fermer la caméra
    def close_camera():
        global vid
        if vid is not None and vid.isOpened():
            vid.release()
     
     
    # Fonction pour ouvrir la caméra
    def update():
        if vid is not None:
            ret, frame = vid.read()
            if ret :
                frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                photo = ImageTk.PhotoImage(image=Image.fromarray(frame))
                canvas.create_image(0, 0, image=photo, anchor=NW)
                canvas.photo = photo
        root.after(10, update)   # mise a jour toute les 10 ms
     
     
     
    # Initialisation de Tkinter
    root = Tk()
    root.title("Test camera")
    root.bind('<Escape>', lambda e: root.quit())  #fermer avec echap
     
    # Bouton pour ouvrir la caméra
    button1 = Button(root, text="Open Camera", command=open_camera)
    button1.pack()
     
    # Bouton pour fermer la caméra
    button1 = Button(root, text="Close Camera", command=close_camera)
    button1.pack()
     
    # ajout combobox pour selectionner la source video
    options = ["0", "1", "2", "3", "4", "5"]
    source_video = StringVar()
    combobox_source_video = Combobox(root, state='readonly', textvariable=source_video, values=options)
    combobox_source_video.pack()
    combobox_source_video.set("0")
     
    #fentre principale en 700x600
    root.geometry("700x600")
    canvas = Canvas(root, width=640, height=480, bg='yellow')
    canvas.pack()
     
    delay = 10  # Met à jour la vidéo toutes les 10 millisecondes
    vid = None  # Variable pour stocker la capture vidéo
    root.after(delay, update)
    # Lancer l'interface Tkinter
    root.mainloop()

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Et comment sait-on que vous avez bien autant de cameras qui fonctionnent (correctement)?
    Si on veut le savoir, pouvoir changer la caméra utilisée par défaut... devrait se faire par la modification d'une constante. Si ce n'est pas le cas, c'est qu'on s'est compliqué la vie et si ça ne marche pas c'est qu'en plus on n'arrive pas à relire le code qu'on a écrit.

    Ecrit plus simplement;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    FRAMEWIDTH = 640
    FRAMEHEIGHT = 480
    def open_camera():
        global vid
     
        source = source_video.get()  #recupere la valeur du combobox
        print("source video--------------->: ", source)
        vid = cv2.VideoCapture(source)  # Ouvre la caméra par défaut
        vid.set(3, FRAMEWIDTH)
        vid.set(4, FRAMEHEIGHT)
        vid.set(10, 100)  # Brightness id = 10 and 100 intensity level
    Puis tant qu'à utiliser une Variable autant utiliser un IntVar et l'initialiser proprement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DEFAULT_CAMERA = 1
    # ajout combobox pour selectionner la source video
    options = list('012345')
    source_video = IntVar(value=DEFAULT_CAMERA)
    combobox_source_video = Combobox(root, state='readonly', textvariable=source_video, values=options)
    combobox_source_video.pack()
    Et les questions auraient pu être sur comment initialiser une Variable ou en récupérer un int... plutôt que de vous perdre dans des jongleries pour faire tomber le truc en marche.

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

  5. #5
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2023
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2023
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Merci c’était bien sa le problème.

    Plus précisément la ligne 17:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print("source video--------------->: " + str(source))
    Je ne savais pas que sa allait me convertir source en string. (je me servais de cette ligne pour debuguer et pourtant c'est cette ligne qui posait problème)

    La sa marche, source est bien un int.

    J'ai fais les tests avec 2 cameras USB la camera s'affiche bien que se soit la 1 ou la 2 par contre lorsque je change de source la camera se fige.

    Je fais des tests avec ce 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
    54
    55
    56
    57
    58
    59
    60
    from tkinter import *
    from tkinter.ttk import Combobox
    import cv2
    from PIL import Image, ImageTk
     
    def open_camera():
        global vid
        global source
        framewidth = 640
        frameheight = 480
        source = source_combobox.get()
        if not source or source == "":
            source = 0
            source_combobox.set(0)
        source = int(source)
        vid = cv2.VideoCapture(source)
        vid.set(3, framewidth)
        vid.set(4, frameheight)
        vid.set(10, 100)
        if not vid.isOpened():
            print("Failed to open video source")
        else:
            print("Video source opened successfully")
            update()
     
    def update():
        global photo
        global canvas
        if vid is not None and vid.isOpened():
            ret, frame = vid.read()
            if ret:
                frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                photo = ImageTk.PhotoImage(image=Image.fromarray(frame))
                canvas.create_image(0, 0, image=photo, anchor=NW)
                root.after(10, update)  # Update every 10 ms
            else:
                print("Failed to capture frame")
        else:
            print("Video capture not initialized")
     
    root = Tk()
    root.title("Test camera")
     
    source_label = Label(root, text="Choose video source:")
    source_label.pack()
     
    options = ["0", "1", "2", "3", "4", "5"]
    source_combobox = StringVar()
    combobox_source = Combobox(root, state='readonly', textvariable=source_combobox, values=options)
    combobox_source.pack()
     
    open_button = Button(root, text="Open Camera", command=open_camera)
    open_button.pack()
     
    canvas = Canvas(root, width=640, height=480, bg='yellow')
    canvas.pack()
     
    vid = None
     
    root.mainloop()

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    N'importe quoi!
    str(source) laisse source inchangé...(*)
    Avec source_combobox StringVar, source_combobox.get() ne pourra être autre chose que string.
    (*) ce n'est pas une méthode appliquée à ... de plus, str est non mutable.

    Citation Envoyé par carlita_84 Voir le message
    par contre lorsque je change de source la camera se fige.
    Cela ne devrait être que temporaire (le temps de l'initialisation via cv2.VideoCapture(...).

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

  7. #7
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2023
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2023
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    Je viens de refaire des tests, effectivement sa marche même avec cette ligne.

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 126
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 126
    Points : 1 636
    Points
    1 636
    Par défaut
    En particulier, c'est ta ligne source= int(source) qui était dans le if dans le code du 1er post, donc la conversion en entier ne se faisait qu'en cas de "mauvaise" valeur.
    Comme tu l'as déplacé en dehors du if dans ton dernier code, ça ne peut que mieux marcher.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Webmaster
    Inscrit en
    Février 2023
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2023
    Messages : 40
    Points : 23
    Points
    23
    Par défaut
    J'ai modifié l'erreur sur mon projet , tout fonctionne, pas de gel de l’écran.

    Par contre sur le code que j'ai posté précédemment l'image se fige lorsque je change de source.

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par carlita_84 Voir le message
    Je viens de refaire des tests, effectivement sa marche même avec cette ligne.
    Oui mais "tester" c'est pour vérifier qu'une théorie fonctionne pas pour inventer une légende urbaine à laquelle vous allez croire contre toute raison.

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

  11. #11
    Membre habitué
    Homme Profil pro
    Animateur Numérique
    Inscrit en
    Février 2013
    Messages
    132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Animateur Numérique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 132
    Points : 187
    Points
    187
    Par défaut
    Citation Envoyé par carlita_84 Voir le message
    J'ai modifié l'erreur sur mon projet , tout fonctionne, pas de gel de l’écran.

    Par contre sur le code que j'ai posté précédemment l'image se fige lorsque je change de source.
    Pour éviter ça, je libérerais les ressources de l'objet vid avant de changer de source, il suffit d'appeler clause_camera() à partir de open_camera()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def open_camera():
        global vid
        close_camera()
        framewidth = 640
        frameheight = 480
        ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2016] Changer une source de donnée CSV dans PowerPivot avec un code VBA
    Par lepetitfuté dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 10/04/2018, 17h20
  2. [POO] Changer la source d'un objet (flash) en Javascript
    Par thomine dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 11/02/2008, 16h54
  3. changer la source d'une image avec Firefox
    Par couetbis dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 07/11/2007, 22h45
  4. Comment je peux changer nom de 'Table' avec la phrase sql
    Par YEK dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 01/10/2004, 08h38
  5. Travailler sur des sources distantes avec Eclipse
    Par El Saigneur dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 12/07/2004, 09h40

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