Python Blog

Różne ciekawostki ze świata Pythona i nie tylko.


Rozpoznawanie twarzy.

Zastosowanie biblioteki OpenCV do detekcji twarzy.

Biblioteka OpenCV

OpenCV, czyli Open Source Computer Vision Library, to otwarte oprogramowanie dedykowane przetwarzaniu obrazu i analizie komputerowej. Zostało stworzone z myślą o wspieraniu projektów z dziedziny widzenia komputerowego poprzez dostarczenie zestawu narzędzi i funkcji do analizy obrazów i wideo. Poniżej przedstawiam krótkie opisy kluczowych cech OpenCV:

  • Wszechstronność: OpenCV oferuje wiele algorytmów i funkcji z zakresu przetwarzania obrazów, analizy obrazów, rozpoznawania obiektów, uczenia maszynowego i wiele innych. Działa ona na wielu platformach, w tym systemach Windows, Linux, MacOS, Android i iOS.

  • Biblioteka otwartego źródła: OpenCV jest projektem open-source, co oznacza, że jego kod źródłowy jest dostępny publicznie i można go dowolnie modyfikować i dostosowywać do swoich potrzeb.

  • Wsparcie dla wielu języków programowania: OpenCV jest napisane głównie w języku C++, ale dostępne są interfejsy dla wielu innych języków programowania, takich jak Python, Java, C#, czy Ruby. Dzięki temu można korzystać z OpenCV w różnych środowiskach programistycznych.

  • Obsługa różnych formatów obrazów i wideo: OpenCV obsługuje różne formaty plików obrazów i wideo, umożliwiając wczytywanie, przetwarzanie i zapisywanie danych w różnych formatach.

  • Detekcja obiektów i analiza obrazów: OpenCV oferuje funkcje do detekcji obiektów, rozpoznawania twarzy, wykrywania krawędzi, analizy histogramów, transformacji geometrycznych i wiele innych operacji przetwarzania obrazów.

  • Uczenie maszynowe: W nowszych wersjach OpenCV, dodano moduł do pracy z uczeniem maszynowym (OpenCV ML), co umożliwia integrację z popularnymi frameworkami takimi jak TensorFlow czy PyTorch.

  • Interfejs użytkownika i debugowanie: OpenCV zawiera narzędzia do tworzenia interfejsów użytkownika, umożliwiające wygodne interakcje z programami, a także narzędzia do debugowania i wizualizacji wyników przetwarzania obrazów.

OpenCV jest szeroko stosowane w dziedzinie widzenia komputerowego, robotyki, rozpoznawania obiektów, analizy medycznej, przemysłowej i wielu innych obszarach, gdzie przetwarzanie obrazu odgrywa kluczową rolę.

Skrypt

Jednym z zastosowaniem oprogramownia OpenCV jest wykrywanie obiektów. W naszym przypadku będzie to wykrywanie twarzy.

Poniższy skrypt wykrywa twarze na obrazie z kamery komputerowej i zapisuje obraz do pliku w formacie MP4.

Aby skrypt zadziałał, musi być zainstalowana biblioteka OpenCV:

pip install opencv-python
import cv2

# Inicjalizacja kamery
cap = cv2.VideoCapture(0)  # Kamerka wbudowana w laptop 

# Ustawienia VideoWriter do zapisu w formacie MP4
fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # Możesz także użyć 'XVID' lub inne, w zależności od dostępnych kodeków

# Zaspisz wideo do pliku output.mp4
out = cv2.VideoWriter('output.mp4', fourcc, 20.0, (640, 480))

# Inicjalizacja detektora twarzy Haarcascades
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

while True:
    # Odczytaj klatkę z kamery
    ret, frame = cap.read()

    # Konwertuj klatkę na odcienie szarości
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # Wykryj twarze
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)

    # Narysuj prostokąty wokół wykrytych twarzy
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2) #Kolor w formacie BGR

    # Wyświetl klatkę
    cv2.imshow('Detekcja twarzy', frame)

    # Zapisz klatkę do pliku MP4
    out.write(frame)

    # Przerwij pętlę po naciśnięciu klawisza 'q'
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Zwolnij zasoby
out.release()
cap.release()
# Posprzątaj
cv2.destroyAllWindows()

Objaśnienie poszczególnych fragmentów kodu:

Inicjalizacja kamery:

cap = cv2.VideoCapture(0)

Tworzymy obiekt kamerowy cap, który jest połączony z kamerą komputerową. W przypadku 0, korzystamy z domyślnej kamery dostępnej na urządzeniu. Jeśli mamy dodatkową kamerę, np. USB, to bezie ona miała numer 1.

Ustawienia VideoWriter:

fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output.mp4', fourcc, 20.0, (640, 480))

Tworzymy obiekt VideoWriter, który będzie zapisywał obrazy do pliku o nazwie output.mp4. Parametry to:

  • ‘mp4v’: Kodek do kompresji wideo (można użyć innych, takich jak ‘XVID’).
  • 20.0: Liczba klatek na sekundę w zapisywanym pliku.
  • (640, 480): Rozmiar klatek.

Inicjalizacja detektora twarzy:

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

Wykorzystujemy detektor twarzy oparty na klasyfikatorze Haarcascades. Plik XML z tym klasyfikatorem jest dostarczany wraz z biblioteką OpenCV.

Pętla główna:

while True:

Program wchodzi w nieskończoną pętlę, w której będzie odczytywał klatki z kamery, detektował twarze i zapisywał klatki do pliku MP4.

Odczyt klatki z kamery:

ret, frame = cap.read()

Metoda read() zwraca True w przypadku udanego odczytu klatki i samą klatkę, a False, gdy odczyt zakończył się niepowodzeniem.

Konwersja klatki na odcienie szarości:

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

Detekcja twarzy w kolorowym obrazie może być bardziej zasobożerna, dlatego konwertujemy klatkę na odcienie szarości.

Detekcja twarzy:

faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)

Wykorzystujemy detektor twarzy Haarcascades do wykrywania twarzy na obrazie. Parametry scaleFactor i minNeighbors można dostosować w zależności od potrzeb.

Narysowanie prostokątów wokół wykrytych twarzy:

for (x, y, w, h) in faces:
    cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)

Rysujemy prostokąty wokół obszarów, w których wykryto twarze. (255, 0, 0) to kolor prostokąta (tu: niebieski), a 2 to grubość linii prostokąta.

Wyświetlenie klatki:

cv2.imshow('Detekcja twarzy', frame)

Wyświetlamy klatkę z zaznaczonymi obszarami, gdzie wykryto twarze.

Zapis klatki do pliku MP4:

out.write(frame)

Klatka jest zapisywana do pliku MP4.

Warunek zakończenia programu:

if cv2.waitKey(1) & 0xFF == ord('q'):
    break

Program zatrzyma się po naciśnięciu klawisza q. Ważne jest, aby zwolnić zasoby przed zamknięciem programu.

Zwolnienie zasobów:

out.release()
cap.release()
cv2.destroyAllWindows()

Zamykamy obiekt VideoWriter, zamykamy kamerę, a następnie zamykamy wszystkie okna OpenCV.

Parametry funkcji detectMultiScale

Funkcja detectMultiScale w bibliotece OpenCV jest często używana do detekcji obiektów, takich jak twarze, w obrazie przy użyciu klasyfikatora kaskadowego (na przykład Haara). Poniżej przedstawiam objaśnienia dla głównych parametrów tej funkcji:

cv2.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize)
  • image: To jest obraz, w którym chcesz przeprowadzić detekcję obiektów.

  • scaleFactor: Skala zmniejszenia dla obrazu. Jest to wartość określająca, o ile chcesz zmniejszyć rozmiar obrazu przed każdym etapem detekcji. Domyślnie jest to 1.1, co oznacza, że obraz jest zmniejszany o 10% przy każdym kroku detekcji. Większa wartość oznacza szybszą detekcję, ale może zwiększyć ryzyko pominięcia małych obiektów.

  • minNeighbors: Minimalna liczba sąsiadów, które muszą być spełnione dla każdego prostokąta, aby został on uznany za poprawny obiekt. Ten parametr pomaga zredukować ilość fałszywych pozytywów.

  • flags: Domyślnie jest to 0, ale można użyć różnych flag w zależności od potrzeb detekcji.

  • minSize: Minimalny rozmiar obiektu. Prostokąty mniejsze niż określony rozmiar są ignorowane.

  • maxSize: Maksymalny rozmiar obiektu. Prostokąty większe niż określony rozmiar są ignorowane.

Parametry minSize i maxSize są szczególnie użyteczne, gdy chcesz skoncentrować się na detekcji obiektów w określonym przedziale rozmiarów.

Powyższe parametry pomagają dostosować działanie algorytmu detekcji do konkretnych potrzeb i warunków danego zadania. Optymalne wartości mogą się różnić w zależności od konkretnego przypadku użycia.

Przykładowy wynik działania skryptu. Link Źródło: okładka katalogu Atlasformen.