使用多处理在tkinter中显示OpenCV视频

时间:2013-06-12 18:59:12

标签: python opencv tkinter multiprocessing

我目前正在尝试为多处理的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

1 个答案:

答案 0 :(得分:5)

我在process.terminate()函数中使用process.join()代替quit_(root, process)解决了这个问题。