Detectando faces em imagens com Python e Opencv
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 npfrom 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:
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 verticalfor (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:
Gostou? Não deixa de seguir o blog!