2013-05-03 10 views
6

Ho fatto un programma con python, importando le librerie di OpenCV. Ora sto facendo la GUI in Tkinter. Sto cercando di mostrare la webcam nella GUI, ma non ho potuto. Inserisco il codice nella Funzione perché vorrei che con un pulsante vedessi la mia webcam.Mostra sequenza video TkInter

Il mio codice è:

def webcam(): 
    img= cv.QueryFrame(cap) 
    cam= PhotoImage(img) 
    label1 = Label(root, image=cam) 
    label1.image = cam 
    label1.pack() 
    label1.place(x=0, y=400) 

Inoltre, io non so come aggiornamento costante senza un ciclo, mentre, perché ho un altro pulsante per uscire dal programma.

risposta

2

provare questo codice:

from collections import deque 
import cv2 
from PIL import Image, ImageTk 
import time 
import Tkinter as tk 

def quit_(root): 
    root.destroy() 

def update_image(image_label, cam): 
    (readsuccessful, f) = cam.read() 
    gray_im = cv2.cvtColor(f, cv2.COLOR_BGR2GRAY) 
    a = Image.fromarray(gray_im) 
    b = ImageTk.PhotoImage(image=a) 
    image_label.configure(image=b) 
    image_label._image_cache = b # avoid garbage collection 
    root.update() 


def update_fps(fps_label): 
    frame_times = fps_label._frame_times 
    frame_times.rotate() 
    frame_times[0] = time.time() 
    sum_of_deltas = frame_times[0] - frame_times[-1] 
    count_of_deltas = len(frame_times) - 1 
    try: 
     fps = int(float(count_of_deltas)/sum_of_deltas) 
    except ZeroDivisionError: 
     fps = 0 
    fps_label.configure(text='FPS: {}'.format(fps)) 


def update_all(root, image_label, cam, fps_label): 
    update_image(image_label, cam) 
    update_fps(fps_label) 
    root.after(20, func=lambda: update_all(root, image_label, cam, fps_label)) 


if __name__ == '__main__': 
    root = tk.Tk() 
    image_label = tk.Label(master=root)# label for the video frame 
    image_label.pack() 
    cam = cv2.VideoCapture(1) 
    fps_label = tk.Label(master=root)# label for fps 
    fps_label._frame_times = deque([0]*5) # arbitrary 5 frame average FPS 
    fps_label.pack() 
    # quit button 
    quit_button = tk.Button(master=root, text='Quit',command=lambda: quit_(root)) 
    quit_button.pack() 
    # setup the update callback 
    root.after(0, func=lambda: update_all(root, image_label, cam, fps_label)) 
    root.mainloop() 
11

Una semplice versione di cattura fotocamera utilizzando OpenCV e Tkinter:

import Tkinter as tk 
import cv2 
from PIL import Image, ImageTk 

width, height = 800, 600 
cap = cv2.VideoCapture(0) 
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width) 
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height) 

root = tk.Tk() 
root.bind('<Escape>', lambda e: root.quit()) 
lmain = tk.Label(root) 
lmain.pack() 

def show_frame(): 
    _, frame = cap.read() 
    frame = cv2.flip(frame, 1) 
    cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA) 
    img = Image.fromarray(cv2image) 
    imgtk = ImageTk.PhotoImage(image=img) 
    lmain.imgtk = imgtk 
    lmain.configure(image=imgtk) 
    lmain.after(10, show_frame) 

show_frame() 
root.mainloop() 

È necessario scaricare e installare PIL!

1

L'ho fatto e funziona correttamente. Ecco lo Link

Non ho assegnato il pulsante per mostrare il frame ma è possibile assegnare un pulsante ed eseguire per ottenere la risposta. So che l'uso della variabile globale è una cattiva pratica, ma continuo a usarla. Spero che sia d'aiuto.