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

在Tkinter中使用OpenCV

濮阳奇逸
2023-03-14
问题内容

我正在编写一个程序,该程序需要在Tkinter窗口中显示视频流。由于还将有用于执行各种功能的按钮,因此我使用网格来组织一切。

以下代码是从“显示”网络摄像头序列TkInter修改而来的,在我的Raspberry Pi上可以正常工作:

import Tkinter as tk
import cv2
from PIL import Image, ImageTk

width, height = 800, 600
cap = cv2.VideoCapture(0)

root = tk.Tk()
lmain = tk.Label(root)
lmain.pack()

def show_frame():
    _, frame = cap.read()
    frame = cv2.flip(frame, 1)
    cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
    img = Image.fromarray(cv2image)
    imgtk = ImageTk.PhotoImage(image=img)
    lmain.imgtk = imgtk
    lmain.configure(image=imgtk)
    lmain.after(10, show_frame)

show_frame()
root.mainloop()

但是,将其与Tkinter结合使用是行不通的。(在下面的内容中,我尝试注释掉Display 1,Display 2和都不显示。)

import numpy as np
import cv2
import Tkinter as tk
import Image, ImageTk

#Set up GUI
window = tk.Tk()  #Makes main window
window.wm_title("Digital Microscope")
window.config(background="#FFFFFF")

#Graphics window
imageFrame = tk.Frame(window, width=600, height=500)
imageFrame.grid(row=0, column=0, padx=10, pady=2)

#Capture video frames
lmain = tk.Label(imageFrame)
cap = cv2.VideoCapture(0)
def show_frame():
    _, frame = cap.read()
    frame = cv2.flip(frame, 1)
    cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
    img = Image.fromarray(cv2image)
    imgtk = ImageTk.PhotoImage(image=img)
    lmain.imgtk = imgtk
    lmain.configure(image=imgtk)
    lmain.after(10, show_frame)

tk.Label(imageFrame, image=show_frame()).grid(row=0, column=0, padx=10, pady=2)  #Display 1


#Slider window (slider controls stage position)
sliderFrame = tk.Frame(window, width=600, height=100)
sliderFrame.grid(row = 600, column=0, padx=10, pady=2)


show_frame()  #Display 2
window.mainloop()  #Starts GUI

如何显示视频imageFrame


问题答案:

这应该工作:

import numpy as np
import cv2
import Tkinter as tk
import Image, ImageTk

#Set up GUI
window = tk.Tk()  #Makes main window
window.wm_title("Digital Microscope")
window.config(background="#FFFFFF")

#Graphics window
imageFrame = tk.Frame(window, width=600, height=500)
imageFrame.grid(row=0, column=0, padx=10, pady=2)

#Capture video frames
lmain = tk.Label(imageFrame)
lmain.grid(row=0, column=0)
cap = cv2.VideoCapture(0)
def show_frame():
    _, frame = cap.read()
    frame = cv2.flip(frame, 1)
    cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
    img = Image.fromarray(cv2image)
    imgtk = ImageTk.PhotoImage(image=img)
    lmain.imgtk = imgtk
    lmain.configure(image=imgtk)
    lmain.after(10, show_frame)



#Slider window (slider controls stage position)
sliderFrame = tk.Frame(window, width=600, height=100)
sliderFrame.grid(row = 600, column=0, padx=10, pady=2)


show_frame()  #Display 2
window.mainloop()  #Starts GUI

首先,您已经有了这行tk.Label(imageFrame, image=show_frame()).grid(row=0, column=0, padx=10, pady=2),并且由于show_frame()没有返回任何内容,因此您将其设置imageNone。其次,您需要确保您lmain.grid(),否则lmain不会显示。

如果要在两个显示器之间一个显示另一个,则可以执行以下操作:

import numpy as np
import cv2
import Tkinter as tk
import Image, ImageTk

#Set up GUI
window = tk.Tk()  #Makes main window
window.wm_title("Digital Microscope")
window.config(background="#FFFFFF")

#Graphics window
imageFrame = tk.Frame(window, width=600, height=500)
imageFrame.grid(row=0, column=0, padx=10, pady=2)

#Capture video frames

cap = cv2.VideoCapture(0)

def show_frame():
    _, frame = cap.read()
    frame = cv2.flip(frame, 1)
    cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
    img = Image.fromarray(cv2image)
    imgtk = ImageTk.PhotoImage(image=img)
    display1.imgtk = imgtk #Shows frame for display 1
    display1.configure(image=imgtk)
    display2.imgtk = imgtk #Shows frame for display 2
    display2.configure(image=imgtk)
    window.after(10, show_frame)

display1 = tk.Label(imageFrame)
display1.grid(row=1, column=0, padx=10, pady=2)  #Display 1
display2 = tk.Label(imageFrame)
display2.grid(row=0, column=0) #Display 2

#Slider window (slider controls stage position)
sliderFrame = tk.Frame(window, width=600, height=100)
sliderFrame.grid(row = 600, column=0, padx=10, pady=2)

show_frame() #Display
window.mainloop()  #Starts GUI


 类似资料:
  • 使用另一个问题中的代码,我在tkinter窗口中嵌入了一个pygame窗口,我试图制作一个tkbutton,在pygame窗口上画一个圆圈,已经试验了一段时间,到目前为止还没有任何结果。任何想法都会很棒!这是我到目前为止的代码。。。

  • 问题内容: 我想使用python3和tkinter创建一个虚拟的宠物风格游戏。到目前为止,我已经有了主窗口并开始放入标签,但是我遇到的问题是播放动画gif。我在这里搜索并找到了一些答案,但是他们不断抛出错误。我发现使用PhotoImage的结果具有gif的索引位置,并在一定范围内继续。 当我在终端中使用“ pyhton3 main.py”运行此命令时,出现以下错误: _tkinter.TclErr

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

  • 问题内容: 我目前正在尝试为 多处理OpenCV视频* 流开发 GUI 。下面的代码确实成功执行了此操作,因为它显示了视频供稿和一个“退出”按钮,但是运行方式很奇怪: * 该程序 在退出时* (通过单击或通过单击关闭窗口)在(我正在使用Windows)中引发 运行时错误 ,表示程序“要求运行时以异常方式终止” * 关于如何解决该问题的任何想法将不胜感激! 我的代码: 配置:Windows 7 Ho

  • 本文向大家介绍使用tkinter模块在Python中进行GUI编程,包括了使用tkinter模块在Python中进行GUI编程的使用技巧和注意事项,需要的朋友参考一下 GUI(图形用户界面): GUI是一个简单的应用程序,可以帮助用户通过图形图标与计算机或任何其他电子设备进行交互。这通常用于在台式机或笔记本电脑上执行不同的任务。 GUI tkinter模块 tkinter是用于创建GUI应用程序的

  • 问题内容: 如何强制Tkinter应用程序窗口中的列具有相等的宽度? tkdocs网站的状态如下: 每列的宽度(或每行的高度)取决于列或行中包含的小部件的宽度或高度。这意味着在草绘用户界面并将其划分为行和列时,您无需担心每个列或行的宽度[或大概高度]相等。 http://www.tkdocs.com/tutorial/grid.html 但是我 希望 这些列的宽度相等,最好使 所有 列的宽度取决于