Policz pompki za pomocą Pythona i kamery komputera

Policz pompki za pomocą Pythona i kamery komputera

Możesz wykorzystać wiele projektów, aby wzmocnić swoje umiejętności w zakresie widzenia komputerowego i Pythona. Jednym z takich projektów jest stworzenie prostego licznika push-up za pomocą Pythona. Możesz napisać program tego projektu w jednym pliku.

Program pobierze dane wejściowe wideo lub dane wejściowe w czasie rzeczywistym z kamery, wykona oszacowanie pozycji człowieka na wejściu i policzy liczbę pompek, które dana osoba wykonuje. Aby przeprowadzić oszacowanie pozycji człowieka, program użyje modelu oszacowania pozycji człowieka MediaPipe.

Co to jest model szacowania pozycji człowieka MediaPipe?

Jest to model opracowany przez Google, który śledzi trzydzieści trzy punkty orientacyjne na ludzkim ciele. Przewiduje również segmentację całego ciała, którą reprezentuje jako segmentację dwuklasową. Poniższy obraz przedstawia wszystkie punkty orientacyjne, które model jest w stanie zidentyfikować. Ponumerowane punkty identyfikują każdy punkt orientacyjny i łączą się ze sobą liniami.

Punkty orientacyjne szacowania pozycji człowieka w MediaPipe
Źródło obrazu: MediaPipe/ GitHub

Twój program licznika pompek będzie wykorzystywał pozycje ramion i łokci. Na powyższym obrazku punkty orientacyjne ramion to 11 i 12, a punkty orientacyjne łokci to 13 i 14.

Konfigurowanie środowiska

Powinieneś już znać podstawy Pythona. Otwórz środowisko IDE języka Python i utwórz nowy plik języka Python. Uruchom następujące polecenie na terminalu, aby zainstalować odpowiednie pakiety w swoim środowisku:

pip install OpenCV-Python

Użyjesz OpenCV-Python , aby pobrać wejście wideo do swojego programu i je przetworzyć. Ta biblioteka zapewnia Twojemu programowi możliwości widzenia komputerowego.

pip install MediaPipe

Użyjesz MediaPipe do oszacowania pozycji człowieka na wejściu.

pip install imutils

Użyjesz imutils, aby zmienić rozmiar wejścia wideo do żądanej szerokości.

Instalacja bibliotek Pythona na terminalu

Importy i inicjalizacje MediaPipe

Zaimportuj trzy biblioteki, które wcześniej zainstalowałeś w swoim środowisku. Umożliwi to wykorzystanie ich zależności w projekcie.

import cv2
import imutils
import mediapipe as mp

Następnie utwórz trzy obiekty MediaPipe i zainicjuj je przy użyciu odpowiednich funkcji. Użyjesz funkcji mp.solutions.drawing_utils , aby narysować różne punkty orientacyjne na wejściu. mp.solutions.drawing_styles, aby zmienić style, w jakich pojawiają się rysunki punktów orientacyjnych, oraz mp.solutions.pose, który jest modelem używanym do identyfikacji tych punktów orientacyjnych.

mp_draw = mp.solutions.drawing_utils
mp_draw_styles = mp.solutions.drawing_styles
mp_pose = mp.solutions.pose

Wykonywanie oceny pozycji człowieka

Wykrywanie pozycji człowieka to proces identyfikacji orientacji ciała poprzez identyfikację i klasyfikację stawów.

Deklarowanie własnych zmiennych

Zadeklaruj zmienne, których będziesz używać do przechowywania liczby pompek, pozycji barków i łokci oraz wejścia wideo.

count = 0
position = None
cap = cv2.VideoCapture("v4.mp4")

Zainicjuj zmienną pozycji na Brak. Program zaktualizuje go w zależności od pozycji łokci i ramion.

Wywoływanie modelu szacowania pozycji MediaPipe

Wywołaj model szacowania pozy MediaPipe, który wykryje ludzką pozę na wejściu.

with mp_pose.Pose(
    min_detection_confidence = 0.7,
    min_tracking_confidence = 0.7) as pose:

Inicjalizacje pewności wykrywania i pewności śledzenia reprezentują wymagany poziom dokładności modelu. 0,7 odpowiada 70% dokładności. Możesz zmienić go na żądany poziom.

Pobieranie i wstępne przetwarzanie danych wejściowych

Weź dane wejściowe, które później przekażesz do modelu szacowania ułożenia. Zmień szerokość wejścia wideo za pomocą biblioteki imutils. Konwertuj wejście z BGR na RGB, ponieważ MediaPipe działa tylko z wejściem RGB. Na koniec przekaż przekonwertowane dane wejściowe do modelu szacowania pozycji człowieka, aby zidentyfikować punkty orientacyjne.

while cap.isOpened():
    success, image=cap.read()

    if not success:
        print("empty camera")
        break


    image = imutils.resize(image, width=500)
    image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
    result = pose.process(image)

Po przetworzeniu danych wejściowych zidentyfikowałeś punkty orientacyjne na danych wejściowych.

Rysowanie zidentyfikowanych punktów orientacyjnych na wejściu

Utwórz pustą listę, na której będą przechowywane współrzędne każdego punktu orientacyjnego. Użyj klasy draw_landmarks, aby narysować kropkę na każdym punkcie orientacyjnym i połączeniach między nimi. Używając pętli for, wykonaj iterację punktów orientacyjnych i zapisz identyfikator i współrzędne każdego punktu orientacyjnego na utworzonej liście. Użyj klasy image.shape, aby obliczyć szerokość i wysokość wejścia wideo.

lmList = []

if result.pose_landmarks:
    # Draws the landmarks' points and connects them
    mp_draw.draw_landmarks(image, result.pose_landmarks,
                               mp_pose.POSE_CONNECTIONS)

    for id, im in enumerate(result.pose_landmarks.landmark):
        # Finding the length and width of the video input
        h, w, _ = image.shape

        # Finding the exact coordinates of the body points
        X, Y = int(im.x * w), int(im.y * h)
        lmList.append([id, X, Y])

Identyfikator to numer nadany konkretnemu punktowi orientacyjnemu przez model szacowania ułożenia MediaPipe. Po zidentyfikowaniu pozy człowieka na wejściu, musisz policzyć liczbę pompek, które wykonują, jeśli takie istnieją.

Liczenie liczby pompek

Stwórz warunki, które porównują położenie ramion z położeniem łokci. Kiedy ramiona osoby na wejściu są wyżej niż łokcie, osoba jest w górze. Kiedy ramiona są niżej niż łokcie, osoba leży w dół. Można to sprawdzić, porównując identyfikatory punktów orientacyjnych ramion z punktami orientacyjnymi łokci.

# Checking whether there are any identified landmarks
if len(lmList)! = 0:
    # Condition that identifies the down position
    if (lmList[12][2] and lmList[11][2] >= lmList[14][2] and lmList[13][2]):
        position = "down"

    # Condition that identifies the up position
    if (lmList[12][2] and lmList[11][2] <= lmList[14][2] and lmList[13][2])
    and position == "down":
         position = "up"
         count +=1

Aby osoba mogła wykonać jedną pełną pompkę, musi przyjąć pozycję dolną, a następnie wrócić do pozycji górnej. Po wykonaniu kompletnej pompki program może zaktualizować licznik o jeden.

Wyświetlanie danych wyjściowych

Musisz wyświetlić liczbę pompek zliczonych przez program. Wydrukuj wartość licznika na terminalu za każdym razem, gdy użytkownik wykona pełną pompkę. Na koniec wyświetl wyniki osoby wykonującej pompki z punktami orientacyjnymi narysowanymi na jej ciele.

            print(count)

    cv2.imshow("Push-up counter", cv2.flip(image, 1))
    key = cv2.waitKey(1)

    # Program terminates when q is pressed
    if key == ord('q'):
        break

cap.release()

Dane wyjściowe powinny wyglądać mniej więcej tak:

Wyjście programu z osobą wykonującą pompki

Powinieneś obserwować aktualizację na terminalu, ponieważ osoba na wyjściu wykonuje pełną pompkę.

Wzmocnij swoje umiejętności widzenia komputerowego

Wizja komputerowa jest szeroka. Licznik pompek to jeden z wielu projektów, których możesz użyć, aby wykorzystać swoje umiejętności widzenia komputerowego w praktyce. Najlepszym sposobem na wzmocnienie tych umiejętności jest budowanie większej liczby projektów, które obejmują widzenie komputerowe.

Im więcej projektów zbudujesz, tym więcej się nauczysz!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *