Newer
Older
PoseDetection / Mediapipe / mptest.py
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()