我正在写一个程序,需要在Tkinter窗口中显示视频流。由于还有执行各种功能的按钮,所以我使用网格来组织所有内容。
下面的代码,修改自Show webcam sequence 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
中显示?
2条答案
按热度按时间jljoyd4f1#
这应该可以工作:
首先,您有行
tk.Label(imageFrame, image=show_frame()).grid(row=0, column=0, padx=10, pady=2)
,由于show_frame()
不返回任何内容,因此将image
设置为None
。其次,你需要确保你的lmain.grid()
,否则lmain
不会显示。如果你想有两个显示器,一个在另一个的上面,你可以这样做:
j7dteeu82#
试试这个代码: