2013-05-03 13 views
6

OpenCV kütüphanelerini içe aktarıp python ile bir program yaptım. Şimdi, Tkinter'de GUI yapıyorum. Web kamerasını GUI'de göstermeye çalışıyorum ama yapamadım. Kodu işleve koydum çünkü bir buton ile web kameramı görmek istiyorum.Web kamerası sırasını göster TkInter

Benim kodudur: Programa çıkmak için başka düğmeye çünkü Ayrıca

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) 

, ben, nasıl güncelleme sürekli bir süre döngüsü olmadan bilmiyorum.

cevap

2

bu kodu deneyin:

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

kamera yakalama basit versiyonu OpenCV ve Tkinter kullanarak:

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() 

Sen PIL indirip yüklemeniz gerekir!

1

Başarıyla yaptım ve başarılı bir şekilde çalışıyorum. Link

Çerçeveyi göstermek için atanmış bir düğüme sahibim, ancak bir düğme atayabilir ve yanıtınızı almak için çalıştırabilirsiniz. Küresel değişkenin kullanılmasının kötü bir uygulama olduğunu biliyorum ama yine de kullanıyorum. Umarım yardımcı olur.

İlgili konular