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.
Źródło: okładka katalogu Atlasformen.