Dowiedz się, jak identyfikować i śledzić rozdania za pomocą OpenCV i Pythona

Dowiedz się, jak identyfikować i śledzić rozdania za pomocą OpenCV i Pythona

Śledzenie dłoni to proces wykorzystujący widzenie komputerowe do wykrywania i śledzenia ruchów ręki osoby w czasie rzeczywistym. Najbardziej dominującym zastosowaniem śledzenia dłoni są gogle wirtualnej rzeczywistości. Zestawy słuchawkowe umożliwiają używanie rąk jako danych wejściowych zamiast kontrolerów dotykowych. To z kolei sprawia, że ​​doświadczenie jest bardziej wciągające.

Dowiedz się, jak śledzić ręce osoby za pomocą Pythona, OpenCV do widzenia komputerowego i MediaPipe.

W jaki sposób platforma MediaPipe śledzi rozdania?

Firma Google opracowała framework MediaPipe, który zawiera wiele rozwiązań do uczenia maszynowego. Jednym z rozwiązań jest rozwiązanie do śledzenia dłoni i palców o nazwie MediaPipe Hands . Aby śledzić ręce, MediaPipe Hands wykonuje dwa procesy: wykrywanie dłoni i wykrywanie punktów orientacyjnych.

Wykrywanie dłoni

MediaPipe rozpoczyna się od określenia, gdzie na obrazie wejściowym znajdują się dłonie. Ponieważ oszacowanie ramek ograniczających dla sztywnych przedmiotów jest prostsze niż identyfikacja dłoni ze złączonymi palcami.

Wykrywanie punktów orientacyjnych dłoni

Po wykryciu dłoni MediaPipe przeprowadza wykrywanie punktów orientacyjnych dłoni. Model punktu orientacyjnego dłoni może przewidzieć 21 dokładnych współrzędnych lokalizacji każdego punktu orientacyjnego dłoni.

Ręka z nazwanymi punktami orientacyjnymi

Liczby reprezentują unikalny identyfikator każdego punktu orientacyjnego.

Konfigurowanie środowiska

Aby kontynuować ten projekt, powinieneś znać podstawy Pythona. Zainstaluj następujące biblioteki w swoim środowisku:

  • OpenCV: Będziesz używać tej biblioteki do wizji komputerowej i wykonywania technik przetwarzania obrazu na obrazie wejściowym.
  • MediaPipe: użyjesz tej biblioteki do wykrywania i śledzenia dłoni na obrazie wejściowym.
  • imutils: Będziesz korzystać z tej biblioteki, aby zmienić rozmiar klatki wideo wejścia.

Uruchom następujące polecenie na swoim terminalu, aby zainstalować biblioteki OpenCV, MediaPipe i imutils. Zainstaluj pip — menedżera pakietów Pythona — jeśli potrzebujesz. Upewnij się, że przekazujesz biblioteki jako listę rozdzielaną spacjami.

pip install OpenCV-Python MediaPipe imutils

Po zakończeniu aktualizacji środowisko jest gotowe do rozpoczęcia kodowania.

Importowanie wymaganych bibliotek

Aby móc z nich korzystać, musisz zaimportować zainstalowane biblioteki. Otwórz dowolne środowisko IDE Pythona, utwórz plik Pythona i dodaj następujące importy:

import cv2
import mediapipe as mp
import imutils

Upewnij się, że importujesz OpenCV jako cv2 i MediaPipe małymi literami. Niezastosowanie się do tego spowoduje zgłoszenie błędu.

Tworzenie obiektów MediaPipe, których będziesz używać podczas śledzenia

Użyjesz mpHands do wywołania rozwiązania rąk MediaPipe, a obiektu hands do wykrywania i śledzenia danych wprowadzanych ręką. Użyjesz obiektu mpDraw do narysowania połączeń między punktami orientacyjnymi zidentyfikowanych dłoni.

mpHands = mp.solutions.hands
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils

Możesz dostroić model rąk MediaPipe, przekazując różne parametry do konstruktora Hands(). Wartości domyślne są wystarczające dla tego projektu, ale możesz z nimi poeksperymentować, aby zobaczyć, jak wpływają na model:

Pycharm IDE wyświetlający domyślne parametry MediaPipe Hands

Powinieneś pozostawić static_image_mode jako False, aby upewnić się, że model wykryje ręce raz, zanim zacznie je śledzić. Powtarza proces śledzenia tylko wtedy, gdy pewność wykrywania spadnie poniżej zadeklarowanego parametru, co przyspiesza ogólne przetwarzanie danych wejściowych.

Wykonywanie śledzenia dłoni

Do śledzenia dłoni potrzebne są trzy funkcje: jedna do przetwarzania danych wejściowych, jedna do rysowania połączeń punktów orientacyjnych dłoni oraz funkcja główna do sterowania przebiegiem programu.

Funkcja przetwarzania danych wejściowych

Ta funkcja pobiera dane wejściowe, konwertuje je na skalę szarości i przekazuje do modelu rąk MediaPipe w celu wykrycia i śledzenia rąk na wejściu.

# Processing the input image
def process_image(img):
    # Converting the input to grayscale
    gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    results = hands.process(gray_image)

    # Returning the detected hands to calling function
    return results

Funkcja zwraca wyniki, czy na wejściu wykryto ręce.

Funkcja rysowania połączeń punktów orientacyjnych dłoni

Ta funkcja sprawdza, czy funkcja przetwarzania danych wejściowych wykryła ręce. Jeśli zostaną wykryte jakieś ręce, zapętla się nad każdym punktem orientacyjnym i rysuje wokół niego okrąg, śledząc punkt orientacyjny za pomocą funkcji enumerate Pythona. Następnie rysuje połączenia między punktami orientacyjnymi na oryginalnym wejściu wideo.

# Drawing landmark connections
def draw_hand_connections(img, results):
    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            for id, lm in enumerate(handLms.landmark):
                h, w, c = img.shape

                # Finding the coordinates of each landmark
                cx, cy = int(lm.x * w), int(lm.y * h)

                # Printing each landmark ID and coordinates
                # on the terminal
                print(id, cx, cy)

                # Creating a circle around each landmark
                cv2.circle(img, (cx, cy), 10, (0, 255, 0),
                           cv2.FILLED)
                # Drawing the landmark connections
                mpDraw.draw_landmarks(img, handLms,
                                      mpHands.HAND_CONNECTIONS)

        return img

Funkcja rozpoczyna się od zakreślenia każdego punktu orientacyjnego:

Wyjście programu z zakreślonymi punktami orientacyjnymi

Następnie rysuje połączenia ręczne:

Wyjście programu śledzącego ręce

W końcu zwraca swoje dane wyjściowe do funkcji wywołującej.

Główna funkcja

Utwórz główną funkcję, która będzie sterować przebiegiem Twojego programu. Pobiera dane wejściowe i zmienia rozmiar klatki wideo, aby zapewnić spójność danych wyjściowych. Przekaż dane wejściowe do funkcji przetwarzania, która następnie wykryje i będzie śledzić ręce. Przenieś zwrócone wyniki do funkcji rysowania połączenia punktów orientacyjnych dłoni, która narysuje połączenie na oryginalnym wejściu wideo. W końcu wyświetli dane wyjściowe użytkownikowi.

def main():
   # Replace 0 with the video path to use a
   # pre-recorded video
    cap = cv2.VideoCapture(0)

    while True:
        # Taking the input
        success, image = cap.read()
        image = imutils.resize(image, width=500, height=500)
        results = process_image(image)
        draw_hand_connections(image, results)

        # Displaying the output
        cv2.imshow("Hand tracker", image)

        # Program terminates when q key is pressed
        if cv2.waitKey(1) == ord('q'):
            cap.release()
            cv2.destroyAllWindows()

Ostatnim krokiem jest uruchomienie programu. Poniższy kod gwarantuje, że po uruchomieniu programu główna funkcja zostanie uruchomiona jako pierwsza.

if __name__ == "__main__":
    main()

Po uruchomieniu program generuje następujące dane wyjściowe:

Wyjście programu śledzącego ręce

Program śledzi ręce w czasie rzeczywistym.

Śledzenie dłoni dla wciągającej rzeczywistości wirtualnej

Śledzenie dłoni w wirtualnej rzeczywistości sprawia, że ​​technologia jest bardziej kusząca. Zestawy słuchawkowe do rzeczywistości wirtualnej zaczęły wprowadzać śledzenie dłoni, wprowadzając wrażenie podwyższonej rzeczywistości do wirtualnego świata. Zestawy słuchawkowe umożliwiają użytkownikowi wprowadzanie poleceń za pomocą wirtualnej dłoni.

Śledzenie dłoni w wirtualnych zestawach słuchawkowych to tylko jedno z zastosowań tej technologii. Możesz włączyć śledzenie dłoni w dowolnym odpowiednim obszarze według własnych upodobań.

Dodaj komentarz

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