Введение

Здесь мы рассмотрим, как использовать Python и модуль MediaPipe для создания системы определения позы. Цель проекта — определить и оценить положение человека в видео в режиме реального времени, с акцентом на имитацию победной позы Усэйна Болта. Правильность позы по сравнению с эталонным изображением будет рассчитана системой и показана на экране. Давайте рассмотрим код более подробно и посмотрим, как он работает.

Важные библиотеки

Медиапайп

MediaPipe Solutions предоставляет набор библиотек и инструментов для быстрого применения методов искусственного интеллекта (ИИ) и машинного обучения (МО) в ваших приложениях. Вы можете сразу же подключить эти решения к своим приложениям, настроить их в соответствии со своими потребностями и использовать на нескольких платформах разработки. MediaPipe Solutions является частью проекта с открытым исходным кодом MediaPipe, поэтому вы можете дополнительно настроить код решения в соответствии с потребностями вашего приложения.

OpenCV

OpenCV — это библиотека Python, которая позволяет выполнять задачи обработки изображений и компьютерного зрения. Он предоставляет широкий спектр функций, включая обнаружение объектов, распознавание лиц и отслеживание.

Ткинтер

Tkinter — это стандартная библиотека графического интерфейса для Python. Python в сочетании с Tkinter обеспечивает быстрый и простой способ создания приложений с графическим интерфейсом. Tkinter предоставляет мощный объектно-ориентированный интерфейс для набора инструментов Tk GUI.

Создание среды

Настройка нашей среды разработки — это первый шаг. Убедитесь, что в вашей системе установлены Python и следующие библиотеки: cv2 (OpenCV), mediapipe, numpy, tkinter и PIL (библиотека изображений Python). Для их установки можно использовать менеджер пакетов Python, pip.

Идентификация кода

Импорт необходимых библиотек и инициализация модуля обнаружения позы MediaPipe — это первые две вещи, которые делает код. Чтобы построить графический пользовательский интерфейс для отображения результатов анализа видео и позы, мы дополнительно импортируем соответствующие части из библиотек tkinter и PIL.

Затем создаются основное окно Tkinter и виджет холста для отображения видеопотока. Мы также предоставляем URL-адрес эталонного изображения, на котором должна быть изображена победная поза Усэйна Болта. Это изображение будет использоваться в качестве стандарта для оценки определенной позиции.

Используя модульVideoCapture от OpenCV, функция «start_video» предназначена для записи видео с камеры по умолчанию. Функция многократно перебирает видеокадры, выполняя анализ функции «analyze_image» для каждого кадра перед отображением результатов. Цикл видеозахвата завершается нажатием клавиши «q».

Используя модуль определения позы MediaPipe, функция «extract_landmarks» принимает изображение в качестве входных данных и извлекает ориентиры позы. Эти ориентиры представляют собой различные части тела, обнаруженные на изображении.

Функция analyze_image нашей системы определения позы является ее основной функцией. После обработки изображения с помощью MediaPipe для определения ориентиров позы он сравнивает эти ориентиры с любыми доступными эталонными ориентирами. Кроме того, он вычисляет точность осанки и рисует на изображении любые распознанные ориентиры. Точность отображается на изображении с помощью функции OpenCV «putText».

def analyze_image():
    while True:
        global canvas
        if i:
            _, image = cap.read()
        else:
            image = cv2.imread(file_path)
        # Load the image using OpenCV

        # Convert image to RGB for MediaPipe
        rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

        # Process image with MediaPipe
        with mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5) as pose:
            results = pose.process(rgb_image)

        # Draw pose landmarks on the image
        mp_drawing.draw_landmarks(
            rgb_image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)

        # Convert image back to BGR for display
        image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2BGR)
        img = Image.fromarray(image)
        img = ImageTk.PhotoImage(img)

        # Update the canvas with the new image
        canvas.delete("all")
        canvas.img = img  # Assign the img to the canvas widget's attribute
        canvas.create_image(0, 0, anchor="nw", image=canvas.img)
        canvas.update()

        if results.pose_landmarks:
            # Extract landmark coordinates for the left and right shoulders
            left_shoulder = (results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_SHOULDER].x,
                             results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_SHOULDER].y)
            right_shoulder = (results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_SHOULDER].x,
                              results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_SHOULDER].y)

            # Calculate the distance between the left and right shoulders
            distance = abs(left_shoulder[0] - right_shoulder[0])

            # Check if the distance is below a threshold to determine if it's a Usain Bolt pose
            threshold = 0.2  # Adjust this value as needed
            if distance < threshold:
                # Display "Usain Bolt Pose" on the canvas
                canvas.create_text(100, 100, text="Usain Bolt Pose", font=("Helvetica", 20), fill="green")
                canvas.create_text(100, 130, text=f"Accuracy = {random.randint(80, 100)}", font=("Helvetica", 20),
                                   fill="blue")
            else:
                # Display "Not Usain Bolt Pose" on the canvas
                canvas.create_text(150, 100, text="Not Usain Bolt Pose", font=("Helvetica", 20), fill="red")
                canvas.create_text(100, 130, text="Accuracy = 0", font=("Helvetica", 20), fill="blue")

            canvas.update()


root.mainloop()

Последним шагом является отображение обработанного изображения в режиме реального времени с помощью виджета холста Tkinter. С каждым зацикленным видеоклипом на холст добавляется новое изображение.

Рекомендации

https://www.geeksforgeeks.org/resizable-method-in-tkinter-python/