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 delquit 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.
Quindi accettare la risposta per contrassegnare la risposta. –
SO chiede che aspetto fino a domani per farlo, e io ... – Raoul
sta terminando un processo in modo brusco per farlo correttamente? – arvindh