Czytelnicy tacy jak ty pomagają wspierać MUO. Kiedy dokonujesz zakupu za pomocą linków na naszej stronie, możemy otrzymać prowizję partnerską. Czytaj więcej.

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 osoba wykonuje. Aby przeprowadzić oszacowanie pozycji człowieka, program użyje modelu oszacowania 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.

instagram viewer
Ź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ż być zaznajomiony 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 zainstaluj OpenCV-Python

Użyjesz OpenCV-Python, aby pobrać wejście wideo w swoim programie i je przetworzyć. Ta biblioteka zawiera twój program możliwości widzenia komputerowego.

pip zainstaluj MediaPipe

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

pip zainstaluj imutils

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

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 rura medialna Jak poseł

Następnie utwórz trzy obiekty MediaPipe i zainicjuj je przy użyciu odpowiednich funkcji. Użyjesz funkcji mp.solutions.drawing_utils do narysowania różnych punktów orientacyjnych 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_pozycja = mp.rozwiązania.pozycja

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.

liczyć = 0
pozycja = Nic
cap = cv2.VideoCapture("v4.mp4")

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

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

z mp_pozycja. Poza(
min_pewność_wykrywania = 0.7,
min_tracking_confidence = 0.7) Jak poza:

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.

chwila cap.isOpened():
sukces, image=cap.read()

Jeślinie powodzenie:
wydrukować("pusty aparat")
przerwa

obraz = imutils.resize (obraz, szerokość =500)
obraz = cv2.cvtColor (cv2.flip (obraz, 1), cv2.COLOR_BGR2RGB)
wynik = poz.proces (obraz)

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.

lmLista = []

Jeśli wynik.pose_punkty orientacyjne:
# Rysuje punkty orientacyjne i łączy je
mp_draw.draw_landmarks (obraz, wynik.pose_punkty orientacyjne,
mp_pozycja. POSE_CONNECTIONS)

Do id, im W wyliczyć (result.pose_landmarks.landmark):
# Znalezienie długości i szerokości wejścia wideo
h, w, _ = obraz.kształt

# Znalezienie dokładnych współrzędnych punktów ciała
X, Y = int (im.x * w), int (im.y * h)
lmList.append([identyfikator, 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.

# Sprawdzanie, czy są jakieś zidentyfikowane punkty orientacyjne
Jeśli len (lmList) != 0:
# Warunek określający dolną pozycję
Jeśli (lmLista[12][2] I lista lm[11][2] >= lmLista[14][2] I lista lm[13][2]):
pozycja = "w dół"

# Warunek określający górną pozycję
Jeśli (lmLista[12][2] I lista lm[11][2] <= lmLista[14][2] I lista lm[13][2])
I pozycja == "w dół":
pozycja = "w górę"
liczyć +=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.

 wydrukować (liczyć)

cv2.imshow(„Licznik pompek”, cv2.flip (obraz, 1))
klucz = cv2.waitKey(1)

# Program kończy się po naciśnięciu q
Jeśli klucz == ord('Q'):
przerwa

cap.release()

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

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!