5

現在、マルチプロセス OpenCV ビデオストリーム用のGUIを開発しようとしています。以下のコードは、ビデオ フィードと「終了」ボタンを表示するため、これに成功しますが、奇妙な方法で実行されます。

  • プログラムは、(私はウィンドウを使用しています)終了時に(またはをクリックしてウィンドウを閉じることにより)ランタイムエラーを発生させ、プログラムは「異常な方法でランタイムを終了するように要求しました」と言いますpythonw.exequit 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 ホーム、Python 2.7.5、OpenCV 2.4
  • 免責事項: 上記のコードは、これに触発されたものです。
4

1 に答える 1

5

関数process.terminate()の代わりに使用して解決しましprocess.join()た。quit_(root, process)

于 2013-06-12T19:14:30.937 に答える