OpenCV Detección de Rostros
La detección de rostros es un problema clásico en la visión por computadora, y OpenCV proporciona un método de detección de rostros basado en el clasificador de características Haar, que es simple de usar y produce resultados notables.
Este artículo explicará en detalle cómo usar en OpenCVcv2.CascadeClassifier()para realizar la detección de rostros.
Introducción al clasificador de características Haar
El clasificador de características Haar es un método de aprendizaje automático basado en características Haar-like, propuesto por Paul Viola y Michael Jones en 2001. Extrae características Haar-like de la imagen y utiliza el algoritmo AdaBoost para entrenar, generando finalmente un clasificador que se usa para detectar objetos (como rostros) en la imagen.
Las características Haar-like son características rectangulares simples que se extraen calculando las diferencias de valores de píxeles en diferentes regiones de la imagen. Por ejemplo, una característica Haar-like puede ser la diferencia entre las sumas de valores de píxeles de dos rectángulos adyacentes. Estas características pueden capturar información estructural como bordes y líneas en la imagen.
El clasificador de características Haar en OpenCV
OpenCV proporciona clasificadores de características Haar preentrenados que se pueden usar directamente para la detección de rostros. Estos clasificadores se almacenan como archivos XML y contienen los parámetros del modelo ya entrenado.
En OpenCV, lacv2.CascadeClassifier()clase se utiliza para cargar y usar estos clasificadores.
Pasos para implementar la detección de rostros
Cargar el modelo del clasificador de características Haar:Usar
cv2.CascadeClassifier()para cargar el modelo preentrenado de detección de rostros.Leer la imagen:Usar
cv2.imread()para leer la imagen a detectar.Convertir a imagen en escala de grises:Convierte la imagen a escala de grises, porque el clasificador de características Haar se ejecuta más rápido en imágenes en escala de grises.
Detectar rostros:Usar el
detectMultiScale()método para detectar rostros en la imagen.Dibujar los resultados de la detección:Dibujar rectángulos alrededor de los rostros detectados en la imagen.
Mostrar el resultado:Mostrar el resultado de la detección.
Cargar el clasificador de características Haar
Antes de usar el clasificador de características Haar, primero debe cargar el modelo de clasificador preentrenado. OpenCV proporciona varios clasificadores preentrenados, como el utilizado para la detección de rostroshaarcascade_frontalface_default.xml。
Ejemplo
# Cargar el clasificador de características Haar
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
Leer la imagen
Antes de realizar la detección de rostros, es necesario leer la imagen a detectar. OpenCV proporcionacv2.imread()la función para leer imágenes.
Ejemplo
image = cv2.imread('image.jpg')
Convertir a imagen en escala de grises
El clasificador de características Haar normalmente realiza la detección en imágenes en escala de grises, por lo que es necesario convertir la imagen en color a escala de grises.
Ejemplo
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
Realizar la detección de rostros
Usar elcv2.CascadeClassifier.detectMultiScale()método para realizar la detección de rostros. Este método devuelve las regiones rectangulares de los rostros detectados (x, y, w, h), donde (x, y) son las coordenadas de la esquina superior izquierda del rectángulo, y w y h son el ancho y la altura del rectángulo, respectivamente.
Ejemplo
faces = face_cascade.detectMultiScale(gray_image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
scaleFactor: Indica la proporción de reducción del tamaño de la imagen en cada paso, utilizada para construir la pirámide de imágenes. El valor predeterminado es 1.1.minNeighbors: Indica el número de vecinos que debe conservar cada rectángulo candidato. El valor predeterminado es 5.minSize: Indica el tamaño mínimo del objetivo a detectar. El valor predeterminado es (30, 30).
Dibujar los resultados de la detección
Después de detectar los rostros, se puede usar elcv2.rectangle()método para dibujar rectángulos en la imagen y marcar la posición de los rostros.
Ejemplo
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)
Mostrar el resultado
Finalmente, use elcv2.imshow()método para mostrar el resultado de la detección.
Ejemplo
cv2.imshow('Detected Faces', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Ejemplo de código completo
A continuación se muestra un ejemplo completo de código de detección de rostros con OpenCV:
Ejemplo
# Cargar el clasificador de características Haar
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# Leer la imagen
image = cv2.imread('image.jpg')
# Convertir a imagen en escala de grises
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Realizar la detección de rostros
faces = face_cascade.detectMultiScale(gray_image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# Dibujar los resultados de la detección
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)
# Mostrar el resultado
cv2.imshow('Detected Faces', image)
cv2.waitKey(0)
cv2.destroyAllWindows()