【发布时间】:2013-06-09 00:31:06
【问题描述】:
我目前正在尝试为 多处理 OpenCV 视频 流开发 GUI。下面的代码确实成功了,因为它显示了视频源和一个“退出”按钮,但运行方式很奇怪:
- 程序在
pythonw.exe(我正在使用Windows)退出中引发运行时错误(通过quit button或通过单击关闭窗口'X') 说程序 “请求运行时以异常方式终止”
任何关于如何解决该问题的想法将不胜感激!
我的代码:
#!/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'
- 配置:Windows 7 Home、Python 2.7.5、OpenCV 2.4
- 免责声明:以上代码的灵感来自this one。
【问题讨论】:
标签: python opencv tkinter multiprocessing