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

Tkinter Python Discussion :

Flux video Picamera


Sujet :

Tkinter Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Septembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2011
    Messages : 91
    Par défaut Flux video Picamera
    Bonjour,

    J'aurais besoin d'aide pour la question suivante :
    Comment faire pour intégrer dans une frame (Tkinter) un flux vidéo provenant d'une webcam ?
    Attention, je ne cherche pas à lire une vidéo mais a afficher un flux vidéo. De plus, je souhaiterais que la vidéo débute après un clic sur un bouton.

    Merci d'avance pour vos pistes.

    Samuel

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    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 681
    Par défaut
    Salut,

    Citation Envoyé par patarins Voir le message
    Comment faire pour intégrer dans une frame (Tkinter) un flux vidéo provenant d'une webcam ?
    Vous avez 2 solutions.
    Vous récupérez la vidéo image par image et vous les affichez en mettant à jour l'image associée à un Label (ou autre widget qui supporte l'affichage d'images).
    Vous utilisez une bibliothèque/programme externe pour afficher vos vidéos. Dans ce cas, on peut lui demander (s'il le supporte) d'afficher dans une fenêtre contrôlée par tkinter.

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

  3. #3
    Membre confirmé
    Homme Profil pro
    Directeur technique
    Inscrit en
    Septembre 2011
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2011
    Messages : 91
    Par défaut Flux video
    Merci pour vos réponses mais comment afficher la vidéo image par image.

    Merci d'avance.

    Samuel

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    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 681
    Par défaut
    Salut,

    Citation Envoyé par patarins Voir le message
    Merci pour vos réponses mais comment afficher la vidéo image par image.
    çà dépend de l'interface existante avec la caméra: il n'y a que vous pour le savoir en consultant la documentation de l'engin et/ou en recherchant sur Internet ce qu'on peut en faire via Python.

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

  5. #5
    Membre confirmé Avatar de racine carrée
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 156
    Par défaut
    Bonjour,
    je ne sais pas si cela peut vous aider, mais voici comment afficher le flux video de la webcam dans une fenêtre pendant un temps que l'on choisit (ici 30 s):
    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
    import cv2,time
    n=.5 #échelle d'affichage du flux video
    l,L=720,1280  #choix de la résolution du flux video
     
    cap = cv2.VideoCapture(0)
    cap.set(l, L)
    temps=30
    t=time.time()
    while time.time()-t<temps:
        ret,im = cap.read()
        img=cv2.resize(im,(int(n*L),int(n*l)))
        cv2.imshow('Que tu es beau !!!',img)
        key = cv2.waitKey(1)
     
    cap.release()
    Par contre je ne sais pas comment envoyer le flux video à Tkinter.
    Bon courage.

  6. #6
    Membre confirmé Avatar de racine carrée
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2018
    Messages : 156
    Par défaut
    Bonjour,
    je ne sais pas si cela peut vous aider, mais voici comment afficher le flux video de la webcam dans une fenêtre pendant un temps que l'on choisit (ici 30 s):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import cv2,time
    n=.5 #échelle d'affichage du flux video
    l,L=720,1280  #choix de la résolution du flux video
    cap = cv2.VideoCapture(0)
    cap.set(l, L)
    temps=30
    t=time.time()
    while time.time()-t<temps:
        ret,im = cap.read()
        img=cv2.resize(im,(int(n*L),int(n*l)))
        cv2.imshow('Que tu es beau !!!',img)
        key = cv2.waitKey(1)
     
    cap.release()
    Par contre je ne sais pas comment envoyer le flux video à Tkinter.
    Bon courage.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 4
    Par défaut
    Bonjour,

    Je souhaite intégrer un flux vidéo provenant de la picamera dans une fenêtre tkinter. Pour afficher les flux vidéo je suis passé par une liaison TCP. Le but étant de créer une interface permettant de visualiser le flux vidéo en direct mais aussi d’afficher différentes variables.

    Toutes aide apportée sera la bienvenue.
    Cordialement

    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
     
    import numpy as np
    import cv2
    import socket
    from tkinter import*
     
    class VideoStreamingTest(object):
        def init(self, host, port):
     
            self.server_socket = socket.socket()
            self.server_socket.bind((host, port))
            self.server_socket.listen(0)
            self.connection, self.client_address = self.server_socket.accept()
            self.connection = self.connection.makefile('rb')
            self.host_name = socket.gethostname()
            self.host_ip = socket.gethostbyname(self.host_name)
            self.streaming()
     
        def streaming(self):
     
            try:
                print("Host: ", self.host_name + ' ' + self.host_ip)
                print("Connection from: ", self.client_address)
                print("Streaming...")
                print("Press 'q' to exit")
     
                # need bytes here
                stream_bytes = b' '
                while True:
                    stream_bytes += self.connection.read(1024)
                    first = stream_bytes.find(b'\xff\xd8')
                    last = stream_bytes.find(b'\xff\xd9')
                    if first != -1 and last != -1:
                        jpg = stream_bytes[first:last + 2]
                        stream_bytes = stream_bytes[last + 2:]
                        image1 = cv2.imdecode(np.frombuffer(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
                        cv2.imshow('image1', image1)
     
                        #window = Tk()
                        #window.geometry('1080x720')
                        #frame1 = Frame(window, width=1080, height=720)
                        #frame1.pack()
                        #window.mainloop()
     
                        if cv2.waitKey(1) & 0xFF == ord('q'):
                            break
            finally:
                self.connection.close()
                self.server_socket.close()
     
     
    if name == 'main':
        # host, port
        h, p = "192.168.0.14", 8000
        VideoStreamingTest(h, p)

  8. #8
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    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 681
    Par défaut
    Salut,

    Citation Envoyé par KleinBagel Voir le message
    Toutes aide apportée sera la bienvenue.
    A la base, c'est pas si compliqué: vous récupérez une image cv2 à transformer avec PIL.Image en une PhotoImage tkinter saura afficher.
    Là où çà se complique, c'est qu'il va falloir encapsuler la réception des Image via TCP/IP dans un thread, histoire de ne pas bloquer l'interface utilisateur.
    Et, un peu de recherche sur Internet devrait vous permettre de trouver des tutos. et des codes qui montrent comment çà se construit. Mais il faut un peu comprendre comment fonctionnent threads et tkinter pour pouvoir adapter ces codes là à votre cas particulier.

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

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 4
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Là où çà se complique, c'est qu'il va falloir encapsuler la réception des Image via TCP/IP dans un thread, histoire de ne pas bloquer l'interface utilisateur.
    Merci de votre réponse.
    Suite à votre réponse j'ai réussi transformer une image cv2 en une photo image tkinter mais désormais l'image cv2 et tkinter bloque et je ne maîtrise pas les thread.

    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
    import numpy as np
    import cv2
    import socket
    from PIL import Image as Img
    from PIL import ImageTk
    import tkinter
     
    from tkinter import*
     
    class VideoStreamingTest(object):
        def __init__(self, host, port):
     
            self.server_socket = socket.socket()
            self.server_socket.bind((host, port))
            self.server_socket.listen(0)
            self.connection, self.client_address = self.server_socket.accept()
            self.connection = self.connection.makefile('rb')
            self.host_name = socket.gethostname()
            self.host_ip = socket.gethostbyname(self.host_name)
            self.streaming()
     
        def streaming(self):
     
            try:
                print("Host: ", self.host_name + ' ' + self.host_ip)
                print("Connection from: ", self.client_address)
                print("Streaming...")
                print("Press 'q' to exit")
     
                # need bytes here
                stream_bytes = b' '
                while True:
                    stream_bytes += self.connection.read(1024)
                    first = stream_bytes.find(b'\xff\xd8')
                    last = stream_bytes.find(b'\xff\xd9')
                    if first != -1 and last != -1:
                        jpg = stream_bytes[first:last + 2]
                        stream_bytes = stream_bytes[last + 2:]
                        image = cv2.imdecode(np.frombuffer(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
                        cv2.imshow('image', image)
     
     
                        b, g, r = cv2.split(image)
                        image = cv2.merge((r, g, b))
     
                        window = tkinter.Tk()
     
                        im = Img.fromarray(image)
                        imgtk = ImageTk.PhotoImage(image=im)
     
                        tkinter.Label(window, image=imgtk).pack()
     
                        window.mainloop()  # Start the GUI
     
                        if cv2.waitKey(1) & 0xFF == ord('q'):
                            break
            finally:
                self.connection.close()
                self.server_socket.close()
     
     
    if __name__ == '__main__':
        # host, port
        h, p = "192.168.0.14", 8000
        VideoStreamingTest(h, p)

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    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 681
    Par défaut
    Salut,

    Citation Envoyé par KleinBagel Voir le message
    tkinter bloque et je ne maîtrise pas les thread.
    Convertir une image cv2 en PhotoImage, c'est juste ajouter 2 instructions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                        im = Img.fromarray(image)
                        imgtk = ImageTk.PhotoImage(image=im)
    programmer avec tkinter et des threads, c'est non seulement des instructions à connaître mais aussi organiser/penser son code différemment.

    Si vous ne maîtrisez ni l'un ni l'autre, il faut y passer du temps et les tutos. sont faits pour vous.

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

  11. #11
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 4
    Par défaut
    Bonjour,
    J'ai essayé de mettre en place les threads mais je n'ai pas réussi.
    Cependant contrairement à avant, la réception des images n'est plus bloquante du fait que le root.mainloop est dans le main.
    J'obtiens une erreur lorsque je souhaite afficher la vidéo.

    Nom : unknown.png
Affichages : 2571
Taille : 2,2 Ko

    De ce que j'ai compris cela est dû à l'accumulation de création d’instance tk(). Quand je commente la ligne 60, il n'y a plus le message d'erreur. Je pense qu'il faut utiliser une fonction de destruction de fenêtre mais je n'ai pas réussi à la mettre en place.
    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
    73
    74
    75
    76
    77
    78
    79
     
    import numpy as np
    import cv2
    import socket
    from PIL import Image as Img
    from PIL import ImageTk
    from tkinter import*
    import tkinter
    #import threading
     
    class Application(object):
        def __init__(self, host, port):
            """ Initialize application which uses OpenCV + Tkinter. It displays
                a video stream in a Tkinter window  """
     
            self.server_socket = socket.socket()
            self.server_socket.bind((host, port))
            self.server_socket.listen(0)
            self.connection, self.client_address = self.server_socket.accept()
            self.connection = self.connection.makefile('rb')
            self.host_name = socket.gethostname()
            self.host_ip = socket.gethostbyname(self.host_name)
     
            self.video_loop()
     
        def video_loop(self):
            """ Get frame from the video stream and show it in Tkinter """
     
            try:
                print("Host: ", self.host_name + ' ' + self.host_ip)
                print("Connection from: ", self.client_address)
                print("Streaming...")
                print("Press 'q' to exit")
     
                # need bytes here
                stream_bytes = b' '
                while True:
                    stream_bytes += self.connection.read(1024)
                    first = stream_bytes.find(b'\xff\xd8')
                    last = stream_bytes.find(b'\xff\xd9')
                    if first != -1 and last != -1:
                        jpg = stream_bytes[first:last + 2]
                        stream_bytes = stream_bytes[last + 2:]
                        image = cv2.imdecode(np.frombuffer(jpg, dtype=np.uint8), cv2.IMREAD_COLOR)
                        cv2.imshow('image', image)
     
                        # Rearrang the color channel
                        b, g, r = cv2.split(image)
                        image = cv2.merge((r, g, b))
     
                        root = tkinter.Tk()  # initialize root window
                        longueur = 1080
                        hauteur = 700
                        root.geometry('%dx%d' % (longueur, hauteur))
     
                        im = Img.fromarray(image)  # convert image for PIL
                        imgtk = ImageTk.PhotoImage(image=im)  # convert image for tkinter
     
                        panel = tkinter.Label(root)
                        panel.pack()
                        panel.config(image=imgtk)  # show the image
                        if cv2.waitKey(1) & 0xFF == ord('q'):
                            break
            finally:
                self.connection.close()
                self.server_socket.close()
     
        def destructor(self):
            root.destroy()
            cv2.destroyAllWindows()  # it is not mandatory in this application
     
    if __name__ == '__main__':
        # host, port
        h, p = "192.168.0.14", 8000
        Application(h, p)
        root.mainloop()
     
    #thread = threading.Thread(target=video_loop, args=(1,))
    #thread.start()

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 681
    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 681
    Par défaut
    Salut,

    Citation Envoyé par KleinBagel Voir le message
    Je pense qu'il faut utiliser une fonction de destruction de fenêtre mais je n'ai pas réussi à la mettre en place.
    Essayez de réfléchir un peu à ce que fait votre code: chaque fois qu'une nouvelle image est reçue, il faut l'afficher, i.e. mettre à jour l'image qu'affiche le Label.
    Créer une fenêtre, y afficher un Label,... n'est à faire qu'une seule fois.

    La principale difficulté que vous avez est de vouloir réaliser quelque chose de compliqué sans savoir le décomposer en opérations simples que vous pourrez composer ensuite.
    Si vous aviez ouvert un tuto. et appris à utiliser Tkinter, vous sauriez fabriquer un chronomètre ou une horloge (un truc qui met à jour un Label toutes les secondes).
    Puis remplacer la mécanique de mise à jour tkinter par un thread.
    Afficher des images récupérées sur Internet, c'est juste une adaptation de ces mécaniques de base.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/04/2008, 13h59
  2. Enregistrer flux Video d'une WEBCAM
    Par yakoz dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/03/2006, 15h23
  3. Réponses: 6
    Dernier message: 10/03/2006, 13h50
  4. [Info] Comment recupere le flux video en JAVA?
    Par jeanluc38 dans le forum Multimédia
    Réponses: 4
    Dernier message: 26/11/2005, 01h27
  5. [Indy] Client-serveur pour recevoir des flux videos
    Par Nicodemus dans le forum Web & réseau
    Réponses: 7
    Dernier message: 10/10/2005, 14h18

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