Created
December 15, 2016 19:34
-
-
Save lopezezequiel/5a65961ccdb3d017bea8b23113804a5d to your computer and use it in GitHub Desktop.
Face detection examples - Python + OpenCV
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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