Spaces:
Runtime error
Runtime error
#!/usr/bin/env python3 | |
""" | |
Data Scientist.: Dr. Eddy Giusepe Chirinos Isidro | |
Reconhecimento de face e sorriso | |
================================ | |
Neste pequeno projeto usamos OpenCV para detectar a face | |
de imagens estáticas e sorrisos da mesma. Devemos ser cientes | |
que os modelos da OpenCV não são muito bons não, mas eles nos | |
ajudará a entender a aplicação da área de Visão Computacional. | |
Execução: | |
$ python app.py | |
""" | |
from flask import Flask, render_template, request | |
import cv2 | |
import os | |
from werkzeug.utils import secure_filename | |
app = Flask(__name__) | |
app.config['UPLOAD_FOLDER'] = 'static/images' | |
app.config['ALLOWED_EXTENSIONS'] = {'jpg', 'jpeg', 'png', 'gif'} | |
app.config['MAX_IMAGE_SIZE'] = (800, 800) # Defina o tamanho máximo desejado | |
app.config['DISPLAY_SIZE'] = (400, 400) # Defina o tamanho para exibição | |
# Função para verificar extensões de arquivo permitidas: | |
def allowed_file(filename): | |
return '.' in filename and filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS'] | |
# Função para redimensionar a imagem se ela for muito grande: | |
def resize_image(image): | |
height, width = image.shape[:2] | |
max_height, max_width = app.config['MAX_IMAGE_SIZE'] | |
# Redimensiona apenas se a imagem for maior do que o tamanho máximo permitido: | |
if height > max_height or width > max_width: | |
ratio = min(max_height / height, max_width / width) | |
new_height = int(height * ratio) | |
new_width = int(width * ratio) | |
return cv2.resize(image, (new_width, new_height)) | |
else: | |
return image | |
# Rota principal: | |
def index(): | |
return render_template('index.html') | |
# Rota para o upload da imagem: | |
def upload(): | |
if 'file' not in request.files: | |
return render_template('index.html', error='Nenhum arquivo enviado') | |
file = request.files['file'] | |
if file.filename == '': | |
return render_template('index.html', error='Nenhum arquivo selecionado') | |
if file and allowed_file(file.filename): | |
filename = secure_filename(file.filename) | |
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename) | |
file.save(filepath) | |
# Processamento da imagem com OpenCV (detecção facial e de sorriso): | |
image = cv2.imread(filepath) | |
# Redimensiona a imagem se for muito grande: | |
image = resize_image(image) | |
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) | |
# O modelos da OpenCV: | |
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') | |
smile_cascade = cv2.CascadeClassifier('haarcascade_smile.xml') | |
# Detecção facial: | |
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5) | |
for (x, y, w, h) in faces: | |
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2) | |
roi_gray = gray[y:y+h, x:x+w] | |
# Detecção de sorriso: | |
smiles = smile_cascade.detectMultiScale(roi_gray, scaleFactor=1.8, minNeighbors=20) | |
if len(smiles) > 0: | |
# Apenas considere a primeira detecção de sorriso | |
sx, sy, sw, sh = smiles[0] | |
cv2.rectangle(image, (x+sx, y+sy), (x+sx+sw, y+sy+sh), (0, 255, 0), 2) | |
# for (sx, sy, sw, sh) in smiles: | |
# cv2.rectangle(image, (x+sx, y+sy), (x+sx+sw, y+sy+sh), (0, 255, 0), 2) | |
# Redimensiona a imagem para exibição na interface: | |
display_image = cv2.resize(image, app.config['DISPLAY_SIZE']) | |
cv2.imwrite(filepath, image) | |
return render_template('index.html', filename=filename, display_image=display_image) | |
else: | |
return render_template('index.html', error='Extensão de arquivo não permitida') | |
if __name__ == '__main__': | |
app.run(host='0.0.0.0', port=5000, debug=True) | |