Gestion et affichage de deux webcams (videocapture + pil)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 777 fois - Téléchargée 24 fois

Contenu du snippet

Un simple bout de code que j'ai réalisé. En fait c'est le debut d'un projet de stereo vision.
Le code n'est pas franchement optimisé, et c'etais pour moi uniquement un moyen d'apprendre le python.

Ce code cherche les deux premieres sources video, et les affiche dans les deux canvas du haut (gauche et droite)
Les deux canvas du bas affiche ces video apres application d'un filtre de detection de contours.

Source / Exemple :


from   VideoCapture import Device
from   PIL          import Image, ImageTk
import ImageFilter
from   Tkinter      import *
import time

class Affichage(Frame):
    """ Affiche L'image Calculee """

    def __init__(self, parent, temps="0:0:0"):
        Frame.__init__(self, parent)
        self.parent = parent
        
        self.CameraGauche = Device(devnum = 0, showVideoWindow =0)
        self.CameraDroite = Device(devnum = 1, showVideoWindow =0)

        self.AffichageG = Canvas(self, width = 320, height = 240)
        self.AffichageD = Canvas(self, width = 320, height = 240)
        self.ResultG    = Canvas(self, width = 320, height = 240)
        self.ResultD    = Canvas(self, width = 320, height = 240)     
        self.AffichageG.grid(row=1, column=1)
        self.AffichageD.grid(row=1, column=2)
        self.ResultG.grid(row=2, column=1)
        self.ResultD.grid(row=2, column=2)
        self.Rafraichis()

    def Rafraichis(self):                                
        self.PhotoGauche  = self.CameraGauche.getImage()
        self.PhotoDroite  = self.CameraDroite.getImage()
        
        self.ImageGauche = ImageTk.PhotoImage(self.PhotoGauche)
        self.ImageDroite = ImageTk.PhotoImage(self.PhotoDroite)
        
        self.AffichageG.create_image(160,120, image = self.ImageGauche)
        self.AffichageD.create_image(160,120, image = self.ImageDroite)

        self.PhotoGauche = self.PhotoGauche.filter(ImageFilter.FIND_EDGES)
        self.PhotoDroite = self.PhotoDroite.filter(ImageFilter.FIND_EDGES)

        self.PhotoDroite = self.PhotoDroite.filter(ImageFilter.SMOOTH_MORE)
        self.PhotoGauche = self.PhotoGauche.filter(ImageFilter.SMOOTH_MORE)

        
        self.CalculGauche = ImageTk.PhotoImage(self.PhotoGauche)   
        self.CalculDroite = ImageTk.PhotoImage(self.PhotoDroite)   
        
        self.ResultG.create_image(160,120,image = self.CalculGauche)
        self.ResultD.create_image(160,120,image = self.CalculDroite)

        self.parent.after(100, self.Rafraichis)
        
        
    
root = Tk()
root.title('Vision Stereo ....')

Rendu = Affichage(root)
Rendu.pack()

root.mainloop()

Conclusion :


Petite explication :
--J'ai fait un dérivation de la classe Frame. Ca parait étrange, mais j'avais des soucis lors du lancement de root.mainloop(). L'affichage ne se mettais pas a jour ! J'ai donc mis l'appel a cette boucle dans a la fin de ma fonction d'affichage, mais l'occupation processeur grimpais au fur et a mesure (suis un boulet, je sais ;-) )
N'ayant pas trouver le moyen de creer un 'timer', qui interompt la boucle Tk, pour recuperer les images et les filter, je me suis dis qu'en tant que widget, ma classe serais rafraichie durant la mainloop(). J'ai ajouter une fonction Rafraichis(), qui est appelée toute les 100ms, grace a la fonction after(). C'est peu etre pas très élégant, mais ca fonctionne bien!

--Quand au reste du code : Apres définition des deux Webcam (Device 0&1), je recupere les images : GetImage()
Puis je transforme les images PIL en image TL , pour l'afficher dans mes canvas.
(Photo : PIL & Image : Tk), apres éventuellement application du filtre ImageFilter.FIND_EDGES.

C'est assez lent, et si quelqu'un a des idée , n'hésitez pas.
Je posterais le programme complet quand j'aurais finis l'algo permettant de passer des deux images, a une image representant la distance calculée de chaque pixel par rapport aux webcams.
(D'ailleurs si quelqu'un a une idée sur comment faire la correlation rapidement, je suis preneur !)

A voir également

Ajouter un commentaire

Commentaires

Messages postés
62
Date d'inscription
samedi 23 juin 2007
Statut
Membre
Dernière intervention
21 novembre 2015

Salut, j'aimerais reutiliser ton code pour faire des traitements directement sur lespixels comme ici dans le but de faire de la reconnaissance de plaque d'imatriculation. Sait tu s'il est possible de faire ça facilement?
Messages postés
93
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
6 janvier 2012

Bonjour,

Est-il possible de faire la même chose avec 3 caméras ?

Merci encore.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (cs_raoullevert)