用tkinter嵌套cv2imshowMediaPipe Pose Detection press q exit frame窗口
由于Tkinter和cv2都有自己的窗口管理方式,因此需要进行一些额外的操作才能实现嵌套显示。
以下是一个示例代码,可以在Tkinter窗口中嵌套显示cv2窗口:
import tkinter as tk
import cv2
class App:
def __init__(self, window, video_source=0):
self.window = window
self.window.title("MediaPipe Pose Detection")
# 创建Tkinter窗口中的Canvas对象,用于显示视频帧
self.canvas = tk.Canvas(window, width=640, height=480)
self.canvas.pack()
# 打开视频流
self.video_source = video_source
self.vid = cv2.VideoCapture(video_source)
# 设置cv2窗口的名称
cv2.namedWindow("MediaPipe Pose Detection")
# 开始显示视频
self.delay = 15 # 每15毫秒更新一帧
self.update()
# 设置退出快捷键
self.window.bind('<Escape>', lambda e: self.window.quit())
self.window.bind('q', lambda e: self.window.quit())
def update(self):
# 从视频流中读取一帧
ret, frame = self.vid.read()
if ret:
# 将视频帧转为Tkinter中的PhotoImage对象
self.photo = self.convert_frame(frame)
# 在Canvas对象中显示PhotoImage对象
self.canvas.create_image(0, 0, image=self.photo, anchor=tk.NW)
# 在cv2窗口中显示视频帧
cv2.imshow("MediaPipe Pose Detection", frame)
# 每隔一段时间更新一次
self.window.after(self.delay, self.update)
def convert_frame(self, frame):
# 将cv2中的BGR格式转为RGB格式
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 将视频帧转为Tkinter中的PhotoImage对象
photo = PIL.ImageTk.PhotoImage(image=PIL.Image.fromarray(frame))
return photo
def __del__(self):
# 关闭视频流和cv2窗口
if self.vid.isOpened():
self.vid.release()
cv2.destroyAllWindows()
# 创建Tkinter窗口并启动应用程序
root = tk.Tk()
app = App(root)
root.mainloop()
在上述代码中,我们创建了一个名为App的类,它继承自object类。在__init__方法中,我们创建了一个Tkinter窗口,并在其中创建了一个Canvas对象,用于显示视频帧。我们还打开了视频流,并设置了cv2窗口的名称。在update方法中,我们从视频流中读取一帧,并将其转换为Tkinter中的PhotoImage对象,然后在Canvas对象中显示。同时,我们也在cv2窗口中显示了视频帧。最后,我们使用after方法来定时更新视频帧。
在主程序中,我们创建了一个Tkinter窗口,并启动了应用程序。当用户按下Esc或q键时,程序会退出,并关闭视频流和cv2窗口
原文地址: https://www.cveoy.top/t/topic/eFED 著作权归作者所有。请勿转载和采集!