Gestion et affichage de deux webcams (videocapture + pil)

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

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)