Du kan använda suddiga ansikten för att dölja en persons ansikte, i en video eller en bild, av flera anledningar. Integritets- och säkerhetsfrågor är de mest dominerande. De flesta videodelningsplattformar och videoredigeringsprogram har inbyggd funktion för att sudda ut ansikten.
Du kan skapa ditt eget program för att sudda ut ansikten från början med Python och biblioteken OpenCV och NumPy.
Ställa in din miljö
För att fortsätta med den här artikeln måste du vara bekant med grunderna i Python och ha en grundläggande förståelse för med hjälp av NumPy-biblioteket.
Öppna vilken Python IDE du är bekväm med. Skapa en virtuell miljö där du installerar de nödvändiga biblioteken. Skapa en ny Python-fil. Navigera till terminalen och kör följande kommando för att installera de nödvändiga biblioteken. Skicka biblioteken som en mellanslagsavgränsad lista.
pip installera OpenCV-python NumPy
Du kommer att använda OpenCV för att ta och förbehandla videoingången och NumPy för att arbeta med arrayer.
När du har installerat biblioteken, vänta på att IDE ska uppdatera projektskeletten. När uppdateringen är klar och miljön är klar kan du börja koda.
Den fullständiga källkoden finns tillgänglig i en GitHub-förråd.
Importera de obligatoriska biblioteken
Börja med att importera OpenCV- och NumPy-bibliotek. Detta gör att du kan ringa och använda alla funktioner som de stöder. Importera OpenCV-python som cv2.
importera cv2
importera numpy som np
OpenCV-python-modulerna använder namnet cv2 som en konvention som OpenCV-gemenskapen etablerade. OpenCV-python är ett Python-omslag av OpenCV-biblioteket som är skrivet i C++.
Tar din input
Skapa en variabel och initiera Videoinspelning objekt. Skicka noll som argument om du vill använda din dators primära kamera som ingångskälla. För att använda en extern kamera som är ansluten till din dator passerar en. Om du vill göra ansiktssuddare på en förinspelad video passerar du videons väg istället. Till använd en fjärrkamera, skicka kamerans URL som innehåller dess IP-adress och portnummer.
cap = cv2.VideoCapture(0)
För att göra suddiga ansikten på ingången behöver du tre funktioner:
- En funktion som förbearbetar inmatningen.
- En funktion som kommer att sudda ut ansiktet i ingången.
- En huvudfunktion som styr programmets flöde och visar utdata.
Förbearbetning av videoingången
Skapa en ingångsförbearbetningsfunktion som tar varje bildruta i ingångsvideon som sin ingång. Initiera klassen CascadeClassifier som du kommer att använda för ansiktsdetektion. Ändra storlek på ramen till 640 gånger 640 pixlar. Konvertera den ändrade storleken på ramen till gråskala för enklare bearbetning och upptäck slutligen ansikten i inmatningen och bind ihop dem med rektanglar.
defimage_preprocess(ram):
face_detector = cv2.CascadeClassifier (cv2.data.haarcascades
+ 'haarcascade_frontalface_default.xml')resized_image = cv2.resize (ram, (640, 640))
grå_bild = cv2.cvtColor (förändrad_bild,
cv2.COLOR_BGR2GRAY)face_rects = face_detector.detectMultiScale(
grå_bild, 1.04, 5, minSize=(20, 20))
lämna tillbaka resized_image, face_rects
Denna funktion returnerar en tupel som innehåller den ändrade storleken på bilden och en lista med rektanglar som representerar de upptäckta ansikten.
Sudda ansiktet
Skapa en oskärpa funktion som kommer att sudda ut ansiktena i din inmatning. Funktionen tar den ändrade storleken på ramen och listan över rektanglar som avgränsar ansikten som returneras av förbearbetningsfunktionen som indata. Slingor över varje ansiktsrektangel. Beräknar mitten av varje rektangel och radien för den oskärpa cirkeln. Skapar en svart bild med samma dimensioner som den ändrade storleken på ramen genom att initiera alla pixlar till noll. Ritar en vit cirkel på den svarta bilden vars centrum är i ansiktsrektangeln med hjälp av den beräknade radien. Slutligen suddar det ut bilden på den vita cirkeln.
defansikte_oskärpa(förändrad_ram, ansiktskorrigeringar):
för (x, y, w, h) i face_rects:
# Ange centrum och radie
# av den oskärpa cirkeln
center_x = x + w // 3
center_y = y + h // 3
radie = h // 1# skapa en svart bild med liknande
# mått som ramen
mask = np.zeros((förändrad_ram.form[:3]), np.uint8)# rita en vit cirkel i framsidan av ramen
cv2.circle (mask, (center_x, center_y), radie,
(255, 255, 255), -1)# gör hela ramen suddig
blurred_image = cv2.medianBlur (resized_frame, 99)# rekonstruera ramen:
# - pixlarna från den suddiga ramen om mask > 0
# - annars, ta pixlarna från den ursprungliga ramen
resized_frame = np.where (mask > 0, blurred_image,
resized_frame)
lämna tillbaka resized_frame
Funktionen använder NumPy var() funktion för att rekonstruera ramen under oskärpa.
Styr flödet av ditt program
Skapa en huvudfunktion som kommer att fungera som startpunkten för ditt program. Det kommer då att styra programmets flöde. Funktionen startar en oändlig loop för att kontinuerligt fånga bildrutorna för videoingången. Anrop capobjektets läsmetod för att läsa en ram från kameran.
Funktionen skickar sedan ramen till förbearbetningsfunktionen och skickar returvärdena till en annan funktion, face_blur, för att få en suddig bild. Den ändrar sedan storleken på ramen som returneras av suddighetsfunktionen och visar resultatet.
defhuvud():
medanSann:
framgång, ram = cap.read()
resized_input, face_rects = image_preprocess (ram)
blurred_image = face_blur (förändrad_inmatning, face_rects)# Visar den suddiga bilden
cv2.imshow("suddig bild", cv2.resize (blurred_image, (500, 500)))
om cv2.waitKey(1) == ord("q"):
ha sönder
Funktionen avslutar även utgångsvisningen när användaren trycker på q-tangenten.
Kör programmet
Se till att huvudfunktionen körs först när du kör skriptet. Detta villkor kommer att vara falskt om du importerar skriptet som en modul i ett annat program.
om __namn__ == "__huvud__":
main()
Detta gör att du kan använda skriptet som en modul eller köra det som ett fristående program. När programmet körs bör du se utdata som liknar detta:
Ansiktet är suddigt och oigenkännligt.
Verkliga tillämpningar av suddiga ansikten
Du kan använda oskärpa i många typer av applikationer för att skydda människors integritet. Street view och karttjänster använder oskärpa för att sudda ut ansiktena på människor i bilderna de tar. Brottsbekämpning använder ansiktssuddare för att skydda vittnens identitet.
Många videodelningsplattformar har också integrerat en funktion för att sudda ut ansikten för sina användare. Att jämföra användningen av suddiga ansikten i dessa områden hjälper dig att observera hur andra plattformar integrerar tekniken.