Введение
Здесь мы рассмотрим, как использовать 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/