2013-06-12 24 views
5

Attualmente sto cercando di sviluppare una GUI per un multiprocessed video di OpenCV flusso. Il codice qui sotto non riesce a farlo, dal momento che visualizza il feed video e un pulsante 'uscire', ma viene eseguito in una strana maniera:visualizzazione di un video di OpenCV in tkinter utilizzando multiprocessing

  • il programma genera un errore di runtime a pythonw.exe (sto usando Windows) su quit (sia da parte del quit button o chiudendo la finestra cliccando sul 'X') dicendo che il programma di "richiesto al runtime l'interruzione in modo insolito"

Qualche idea su come risolvere il problema sarebbe molto apprezzato!

Il mio codice:

#!/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
  • di responsabilità: il codice di cui sopra è stato ispirato da this one.

risposta

5

ho risolto utilizzando process.terminate() anziché process.join() nella funzione quit_(root, process).

+0

Quindi accettare la risposta per contrassegnare la risposta. –

+2

SO chiede che aspetto fino a domani per farlo, e io ... – Raoul

+0

sta terminando un processo in modo brusco per farlo correttamente? – arvindh

Problemi correlati