2013-06-12 4 views
5

Ich versuche derzeit, eine GUI für einen multiprocessed OpenCV Video Stream zu entwickeln. Der folgende Code gelingt es, dass dabei, da sie das Feed Video anzeigt und eine ‚Beenden‘ Taste, laufen aber in einer seltsamen Art und Weise:Anzeige eines OpenCV-Videos in tkinter mit Multiprocessing

  • das Programm wirft einen Laufzeitfehler in pythonw.exe (Ich bin mit Windows) beim beenden (entweder durch die quit button oder durch einen Klick auf 'X') sagen, das Programm das Fenster zu schließen „um die Laufzeit angewiesen, auf eine ungewöhnliche Art und Weise zu beenden“

Jede Idee, wie dieses Problem zu lösen würde sehr geschätzt werden!

Mein Code:

#!/usr/bin/python 

import numpy as np 
from multiprocessing import Process, Queue 
from Queue import Empty 
import cv2 
import cv2.cv as cv 
from PIL import Image, ImageTk 
import time 
import Tkinter as tk 

#tkinter GUI functions---------------------------------------------------------- 
def quit_(root, process): 
    process.join() 
    root.destroy() 

def update_image(image_label, queue): 
    frame = queue.get() 
    im = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) 
    a = Image.fromarray(im) 
    b = ImageTk.PhotoImage(image=a) 
    image_label.configure(image=b) 
    image_label._image_cache = b # avoid garbage collection 
    root.update() 

def update_all(root, image_label, queue): 
    update_image(image_label, queue) 
    root.after(0, func=lambda: update_all(root, image_label, queue)) 

#multiprocessing image processing functions------------------------------------- 
def image_capture(queue): 
    vidFile = cv2.VideoCapture(0) 
    while True: 
     try: 
     flag, frame=vidFile.read() 
     if flag==0: 
      break 
     queue.put(frame) 
     cv2.waitKey(20) 
     except: 
     continue 

if __name__ == '__main__': 
    queue = Queue() 
    print 'queue initialized...' 
    root = tk.Tk() 
    print 'GUI initialized...' 
    image_label = tk.Label(master=root)# label for the video frame 
    image_label.pack() 
    print 'GUI image label initialized...' 
    p = Process(target=image_capture, args=(queue,)) 
    p.start() 
    print 'image capture process has started...' 
    # quit button 
    quit_button = tk.Button(master=root, text='Quit',command=lambda: quit_(root,p)) 
    quit_button.pack() 
    print 'quit button initialized...' 
    # setup the update callback 
    root.after(0, func=lambda: update_all(root, image_label, queue)) 
    print 'root.after was called...' 
    root.mainloop() 
    print 'mainloop exit' 
    p.join() 
    print 'image capture process exit' 
  • Config: Windows 7 Home, Python 2.7.5, OpenCV 2.4
  • Haftungsausschluss: der Code oben this one inspiriert wurde.

Antwort

5

Ich löste es durch process.terminate() statt process.join() in der quit_(root, process) Funktion.

+0

Dann akzeptieren Sie Ihre Antwort zu markieren beantwortet. –

+2

SO fragt, dass ich bis morgen warten werde, um das zu tun, und ich werde ... – Raoul

+0

einen Prozess abrupt einen richtigen Weg, um es zu tun beenden? – arvindh