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

Posted

技术标签:

【中文标题】使用多处理在 tkinter 中显示 OpenCV 视频【英文标题】:Display an OpenCV video in tkinter using multiprocessing 【发布时间】: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。

【问题讨论】:

【参考方案1】:

我通过在quit_(root, process) 函数中使用process.terminate() 而不是process.join() 解决了这个问题。

【讨论】:

突然终止进程是一种正确的方法吗?

以上是关于使用多处理在 tkinter 中显示 OpenCV 视频的主要内容,如果未能解决你的问题,请参考以下文章

在 Linux 上使用多处理时不出现 TKinter 窗口

使用 OpenCV 读取图像并使用 Tkinter 显示

Python:在使用多处理时更新 Tkinter

将 OpenCV 与 Tkinter 一起使用

MatplotLib (TKinter) + OpenCV 在 Python 3 中崩溃

[python][转载]tkinter opencv显示视频一闪一闪解决方法