Puede usar el desenfoque facial para ocultar el rostro de una persona, en un video o una imagen, por varias razones. Los temas de privacidad y seguridad son los más predominantes. La mayoría de las plataformas para compartir videos y el software de edición de videos tienen incorporada la función de desenfoque de rostros.
Puede crear su propio programa para difuminar rostros desde cero utilizando Python y las bibliotecas OpenCV y NumPy.
Configuración de su entorno
Para continuar con este artículo, debe estar familiarizado con el fundamentos de python y tener un conocimiento básico de utilizando la biblioteca NumPy.
Abra cualquier IDE de Python con el que se sienta cómodo. Cree un entorno virtual en el que instalará las bibliotecas necesarias. Cree un nuevo archivo de Python. Navegue a la terminal y ejecute el siguiente comando para instalar las bibliotecas requeridas. Pase las bibliotecas como una lista delimitada por espacios.
pip instalar OpenCV-python NumPy
Utilizará OpenCV para tomar y preprocesar la entrada de video y NumPy para trabajar con arreglos.
Una vez que haya instalado las bibliotecas, espere a que el IDE actualice los esqueletos del proyecto. Cuando se completa la actualización y el entorno está listo, puede comenzar a codificar.
El código fuente completo está disponible en un repositorio GitHub.
Importación de las bibliotecas requeridas
Comience importando las bibliotecas OpenCV y NumPy. Esto le permitirá llamar y utilizar cualquier función que admitan. Importe OpenCV-python como cv2.
importar cv2
importar entumecido como notario público
Los módulos OpenCV-python usan el nombre cv2 como una convención que estableció la comunidad OpenCV. OpenCV-python es un contenedor de Python de la biblioteca OpenCV que está escrito en C++.
Tomando su entrada
Crear una variable e inicializar el Captura de video objeto. Pase cero como argumento si desea utilizar la cámara principal de su computadora como fuente de entrada. Para usar una cámara externa conectada a su computadora, pase una. Para realizar el desenfoque de rostros en un video pregrabado, pase la ruta del video en su lugar. A usar una cámara remota, pase la URL de la cámara que contiene su dirección IP y número de puerto.
cap = cv2.VideoCapture(0)
Para realizar el desenfoque facial en la entrada, necesitará tres funciones:
- Una función que preprocesará la entrada.
- Una función que desenfocará el rostro en la entrada.
- Una función principal que controlará el flujo del programa y mostrará la salida.
Preprocesamiento de la entrada de video
Cree una función de preprocesamiento de entrada que tomará cada cuadro del video de entrada como su entrada. Inicialice la clase CascadeClassifier que usará para la detección de rostros. Cambie el tamaño del marco a 640 por 640 píxeles. Convierta el marco redimensionado a escala de grises para facilitar el procesamiento y, finalmente, detecte las caras en la entrada y únalas con rectángulos.
definitivamenteimagen_preproceso(marco):
face_detector = cv2.CascadeClassifier (cv2.data.haarcascades
+ 'haarcascade_frontalface_default.xml')resize_image = cv2.resize (marco, (640, 640))
imagen_gris = cv2.cvtColor (imagen_redimensionada,
cv2.COLOR_BGR2GRAY)face_rects = face_detector.detectMultiScale(
imagen_gris, 1.04, 5, minSize=(20, 20))
devolver imagen_redimensionada, face_rects
Esta función devuelve una tupla que contiene la imagen redimensionada y una lista de rectángulos que representan las caras detectadas.
difuminar la cara
Cree una función de desenfoque que desenfocará las caras en su entrada. La función toma como entrada el marco redimensionado y la lista de rectángulos que delimitan las caras devueltas por la función de preprocesamiento. Bucles sobre cada rectángulo de la cara. Calcula el centro de cada rectángulo y el radio del círculo de desenfoque. Crea una imagen negra que tiene las mismas dimensiones que el marco redimensionado al inicializar todos los píxeles a cero. Dibuja un círculo blanco en la imagen negra cuyo centro está en el rectángulo de la cara utilizando el radio calculado. Finalmente, desenfoca la imagen en el círculo blanco.
definitivamentedesenfoque de rostro(resize_frame, face_rects):
para (x, y, w, h) en face_rects:
# Especificando el centro y el radio
# del círculo borroso
centro_x = x + w // 3
centro_y = y + h // 3
radio = h // 1# creando una imagen negra que tenga similar
# dimensiones como el marco
máscara = np.zeros((resize_frame.shape[:3]), np.uint8)# dibuja un círculo blanco en la región de la cara del marco
cv2.circle (máscara, (center_x, center_y), radio,
(255, 255, 255), -1)# desenfocando todo el marco
imagen_borrosa = cv2.medianBlur (fotograma_redimensionado, 99)# reconstruyendo el marco:
# - los píxeles del cuadro borroso si la máscara > 0
# - de lo contrario, tome los píxeles del marco original
resize_frame = np.where (máscara > 0, imagen borrosa,
marco_redimensionado)
devolver marco_redimensionado
La función usa el NumPy dónde() Función para reconstruir el marco durante el desenfoque.
Controlando el flujo de su programa
Cree una función principal que actuará como el punto de entrada de su programa. Luego controlará el flujo del programa. La función iniciará un ciclo infinito para capturar continuamente los cuadros de la entrada de video. Llame al método de lectura del objeto cap para leer un cuadro de la cámara.
Luego, la función pasará el cuadro a la función de preprocesamiento y pasará los valores devueltos a otra función, face_blur, para obtener una imagen borrosa. Luego cambia el tamaño del marco devuelto por la función de desenfoque y muestra la salida.
definitivamenteprincipal():
mientrasVerdadero:
éxito, cuadro = cap.read()
resized_input, face_rects = image_preprocess (fotograma)
imagen_borrosa = face_blur (resize_input, face_rects)# Mostrar la imagen borrosa
cv2.imshow("Imagen borrosa", cv2.cambiar tamaño (imagen_borrosa, (500, 500)))
si cv2.esperaClave(1) == orden("q"):
romper
La función también finaliza la visualización de salida cuando el usuario presiona la tecla q.
Ejecutar el programa
Asegúrese de que la función principal se ejecute primero cuando ejecute el script. Esta condición será falsa si importa el script como un módulo en otro programa.
si __nombre__ == "__principal__":
principal()
Esto le permite usar el script como un módulo o ejecutarlo como un programa independiente. Cuando se ejecuta el programa, debería ver un resultado similar a este:
El rostro está borroso e irreconocible.
Aplicaciones del mundo real del desenfoque facial
Puede aplicar desenfoque facial en muchos tipos de aplicaciones para proteger la privacidad de las personas. Los servicios de mapas y Street View utilizan el desenfoque para desenfocar los rostros de las personas en las imágenes que capturan. Las fuerzas del orden utilizan el desenfoque facial para proteger la identidad de los testigos.
Muchas plataformas para compartir videos también han integrado una función de desenfoque facial para sus usuarios. Comparar el uso de desenfoque facial en estas áreas lo ayudará a observar cómo otras plataformas integran la tecnología.