Desenfoca y anonimiza rostros con OpenCV y Python

En este artículo vamos a ver cómo desenfocar y anonimizar rostros con OpenCV y Python.

Para esto, usaremos Cascade Classifier para detectar las caras. Asegúrese de descargar el mismo, desde este enlace: haarcascade_frontalface_default.xml

Acercarse

  • En primer lugar, utilizamos un algoritmo de detección de rostros incorporado para detectar el rostro de un video en tiempo real o de una imagen. Aquí, usaremos el método de clasificación en cascada para detectar una cara de un video en tiempo real (usando una cámara web). 
  • Luego, se leen los cuadros del video en tiempo real. El último cuadro se almacena y se convierte en escala de grises, para comprender mejor las características. 
  • Ahora, para que la salida sea estéticamente agradable, crearemos un rectángulo bordeado de color alrededor de la cara detectada. Pero queremos que la cara detectada se vea borrosa, por lo que usamos la función medianBlur para hacer lo mismo y mencionamos el área hasta la cual la cara debe estar borrosa. 
  • Y, ahora queremos mostrar la cara borrosa, el cuadro que se leyó usando la función imshow, y queremos que se muestre, hasta que presionemos una tecla.

Implementación paso a paso:

Paso 1: Importación del Algoritmo de Detección de Rostros, llamado Clasificador en Cascada.

Python3

import cv2
  
# to detect the face of the human
cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

Paso 2: Capturar los cuadros del video, para detectar la cara del cuadro

Python3

video_capture = cv2.VideoCapture(0)
while True:
    
    # capture the latest frame from the video
    check, frame = video_capture.read()

Paso 3: El cuadro capturado se cambia a escala de grises.

Python3

# convert the frame into grayscale(shades of black & white)
gray_image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
face = cascade.detectMultiScale(gray_image,
                                scaleFactor=2.0,
                                minNeighbors=4)

Paso 4: dibujar un rectángulo de color alrededor de la cara detectada.

Python3

for x, y, w, h in face:
  
    # draw a border around the detected face.
    # (here border color = green, and thickness = 3)
    image = cv2.rectangle(frame, (x, y),
                          (x+w, y+h), 
                          (0, 255, 0), 3)

Paso 5: Desenfoca la parte dentro del rectángulo (que contiene la cara detectada).

Python3

# blur the face which is in the rectangle
image[y:y+h, x:x+w] = cv2.medianBlur(image[y:y+h, x:x+w], 35)

Paso 6: Muestre el resultado final, es decir, la cara detectada (dentro del rectángulo) está borrosa.

Python3

# show the blurred face in the video
cv2.imshow('face blurred', frame)
key = cv2.waitKey(1)

A continuación se muestra la implementación completa:

Python3

import cv2
  
# to detect the face of the human
cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
  
# VideoCapture is a function, to capture
# video from the camera attached to system
# You can pass either 0 or 1
# 0 for laptop webcam
# 1 for external webcam
video_capture = cv2.VideoCapture(0)
  
# a while loop to run infinite times,
# to capture infinite number of frames for video
# because a video is a combination of frames
while True:
    
    # capture the latest frame from the video
    check, frame = video_capture.read()
  
    # convert the frame into grayscale(shades of black & white)
    gray_image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  
    # detect multiple faces in a captured frame
    # scaleFactor: Parameter specify how much the
    # image sizeis reduced at each image scale.
    # minNeighbors: Parameter specify how many
    # neighbours each rectangle should have to retain it.
    # rectangle consists the detect object.
    # Here the object is the face.
    face = cascade.detectMultiScale(
        gray_image, scaleFactor=2.0, minNeighbors=4)
  
    for x, y, w, h in face:
  
        # draw a border around the detected face. 
        # (here border color = green, and thickness = 3)
        image = cv2.rectangle(frame, (x, y), (x+w, y+h), 
                              (0, 255, 0), 3)
  
        # blur the face which is in the rectangle
        image[y:y+h, x:x+w] = cv2.medianBlur(image[y:y+h, x:x+w],
                                             35)
  
    # show the blurred face in the video
    cv2.imshow('face blurred', frame)
    key = cv2.waitKey(1)
  
    # This statement just runs once per frame.
    # Basically, if we get a key, and that key is a q,
    if key == ord('q'):
        break
  
# we will exit the while loop with a break,
# which then runs:
video_capture.release()
cv2.destroyAllWindows()

Producción:

Publicación traducida automáticamente

Artículo escrito por shilpimazumdar7150 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *