import threading
from tkinter import *
import cv2
from mpipe import mpipe
from PIL import Image, ImageTk
class doubble_buffer:
"""ダブルバッファクラス"""
def __init__(self):
self.buffer = [None, None]
self.write = 0
def set(self, obj):
"""バッファにデータをセット"""
self.buffer[self.write] = obj
self.write = 1 - self.write
def get(self):
"""バッファからデータを取り出し"""
return self.buffer[1 - self.write]
class Application(Frame):
def __init__(self, master=None):
super().__init__(master)
self.master.geometry("650x520")
self.master.title("Tkinter 開発")
self.master.protocol("WM_DELETE_WINDOW", self.delete_window)
self.label = Label(self.master)
self.label.grid(row=0, column=0)
# self.canvas = Canvas(bg='black', width=640, height=480)
# self.canvas.place(x=0, y=0)
# self.item = self.canvas.create_image(0, 0, anchor=NW)
self.running = True
self.cam_thread = threading.Thread(target=self.camera_thread)
self.cam_thread.start()
self.buffer = doubble_buffer()
def delete_window(self):
self.running = False
def camera_thread(self):
cap = cv2.VideoCapture(0)
mp = mpipe()
while self.running:
success, image = cap.read()
if not success:
continue
mp.detect(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
mp.draw(image)
disp = cv2.flip(image, 1)
self.buffer.set(
ImageTk.PhotoImage(
image=Image.fromarray(cv2.cvtColor(disp, cv2.COLOR_BGR2RGB))
)
)
# self.canvas.create_image(0, 0, image=self.imgtk[self.write], anchor=NW, tag='image')
# self.label.image = imgtk
self.label.configure(image=self.buffer.get())
cap.release()
print("camera thread ended.")
self.master.quit()
if __name__ == "__main__":
root = Tk()
app = Application(master=root)
app.mainloop()