Detectando faces em imagens com Python e Opencv

Mariane Neiva — @maribneiva
4 min readDec 15, 2021
Modificada da internet

Você já aprendeu o que é uma imagem, vídeo e visão computacional. Agora é hora do nosso primeiro projeto!

Nesse tutorial, vamos aprender como detectar uma face e manipular apenas essa região!

Bora?! Bora!

Importando as bibliotecas

Se você está começando em visão computacional e processamento de imagem, você precisa conhecer o Opencv.

O opencv é uma biblioteca de visão computacional muito poderosa que vai facilitar sua vida (confia em mim), nas tarefas com imagens.

Além dela, vamos utilizar a biblioteca matemática numpy e a cv2_imshow para exibir imagens no Google Colab.

import cv2
from google.colab.patches import cv2_imshow
import numpy as np
from google.colab.patches import cv2_imshow
import numpy as np

Lendo a imagem

Eu falei pra vocês que a opencv facilita a vida, não falei? Para ler a imagem a qual queremos detectar a face, basta o seguinte código:

Imagem do exemplo
imagePath = 'imagemFace.jpg'#leia a imagem
image = cv2.imread(imagePath)

Detectando a face usando Haar Cascade

Se existem opções para facilitar, vamos utilizar.

O Haar Cascade (by Viola-Jones) é um método e detecção de faces em imagens ou vídeos.

O algoritmo é uma metodologia antiga, anterior ao deep learning, mas ainda muito utilizada para detecção na faces.

Nesse método, é utilizado deteção de bordas e linhas da imagem em escala de cinza e um banco de dados com e sem imagens foi utilizado para treinamento e compilado no arquivo em xml que pode ser encontrado aqui.

Caso queiram entender detalhes do método, leia esse artigo.

No nosso código, vamos utilizar o arquivo haarcascade_frontalface_default.xml, baixe e use-o no seu código:

cascadePath = 'haarcascade_frontalface_default.xml'#vamos utilizar novamente o classificador provido pelo opencv
faceCascade = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
#a detecção de face é feita em imagem em escala de cinza
#vamos convert a imagem original
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#vamos utilizar o método detectMultiScale com
faces = faceCascade.detectMultiScale(gray,
minSize=(30, 30),
flags = cv2.CASCADE_SCALE_IMAGE
)
#imprimindo quantas faces foram encontradas
print("Found {0} faces!".format(len(faces)))

Para mais informações sobre os parâmetros da função detectMultiScale, clique aqui

Mostrando a imagem e indicando a região da face

Para cada face encontrada, vamos mostra-la com um retangulo (função rectangle) em volta da face.

A varíavel face já possui essas informações, então vamos utiliza-la

# Desenhando o retangulo ao redor de cada face encontrada#(0,255,0) é a cor do retangulo (verde)
#2 é a grossura da linha
#w é a largura do quadrado da face
#h é a altura
#x é o ponto inicial no eixo horizontal
#y é o ponto inicial no eixo vertical
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2_imshow(image)
cv2.waitKey(0)

Resultado:

Alterando apenas região da face

Agora vamos deixar a face mais avermelhada, alterando apenas a nossa ROI (region of interest) da face.

Para deixar a face mais avermelhada, vamos fazer um processo similar ao ajuste de brilho do post anterior. Nesse caso, vamos alterar apenas a terceira camada da imagem. No python e no opencv, a ordem dos canais é B,G,R (azul, verde e vermelho).

Siga os comentários do código para o passo:

for (x, y, w, h) in faces:   #RECORTANDO APENAS A REGIÃO DA FACE 
#PERCEBA QUE NO RECORTE, OS EIXOS SÃO INVERSOS
ROI = image[y:y+h, x:x+w,:]
#MOSTRANDO A REGIAO DA FACE
cv2_imshow(ROI)
cv2.waitKey(0)
#CRIANDO A IMAGEM PARA AUMENTAR O BRILHO APENAS DO VERMELHO
red = np.zeros_like(ROI); #CRIAR IMAGEM DO TAMANHO DA ROI
red[:,:] = [0,0,100]; # (b,g,r)
#AUMENTE O BRILHO DO CANAL VERMELHO DA ROI
avermelhado = cv2.add(ROI, red);
#LIMITE O VALOR PARA 255
avermelhado[avermelhado > 255] = 255
#'colando' a face avermelhada na foto original
#ps.: não é a única forma.
#Pode ser feito o processamento direto na imagem original
imageAvermelhada = image.copy()
imageAvermelhada[y:y+h, x:x+w] = avermelhado
cv2_imshow(imageAvermelhada)
cv2.waitKey()

Resultado da visualização da ROI:

Resultado após processamento:

Embaçando a imagem

Outra opção, embaçando a foto.

for (x, y, w, h) in faces:
#RECORTANDO APENAS A REGIÃO DA FACE
#PERCEBA QUE NO RECORTE, OS EIXOS SÃO INVERSOS
ROI = image[y:y+h, x:x+w,:] #crie um filtro (no caso esse embaça a image) e aplique
kernel = np.ones((5,5),np.float32)/25
embacado = cv2.filter2D(ROI,-1,kernel)
#LIMITE O VALOR PARA 255
embacado[embacado > 255] = 255
#’colando’ a face embaçada na foto original
#ps.: não é a única forma.
#Pode ser feito o processamento direto na imagem original
imageEmbacada = image.copy()
imageEmbacada[y:y+h, x:x+w] = embacado
cv2_imshow(imageEmbacada)
cv2.waitKey()

Resultado final:

Link para o google colab

Gostou? Não deixa de seguir o blog!

Conecte-se comigo: Instagram and LinkedIn

--

--

Mariane Neiva — @maribneiva

Woman in tech, researcher @University of Sao Paulo. Passionate by artificial intelligence, innovation, scientific communication and programming.