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 użyć rozmycia twarzy, aby ukryć twarz osoby w filmie lub obrazie z kilku powodów. Kwestie prywatności i bezpieczeństwa są najbardziej dominujące. Większość platform do udostępniania wideo i oprogramowania do edycji wideo ma wbudowaną funkcję zamazywania twarzy.

Możesz stworzyć od podstaw własny program do rozmywania twarzy, używając Pythona oraz bibliotek OpenCV i NumPy.

Konfigurowanie środowiska

Aby postępować zgodnie z tym artykułem, musisz znać podstawy Pythona i mieć podstawową wiedzę nt za pomocą biblioteki NumPy.

Otwórz dowolne środowisko IDE Pythona, z którym czujesz się komfortowo. Utwórz środowisko wirtualne, w którym zainstalujesz wymagane biblioteki. Utwórz nowy plik Pythona. Przejdź do terminala i uruchom następujące polecenie, aby zainstalować wymagane biblioteki. Przekaż biblioteki jako listę rozdzielaną spacjami.

instagram viewer
pip zainstaluj OpenCV-python NumPy

Będziesz używać OpenCV do pobierania i wstępnego przetwarzania danych wejściowych wideo oraz NumPy do pracy z tablicami.

Po zainstalowaniu bibliotek poczekaj, aż IDE zaktualizuje szkielety projektu. Po zakończeniu aktualizacji i przygotowaniu środowiska możesz rozpocząć kodowanie.

Pełny kod źródłowy jest dostępny w formacie Repozytorium GitHub.

Importowanie wymaganych bibliotek

Zacznij od zaimportowania bibliotek OpenCV i NumPy. Umożliwi to dzwonienie i korzystanie z funkcji, które obsługują. Importuj OpenCV-python jako cv2.

import cv2
import liczba Jak np

Moduły OpenCV-python używają nazwy cv2 jako konwencji ustanowionej przez społeczność OpenCV. OpenCV-python to opakowanie Pythona biblioteki OpenCV, które jest napisane w C++.

Przyjmowanie danych wejściowych

Utwórz zmienną i zainicjuj plik Przechwytywanie wideo obiekt. Podaj zero jako argument, jeśli chcesz użyć głównego aparatu komputera jako źródła sygnału wejściowego. Aby użyć zewnętrznej kamery podłączonej do komputera, przekaż jedną. Aby wykonać rozmycie twarzy na wcześniej nagranym filmie, zamiast tego podaj ścieżkę filmu. Do użyj zdalnej kamery, przekaż adres URL kamery zawierający jej adres IP i numer portu.

cap = cv2.VideoCapture(0)

Aby wykonać rozmycie twarzy na wejściu, będziesz potrzebować trzech funkcji:

  • Funkcja, która wstępnie przetworzy dane wejściowe.
  • Funkcja, która rozmyje twarz na wejściu.
  • Główna funkcja, która będzie sterować przebiegiem programu i wyświetlać dane wyjściowe.

Wstępne przetwarzanie wejścia wideo

Utwórz funkcję wstępnego przetwarzania danych wejściowych, która przyjmie każdą klatkę wejściowego wideo jako dane wejściowe. Zainicjuj klasę CascadeClassifier, której będziesz używać do wykrywania twarzy. Zmień rozmiar ramki na 640 na 640 pikseli. Przekonwertuj ramkę o zmienionym rozmiarze na skalę szarości, aby ułatwić przetwarzanie, a na koniec wykryj twarze na wejściu i połącz je z prostokątami.

pokwstępne przetwarzanie obrazu(rama):
wykrywacz_twarzy = cv2.CascadeClassifier (cv2.data.haarcascades
+ „haarcascade_frontalface_default.xml”)

resize_image = cv2.resize (ramka, (640, 640))

szary_obraz = cv2.cvtColor (obraz o zmienionym rozmiarze,
cv2.COLOR_BGR2SZARY)

face_rects = face_detector.detectMultiScale(
szary_obraz, 1.04, 5, minRozmiar=(20, 20))

powrót obraz_o zmienionym rozmiarze, twarz_rekty

Ta funkcja zwraca krotkę zawierającą obraz o zmienionym rozmiarze oraz listę prostokątów reprezentujących wykryte twarze.

Zamazywanie twarzy

Utwórz funkcję rozmycia, która rozmyje twarze w danych wejściowych. Funkcja pobiera ramkę o zmienionym rozmiarze i listę prostokątów ograniczających twarze zwrócone przez funkcję przetwarzania wstępnego jako dane wejściowe. Pętle nad każdym prostokątem twarzy. Oblicza środek każdego prostokąta i promień rozmytego okręgu. Tworzy czarny obraz o takich samych wymiarach jak ramka o zmienionym rozmiarze, ustawiając wszystkie piksele na zero. Rysuje biały okrąg na czarnym obrazie, którego środek znajduje się na prostokącie twarzy, używając obliczonego promienia. Na koniec rozmywa obraz na białym kółku.

pokrozmycie twarzy(ramka_o zmienionym rozmiarze, twarz_proste):
Do (x, y, w, h) W twarz_proste:
# Określanie środka i promienia
# rozmytego koła
center_x = x + w // 3
środek_y = y + h // 3
promień = h // 1

# tworzenie czarnego obrazu o podobnym
# wymiary jak rama
maska ​​= np.zeros((ramka o zmienionym rozmiarze.kształt[:3]), np.uint8)

# narysuj białe kółko w obszarze twarzy ramki
cv2.circle (maska, (środek_x, środek_y), promień,
(255, 255, 255), -1)

# rozmycie całego kadru
rozmyty_obraz = cv2.medianBlur (ramka o zmienionym rozmiarze, 99)

# rekonstrukcja ramy:
# - piksele z rozmytej klatki, jeśli maska ​​> 0
# - w przeciwnym razie pobierz piksele z oryginalnej klatki
resized_frame = np.where (maska ​​> 0, zamazany_obraz,
ramka o zmienionym rozmiarze)

powrót zmieniona_ramka

Funkcja używa NumPy Gdzie() funkcja rekonstrukcji kadru podczas rozmycia.

Kontrolowanie przebiegu Twojego programu

Utwórz główną funkcję, która będzie działać jako punkt wejścia twojego programu. Będzie wtedy sterować przebiegiem programu. Funkcja uruchomi nieskończoną pętlę w celu ciągłego przechwytywania klatek wejścia wideo. Wywołaj metodę read obiektu cap, aby odczytać klatkę z kamery.

Następnie funkcja przekaże ramkę do funkcji przetwarzania wstępnego i przekaże zwracane wartości do innej funkcji, face_blur, w celu uzyskania rozmytego obrazu. Następnie zmienia rozmiar ramki zwróconej przez funkcję rozmycia i wyświetla wynik.

pokgłówny():
chwilaPRAWDA:
powodzenie, ramka = cap.read()
resized_input, face_rects = image_preprocess (ramka)
zamazany_obraz = rozmycie_twarzy (zmieniono_dane_wprowadzania, prost_twarzy)

# Wyświetlanie rozmytego obrazu
cv2.imshow(„Zamazany obraz”, cv2.resize (rozmyty_obraz, (500, 500)))

Jeśli cv2.waitKey(1) == ord("Q"):
przerwa

Funkcja kończy również wyświetlanie danych wyjściowych, gdy użytkownik naciśnie klawisz q.

Uruchamianie programu

Upewnij się, że główna funkcja jest uruchamiana jako pierwsza po uruchomieniu skryptu. Ten warunek będzie fałszywy, jeśli zaimportujesz skrypt jako moduł w innym programie.

Jeśli __nazwa__ == "__główny__":
główny()

Pozwala to na użycie skryptu jako modułu lub uruchomienie go jako samodzielnego programu. Po uruchomieniu programu powinieneś zobaczyć wynik podobny do tego:

Twarz jest niewyraźna i nie do poznania.

Rzeczywiste zastosowania rozmycia twarzy

Rozmycie twarzy można stosować w wielu typach aplikacji, aby chronić prywatność użytkowników. Usługi Street View i mapowania wykorzystują rozmycie do rozmycia twarzy ludzi na robionych przez nich zdjęciach. Organy ścigania stosują zamazywanie twarzy, aby chronić tożsamość świadków.

Wiele platform do udostępniania wideo zintegrowało również funkcję zamazywania twarzy dla swoich użytkowników. Porównanie wykorzystania zamazywania twarzy w tych obszarach pomoże Ci zaobserwować, jak inne platformy integrują tę technologię.