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 diequit 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.
Dann akzeptieren Sie Ihre Antwort zu markieren beantwortet. –
SO fragt, dass ich bis morgen warten werde, um das zu tun, und ich werde ... – Raoul
einen Prozess abrupt einen richtigen Weg, um es zu tun beenden? – arvindh