Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Automatizar classificação das imagens de uma vez

Olá! Gostaria de saber como podemos escrever o código para que ele receba uma certa quantidade de imagens e processe cada uma dela de maneira automática sem escrever o código para cada uma delas.

Abaixo segue a minha resolução que trata cada magem separadamente:

#Carregando as imagens:
imagem1 = cv2.imread(os.path.join(diretorio_base,"Recortar_face1.png")) #BGR
imagem2 = cv2.imread(os.path.join(diretorio_base,"Recortar_face2.png")) #BGR
imagem3 = cv2.imread(os.path.join(diretorio_base,"Recortar_face3.png")) #BGR

#Convertendo as imagens para RGB para visualizar com o pyplot(plt):
imagem1 = cv2.cvtColor(imagem1,cv2.COLOR_BGR2RGB)
imagem2 = cv2.cvtColor(imagem2,cv2.COLOR_BGR2RGB)
imagem3 = cv2.cvtColor(imagem3,cv2.COLOR_BGR2RGB)

#Convertendo imagem para escala de cinza para usar o classificador de cascata de Haar (mais rápido):
imagem1_gray = cv2.cvtColor(imagem1,cv2.COLOR_RGB2GRAY)
imagem2_gray = cv2.cvtColor(imagem2,cv2.COLOR_RGB2GRAY)
imagem3_gray = cv2.cvtColor(imagem3,cv2.COLOR_RGB2GRAY)

#Carregando o Classificador de Haar (especializado em rostos frontais)
classificador_face = cv2.CascadeClassifier(os.path.join(diretorio_base,"Classificadores/haarcascade_frontalface_default.xml"))

#Aplicando o classificador:
face1 = classificador_face.detectMultiScale(imagem1_gray,1.3,5)
face2 = classificador_face.detectMultiScale(imagem2_gray,1.3,5)
face3 = classificador_face.detectMultiScale(imagem3_gray,1.3,5)

#Criando uma cópia da imagem original (em RGB) para anotar os retângulos
imagem1_anotada = imagem1.copy() 
imagem2_anotada = imagem2.copy() 
imagem3_anotada = imagem3.copy()

#Desenhando retângulo ao redor das faces de cada imagem

#Imagem1
for (x,y,w,h) in face1:
    cv2.rectangle(imagem1_anotada,(x,y),(x+w,y+h), (255,255,0),2)

#Imagem2
for (x,y,w,h) in face2:
    cv2.rectangle(imagem2_anotada,(x,y),(x+w,y+h), [255,255,0],2)

#Imagem3
for (x,y,w,h) in face3:
    cv2.rectangle(imagem3_anotada, (x,y),(x+w,y+h), [255,255,0],3)
    #Recortando as faces
#Imagem1
for (y,x,h,w) in face1:
    imagem_roi1 = imagem1[x:x+w,y:y+h]
    
#Imagem2
for (y,x,h,w) in face2:
    imagem_roi2 = imagem2[x:x+w,y:y+h]

#Imagem3
for (y,x,h,w) in face3:
    imagem_roi3 = imagem3[x:x+w,y:y+h]
2 respostas

Oi, Vivian! Tudo certo contigo?

Para realizar essa automatização, podemos, por exemplo, utilizar loops (como o for) em um conjunto de dados.

Trouxe abaixo uma sugestão de código, no qual armazenei todas as imagens em uma lista, observe comigo:

# Lista de imagens
lista_imagens = ["Recortar_face1.png", "Recortar_face2.png", "Recortar_face3.png"]

#Carregando o Classificador de Haar (especializado em rostos frontais)
classificador_face = cv2.CascadeClassifier(os.path.join(diretorio_base,"Classificadores/haarcascade_frontalface_default.xml"))

# Loop para processar cada imagem
for imagem in lista_imagens:
    img = cv2.imread(os.path.join(diretorio_base, imagem)) # BGR
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    faces = classificador_face.detectMultiScale(img_gray, 1.3, 5)
    img_anotada = img.copy()
    for (x, y, w, h) in faces:
        cv2.rectangle(img_anotada, (x, y), (x+w, y+h), (255, 255, 0), 2)
    for (y, x, h, w) in faces:
        imagem_roi = img[x:x+w, y:y+h]

A partir desse código, faremos o processamento de todas as imagens na lista lista_imagens de uma vez, sem a necessidade de escrever repetidas vezes os mesmos comandos. Também é possível utilizar a estrutura de repetição while, que depende de um contador.

Para apresentar as imagens processadas, teremos que ter um cuidado maior: será necessário trabalhar com alguma variável auxiliar (que será incrementada a cada loop), a qual nos ajudará a dispor as figuras lado a lado.

Vivian, essa é apenas uma sugestão! Sinta-se livre para personalizar o código e deixá-lo do seu jeito. :)

Espero ter ajudado! Qualquer dúvida, estou por aqui.

Um abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!
solução!

Muito obrigada!!