当前位置: 首页 > 面试题库 >

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

咸浩初
2023-03-14
问题内容

我目前正在尝试为 多处理OpenCV视频* 流开发 GUI
。下面的代码确实成功执行了此操作,因为它显示了视频供稿和一个“退出”按钮,但是运行方式很奇怪:
*

  • 该程序 在退出时* (通过单击或通过单击关闭窗口)在(我正在使用Windows)中引发 运行时错误 ,表示程序“要求运行时以异常方式终止”pythonw.exe *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

问题答案:

我通过在函数中使用process.terminate()代替来解决它。process.join()``quit_(root, process)



 类似资料:
  • 问题内容: 我正在编写一个程序,该程序需要在Tkinter窗口中显示视频流。由于还将有用于执行各种功能的按钮,因此我使用网格来组织一切。 以下代码是从“显示”网络摄像头序列TkInter修改而来的,在我的Raspberry Pi上可以正常工作: 但是,将其与Tkinter结合使用是行不通的。(在下面的内容中,我尝试注释掉Display 1,Display 2和都不显示。) 如何显示视频? 问题答案

  • 我一直在TkinterGUI上工作,而且是新手。现在我想使用Opencv显示一个图像,在一个单独的窗口中单击按钮,因此首先我使用askopenfilename()获取图像路径,然后将该值传递给cv2。下面是imread()代码。 图像显示在一个新窗口中,但当我试图关闭它时,Tkinter应用程序也会关闭。我需要在图像上执行一些任务,然后在不影响Tkinter应用程序的情况下按键关闭它。它可以用线程

  • 问题内容: 如何在没有多线程的情况下在python中运行多个进程?例如考虑以下问题: 我们必须制作一个Gui,它具有一个启动一个函数的开始按钮(例如,打印所有整数),还有一个停止按钮,以便单击该按钮可以停止该函数。 如何在Tkinter中做到这一点? 问题答案: 然后,您需要将小部件与启动工作线程的函数绑定在一起。例如: 通过这种方法,您只能通过更改其值来优雅地结束线程。注意,使用多个线程可避免在

  • 问题内容: 我已经使用桥接标头(将Swift连接到Objective C)和目标C包装器(将Objective C连接到C )集成了Swift IOS项目中的opencv。使用这种方法,我可以从Swift代码中传递单个图像,在C 文件中对其进行分析并取回它们。 我已经看到opencv提供了可以与Objective C UIViewController集成的CvVideoCamera对象。 但是由于

  • 问题内容: 我正在尝试制作一个程序来使用Tkinter显示动画GIF。这是我最初使用的代码: test.gif是以下GIF: 这可以正常工作,但是GIF的质量很糟糕。我尝试将其更改为以下内容: 但是,这偶尔会闪烁图像。虽然图片看起来不错,但是作为程序却毫无用处。我究竟做错了什么? 问题答案: 首先,您要为每个帧创建一个新的画布对象。最终,您将有成千上万的图像相互叠加。这是非常低效的;当您开始具有数

  • 问题内容: 我是OpenCV的初学者。我想对要上传到服务器的视频帧进行一些图像处理。我只想读取可用的框架并将它们写入目录中。然后,等待视频的另一部分上载并将帧写入目录。并且,我应该等待每个帧都完全上传,然后将其写入文件。 您能告诉我如何使用OpenCV(Python)吗? 编辑1: 我编写了这段代码,用于从文件中捕获视频,而新数据将附加在文件末尾。换句话说,该文件不是完整的视频,并且另一个程序正在