Skip to content

Instantly share code, notes, and snippets.

@lopezezequiel
Created December 15, 2016 19:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lopezezequiel/5a65961ccdb3d017bea8b23113804a5d to your computer and use it in GitHub Desktop.
Save lopezezequiel/5a65961ccdb3d017bea8b23113804a5d to your computer and use it in GitHub Desktop.
Face detection examples - Python + OpenCV
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Ejemplo de detección de rostros a partir de archivos de imagen
Basado en el ejemplo de la documentación oficial que se puede encontrar en
http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html
Autor: López Ricardo Ezequiel
Sitio: lopezezequiel.com
"""
import cv2
#cargamos la plantilla de haar-like features para rostros vistos desde el frente
#pueden descargarlo desde https://github.com/opencv/opencv/tree/master/data/haarcascades
haar = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
#cargamos la imagen
image = cv2.imread("image.jpg")
#convertimos la imagen a escala de grises
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#detectamos los rostros teniendo en cuenta que pueden ser de distintos
#tamaños ya que pueden estar a distintas distancias
#los parametros son los sugeridos en la documentación y los que generalmente
#me dan mejores resultados
faces = haar.detectMultiScale(gray, 1.3, 5)
#dibujamos un rectangulo azul de 4px para cada rostro detectado
for (x, y, width, height) in faces:
cv2.rectangle(image, (x,y), (x+width,y+height), (255, 0, 0), 4)
#mostramos la imagen en una ventana
cv2.imshow('Detección desde archivo', image)
#esperamos que presione alguna tecla antes de cerrar el programa
cv2.waitKey()
#cierra todas las ventanas abiertas. en este caso es una sola
cv2.destroyAllWindows()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Ejemplo de detección de rostros desde una cámara ip
Basado en el ejemplo de la documentación oficial que se puede encontrar en
http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html
Autor: López Ricardo Ezequiel
Sitio: lopezezequiel.com
"""
import cv2
import numpy
import base64
import urllib
#cargamos la plantilla de haar-like features para rostros vistos desde el frente
#pueden descargarlo desde https://github.com/opencv/opencv/tree/master/data/haarcascades
haar = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
#abrimos el stream de video
URL = 'http://user:pass@example:9999/videostream.cgi'
stream = urllib.urlopen(URL)
cache = ''
#funcion que retorna un frame del stream cada que es invocada
def get_frame():
global cache
while True:
#leemos de a 1KB
cache += stream.read(1024)
#estamos leyendo un stream mjpeg sobre http, por lo tanto por cada
#frame recibimos una secuencia que comienza con los encabezados
#http, seguidos por un marcador de inicio 0xff 0xd8, seguido por
#la imagen jpg binaria, seguido por el marcador de fin 0xff 0xd9
#buscamos el marcador de inicio
a = cache.find('\xff\xd8')
#buscamos el marcador de fin
b = cache.find('\xff\xd9')
#si ya encontramos los dos marcadores, lo que esta en el medio es
#la imagen jpeg
if a!=-1 and b!=-1:
#leemos el jpg
jpg = cache[a:b]
#removemos la parte leida del cache y los dos bytes del marcador de fin
cache = cache[b+2:]
#convertimos a array de enteros
array = numpy.fromstring(jpg, dtype=numpy.uint8)
#decodificamos y retornamos la imagen
return cv2.imdecode(array,cv2.CV_LOAD_IMAGE_COLOR)
while True:
#obtenemos un cuadro
image = get_frame()
#convertimos la imagen a escala de grises
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#detectamos los rostros teniendo en cuenta que pueden ser de distintos
#tamaños ya que pueden estar a distintas distancias
#los parametros son los sugeridos en la documentación y los que generalmente
#me dan mejores resultados
faces = haar.detectMultiScale(gray, 1.3, 5)
#dibujamos un rectangulo azul de 4px para cada rostro detectado
for (x, y, width, height) in faces:
cv2.rectangle(image, (x,y), (x+width,y+height), (255, 0, 0), 4)
#mostramos la imagen en una ventana
cv2.imshow('Detección desde camara ip', image)
#si se presiono la tecla 'q' salimos del programa
if cv2.waitKey(1) & 0xFF == ord('q'):
break
#cierra todas las ventanas abiertas. en este caso es una sola
cv2.destroyAllWindows()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Ejemplo de detección de rostros desde una cámara web
Basado en el ejemplo de la documentación oficial que se puede encontrar en
http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_objdetect/py_face_detection/py_face_detection.html
Autor: López Ricardo Ezequiel
Sitio: lopezezequiel.com
"""
import cv2
#cargamos la plantilla de haar-like features para rostros vistos desde el frente
#pueden descargarlo desde https://github.com/opencv/opencv/tree/master/data/haarcascades
haar = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
#creamos el objeto videocapture
camera = cv2.VideoCapture(0)
while True:
#leemos un frame
_, image = camera.read()
#convertimos la imagen a escala de grises
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#detectamos los rostros teniendo en cuenta que pueden ser de distintos
#tamaños ya que pueden estar a distintas distancias
#los parametros son los sugeridos en la documentación y los que generalmente
#me dan mejores resultados
faces = haar.detectMultiScale(gray, 1.3, 5)
#dibujamos un rectangulo azul de 4px para cada rostro detectado
for (x, y, width, height) in faces:
cv2.rectangle(image, (x,y), (x+width,y+height), (255, 0, 0), 4)
#mostramos la imagen en una ventana
cv2.imshow('Detección desde webcam', image)
#si se presiono la tecla 'q' salimos del programa
if cv2.waitKey(1) & 0xFF == ord('q'):
break
#liberamos la camara
camera.release()
#cierra todas las ventanas abiertas. en este caso es una sola
cv2.destroyAllWindows()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment