Partage
  • Partager sur Facebook
  • Partager sur Twitter

Affciher un canevas et ce que la webcam voit

avec VideoCapture

    20 août 2010 à 16:31:51

    Bonjour tout le monde,

    J'aimerais afficher ce que ma web voit dans un canevas Python.

    IL y a une bibliothèque qui s'appelle VideoCapture qui existe et qui je pense, peux faire cela.

    VideoCapture

    J'ai essayé d'afficher un canevas avec ce que le webcam voit mais sans succès :

    Voici le code de mon programme (n'a rien à voir avec VideoCapture)

    #coding:latin1
    
    from Tkinter import Tk,LabelFrame,Button,Entry,Label,Spinbox,Frame,StringVar,\
         Radiobutton,Checkbutton,BooleanVar
    from time import time,sleep
    import os
    from VideoCapture import Device
    
    
    ### Défintion des fonctions ###
    def convert(tps=0):
        sec = tps%60
        min = (tps/60)%60
        heu = (tps/3600)
        day = (heu/24)
        heu = heu%24
        return (day,heu,min,sec)
    
    
    ### Défintion des classes ###
    
    class Timer:
        def __init__(self):
            pass
        def start(self,tps):
            self.total = tps
            self.restant = tps
            self.conte = 0
            self.init = time()
        def get(self):
            self.tps = int(self.restant-(time()-self.init))
            return convert(self.tps)
    
        def get_duree(self):
            return time()-self.init
    
    
    ### nouvelle classe! ###
    class Progress(Frame):
        """Barre de progresion"""
        def __init__(self,master=None,value=100,width=32,bg='gray'):
            Frame.__init__(self,master,width=width,relief='sunken',bd=2)
            self.larg =width
            width = int(value/width)
            self.lbl = Label(self,bg=bg)
            self.lbl.pack(side='left')
            self.rst = Label(self)
            self.rst.pack(side='right')
            self.set(value)
        def set(self,value=0):
            width = ((value*self.larg)/100.0)%self.larg
            width = int(width)
            rest = (self.larg-width)
            txt1 = ''
            txt2 = ''
            if value>=50:
                txt1 = str(value)+'%'
            else:
                txt2 = str(value)+'%'
            self.lbl.configure(text=txt1,width=width)
            self.rst.configure(text=txt2,width=rest)
            if value == 100:
                self.lbl.configure(width=self.larg)
                self.rst.pack_forget()
            else:
                self.rst.pack(side='right')
            
    ### Quelques valeurs globales ###
    larg_chk = 16
    larg_btn = 15
    larg_msg = 30
    
    
    ### Panneau Experiment ###
    class panneau1(LabelFrame):
        """ Eléments à accès externe
    self.txt_msg:pour le configure la premier zone de message
        self.txt_msg.configure(text=nouveau_message)
        
    self.sel_delay:pour la valeur de delay
        self.sel_delay.get() pour récupérer la valeur (puis
        convertir sous forme d'entier): int(val)
        
    self.sel_acq:pour la valeur de acq
        self.sel_acq.get() pour récupérer la valeur (puis
        convertir sour forme d'entier): int(val)
        
    self.choixformat: pour le  format de sauvegarde sélectionné
        self.choixformat.get() pour récupérer le format sélecionné
        
    self.txt_total: pour afficher le temps total
        self.txt_total.configure(text=nouveau_temps)
        
    self.chk_close: pour la valeur de la case "Close at end"
        self.chk_close.get() pour récupérer le choix de l'utilisateur
    """
        def __init__(self,parent=None):
            global larg_chk,larg_btn
            LabelFrame.__init__(self,parent,text='Experiment',bd=4,padx=5,pady=5,
                                relief='sunken')
            frm = Frame(self)
            frm.grid(row=1,column=1)
            ## Les labels
            #Le label qui affiche les messages en dessous de Experiment
            self.msg_var = StringVar(self,value='L.allemand_FC10_12_08_2010_e2')
            self.txt_msg = Entry(self,width=larg_msg,textvariable=self.msg_var,
                                 relief='sunken')
            lbl_delay = Label(frm,text='delay(s)',anchor='nw')
            lbl_acq = Label(frm,text='# acq.',anchor='nw')
            lbl_total = Label(frm,text='Total',anchor='nw')
            
            ## Les commandes
            #Le sélecteur de delay
            self.sel_delay = Spinbox(frm,from_=1,to=4096,width=larg_chk,state='readonly',
                                     bd=2,repeatinterval=30)
            #Veuillez excuser la méthode un peu violente
            default_delay = 1080
            for i in range(default_delay-1):
                self.sel_delay.invoke("buttonup")
            #spin=Spinbox(root, from_=0.0, to=10.0, increment=1.0).pack()
            #self.var_delay = IntVar(self.sel_delay,value=1024)
            #self.sel_delay.setvar(self.var_delay,'1024')
            #Le sélecteur de acq.
            self.sel_acq = Spinbox(frm,from_=0,to=10000,width=larg_chk,state='readonly',
                                   bd=2,increment=60)
            #Veuillez excuser la méthode un peu violente
            default_acq = 4
            for i in range(default_acq):
                self.sel_acq.invoke("buttonup")
            #Les cases à cocher
            formatimage = ("JPG","BMP")
            sticks = ('w','e')
            self.choixformat = StringVar()
            self.choixformat.set(formatimage[0])
            #Création des 2 "boutons radio":
            self.checks = []
            for n in range(2):
                bout = Radiobutton(frm,
                                   text = formatimage[n],
                                   variable = self.choixformat,
                                   value = formatimage[n],)
                bout.grid(row=3,column=n+1,sticky=sticks[n])
                self.checks.append(bout)
            #Le label qui affiche le temps total
            self.txt_total =Label(frm,text='3 days 00:00:00',width=16,relief='sunken')
            #La case à cocher close_at_end
            self.bol_close = BooleanVar(value=False)
            self.chk_close = Checkbutton(frm,text='Close at end',variable=self.bol_close)
            #Le boutton exit
            #C'est à vous de voir comment vous allez gérer la sortie!
            #le paramètre command devra être remplacé par une de vos méthodes
            self.btn_exit = Button(frm,text='Exit',command=self.master.destroy,
                                   width=larg_btn)
            
            ## Affichage des widgets
            self.txt_msg.grid(row=0,column=1)
            lbl_delay.grid(row=1,column=1,sticky='w')
            lbl_acq.grid(row=2,column=1,sticky='w')
            self.sel_delay.grid(row=1,column=2,sticky='e')
            self.sel_acq.grid(row=2,column=2,sticky='e')
            lbl_total.grid(row=4,column=1,sticky='w')
            self.txt_total.grid(row=4,column=2,sticky='e')
            self.chk_close.grid(row=5,column=1,sticky='w')
            self.btn_exit.grid(row=5,column=2,sticky='e')
            self.tps = 240*1080
            self.sel_delay.configure(command=self.change)
            self.sel_acq.configure(command=self.change)
            self.change()
    
        def change(self):
            """Change les paramètres internes en fonction de acq
    et de delay"""
            self.tps = int(self.sel_delay.get())*(int(self.sel_acq.get()))
            tps = convert(self.tps)
            txt = str(tps[0])+' days '+str(tps[1]).rjust(2,'0')+':'+\
                  str(tps[2]).rjust(2,'0')+':'+str(tps[3]).rjust(2,'0')
            self.txt_total.configure(text=txt)
    
    
    
    ### Panneau Acquisition ###
    class panneau2(LabelFrame):
        """Eléments externes
    self.cpt1: La première barre de progression
        self.cpt1.set(valeur) pour changer la valeur du compteur
        
    self.txt_acq: pour changer le rapport '331/1030'
        self.txt_acq.configure(text=nouvelle_valeur)
        
    self.cpt2: La deuxième barre de progression
        self.cpt2.set(valeur) pour changer la valeur du compte
    
    self.txt_time: Pour changer le texte de temps
        self.txt_time.configure(text=nouveau_temps)
    """
        def __init__(self,parent=None,rec=None,stop=None):
            LabelFrame.__init__(self,text='Acquisition',bd=4,relief='sunken')
            frm = Frame(self)
            # La bare de progession n°1
            self.cpt1 = Progress(frm,value=100,width=14)
            # Le label qui afffiche le rapport de acq
            self.txt_acq = Label(frm,text='0/0',relief='sunken',bd=2,
                                 width=16)
            #La barre de progression n°2
            self.cpt2 = Progress(self,value=0,width=31)
            #Le label qui affiche la durée
            self.txt_time = Label(self,text='0 days 00:00:00',width=17,bd=2,
                                  relief='sunken',font = "{MS Sans Serif} 15")
            self.txt_time.grid(row=3,sticky='w')
            frm1 = Frame(self)
            #Le boutton d'enregistrement
            #le paramètre command devra être remplacé
            self.btn_rec = Button(frm1,text='REC',bg='red',width=larg_btn,
                                  activebackground='red',command=rec)
            #Le bouton d'arrêt
            #le paramètre command devra être remplacé
            self.btn_stop = Button(frm1,text='STOP',width=larg_btn,command=stop)
    
            ## Affichage des widgets
            self.cpt1.grid(row=1,column=1,sticky='w')
            self.txt_acq.grid(row=1,column=2,sticky='e')
            self.cpt2.grid(row=2,sticky='w')
            frm.grid(row=1,sticky='w')
            self.btn_rec.grid(row=1,column=1,sticky='w')
            self.btn_stop.grid(row=1,column=2,sticky='e')
            frm1.grid(row=4)
            
            
    class projet(Tk):
        """ Fenêtre principale
    name: le nom du bouton principal Mic 1/2/3/4
    titre: le titre de la fenêtre
    self.time: le timer il prend un argument facultatif,le temps de décompte
    exprimé en secondes
    
    Eléments externes:
    self.pan_exp: le panneau Experiment
    self.pan_acq: le panneau d'Acquisition
    """
        def __init__(self,name='Mic 1',titre='Etude de cellules'):
            Tk.__init__(self)
            self.title(titre)
            frm = Frame()
            #Le bouton mic
            self.btn_mic = Button(frm,text=name,width=larg_btn)
            #Le bouton max/min
            self.btn_max = Button(frm,text='Max/Min',width=larg_btn)
            #Le panneau Experiment
            self.pan_exp = panneau1(self)
            #Le panneau Acquisition
            self.pan_acq = panneau2(self,self.start_rec,self.stop_rec)
    
            ## Affichage des widgets
            frm.pack(side='top')
            self.btn_mic.pack(side='left',padx=3,pady=5)
            self.btn_max.pack(side='right',padx=3,pady=5)
            self.pan_exp.pack()
            self.pan_acq.pack()
            txt = """
    http://www.lib.ac.be.polytech/USA\t
    copyright 2010\t\t\t
    """
            Label(self,text=txt).pack()
            self.timer = Timer()
            self.rec = False
            self.alive = True
            self.started_rec = False
            
        def start_rec(self):
            """ Fonction initialisée lorsqu'on appuie sur Start/rec
    elle initialise les valeurs par défaut et désactive les
    commandes qui pourraient prêter à confusion
    """
            if not self.started_rec:
                #récupération  du nombre de photos
                self.nb_photos = int(self.pan_exp.sel_delay.get())
                #Délai de repétition des photos
                self.tps_repeat = int(self.pan_exp.sel_acq.get())
                #Index de départ des photos
                self.index = 0
                #Répertoire de sauvegarde des photos
                self.rep = self.pan_exp.msg_var.get()
                if not (os.path.isdir(self.rep)):
                    os.mkdir(self.rep)
                ## Désactivation des commandes à présent inutiles ##
                self.pan_exp.txt_msg.configure(state='readonly')
                self.pan_exp.sel_delay.configure(state='disable')
                self.pan_exp.sel_acq.configure(state='disable')
                self.pan_acq.btn_rec.configure(state='disable')
                for chk in self.pan_exp.checks:
                    chk.configure(state='disable')
                # Récupération de l'extension des fichiers
                self.format = '.'+self.pan_exp.choixformat.get()
                ## Activation des booléens
                if self.tps_repeat>0 and self.nb_photos>=0:
                    self.timer.start(self.pan_exp.tps)
                    self.started_rec = True
                    self.rec = True
                    #Lancement de la classe!
                    self.update_time()
                else:
                    self.stop_rec()
    
        def stop_rec(self):
            """Procédure lancée lors de l'appuie sur Stop
    elle arrête l'enregistrement et active les commande
    bloquées!"""
            ## Activation des commandes désactivées plus tôt
            self.pan_exp.txt_msg.configure(state='normal')
            self.pan_exp.sel_delay.configure(state='readonly')
            self.pan_exp.sel_acq.configure(state='readonly')
            self.pan_acq.btn_rec.configure(state='normal')
            for chk in self.pan_exp.checks:
                chk.configure(state='normal')
            ## Désactivation des booléen
            self.rec = False
            self.started_rec = False
    
        def action(self):
            """Procédure lancée toutes les X secondes, x étant
    la valeur en secondes dans le sélecteur acq"""
            print "Picture saved to "
            print self.rep+'\\Cellules_'+str(self.index)
            self.index+=1
            if self.nb_photos==self.index:
                self.pan_acq.cpt2.set(100)
                self.stop_rec()
                if self.pan_exp.bol_close.get():
                    self.alive = False
                    self.after(101,self.destroy)
            #self.after(self.tps_repeat,self.action)
            fic = self.rep+'\\Image_'+str(self.index)
            ## cam.save(fic)
            ## Ici le code de la fonction/
            ## procédure que vous désirez
            ## exécuter toutes les x secondes
            cam.saveSnapshot('image.jpg')
    
        def update_time(self):
            """Timer, qui se met à jour toutes les 100ms et
    décide s'il faut prendre une photo ou pas"""
            if self.alive and self.rec:
                #Récupération du temps restant en jours/heures/min/secs
                tps = self.timer.get()
                txt = str(tps[0])+' days '+str(tps[1]).rjust(2,'0')+':'+\
                      str(tps[2]).rjust(2,'0')+':'+str(tps[3]).rjust(2,'0')
                self.pan_acq.txt_time.configure(text=txt)
                #Récupération du temps écoulé
                tps = self.timer.get_duree()
                # mise à jour de la barre de progressoin n°2
                pourcent = round((tps)*100/self.timer.total,3)
                self.pan_acq.cpt2.set(pourcent)
                tps = int(tps)
                # Test puis prise de la photo si le timing est exact!
                if (tps)%self.tps_repeat==0 and tps!=0:
                    self.action()
                # Le timer est réglé sur 1000 ms
                self.after(100,self.update_time)
                # Mise à jour du nombre de photos prises
                txt = str(self.index)+'/'+str(self.nb_photos)
                self.pan_acq.txt_acq.configure(text=txt)
                self.update()
            
            
    app = projet()
    app.mainloop()
    


    Je dois ajouter ces deux lignes de codes afin d'afficher un canevas avec ce que ma webcam filme :

    cam = Device(showVideoWindow =1)
    cam.saveSnapshot('c:\image.jpg')
    


    Je me demandais si je ne devais pas mettre ces lignes ici :

    class projet(Tk):
        """ Fenêtre principale
    name: le nom du bouton principal Mic 1/2/3/4
    titre: le titre de la fenêtre
    self.time: le timer il prend un argument facultatif,le temps de décompte
    exprimé en secondes
    
    Eléments externes:
    self.pan_exp: le panneau Experiment
    self.pan_acq: le panneau d'Acquisition
    """
        def __init__(self,name='Mic 1',titre='Etude de cellules'):
            Tk.__init__(self)
    


    Je devrais alors mettre le constructeur de la classe VideoCapture ?

    Merci d'avance pour l'aide.

    beegees
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      20 août 2010 à 23:26:37

      Tu devrais tester ton programme, car il y a beaucoup d'erreurs. Modifier au fur et à mesures et quand tu vois que tu ne sais pas résoudre, apporter le bout de code qui pose problème, car là vraisemblablement, personne n'a envie de lire ton code.

      • Partager sur Facebook
      • Partager sur Twitter
        21 août 2010 à 10:20:42

        Citation : fred1599

        Tu devrais tester ton programme, car il y a beaucoup d'erreurs. Modifier au fur et à mesures et quand tu vois que tu ne sais pas résoudre, apporter le bout de code qui pose problème, car là vraisemblablement, personne n'a envie de lire ton code.



        Beaucoup d'erreurs


        Tu m'inquiètes là.

        Si jamais tu vois des erreurs, n'hésite pas à m'indiquer à quel endroit s.t.p.

        Idem si je peux améliorer.

        Merci d'avance.

        beegees
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          21 août 2010 à 10:36:44

          En fait il n'y a pas d'erreurs :) J'étais un peu fatigué hier soir.

          Par contre je te conseille de diviser ton programme en plusieurs module, car c'est un peu long.

          Pour VideoCapture je ne connais pas, je regarderais demain.

          • Partager sur Facebook
          • Partager sur Twitter
            21 août 2010 à 10:38:30

            Citation : Fred

            Pour VideoCapture je ne connais pas, je regarderais demain.



            Merci Fred, très sympa.

            beegees
            • Partager sur Facebook
            • Partager sur Twitter

            Affciher un canevas et ce que la webcam voit

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown