?? Reconocimiento de emociones ?? ( EigenFaces, FisherFaces, LBPH )| Python – OpenCV
Te doy la bienvenida a un nuevo tutorial, en este voy a realizar el reconocimiento de emociones (enojo, felicidad, sorpresa y tristeza) usando Python y OpenCV, para ello usaremos los mismos métodos que habíamos empleado para el tutorial de reconocimiento facial, EigenFaces, FisherFaces y LBPH. ¡Empecemos!
CONTENIDO
- Creando la base de datos con los rostros que reflejen las emociones
- Entrenamiento de los reconocedores
- Probando EigenFaces, FisherFaces y LBPH para el reconocimiento de emociones faciales
- Resultados de EigenFaces en el reconocimiento de emociones
- Resultados de FisherFaces en el reconocimiento de emociones
- Resultados de Local Binary Pattern Histogram en el reconocimiento de emociones
Los pasos a realizar en este tutorial son similares a los realizados en el post de reconocimiento facial, es decir, primero vamos a capturar los rostros en los que se reflejen las emociones: enojo, felicidad, sorpresa y tristeza, cada uno de ellos en una carpeta diferente. Luego procederemos a entrenar los reconocedores con 3 métodos: EigenFaces, FisherFaces y LBPH. Finalmente vamos a probar el reconocimiento de cada una de las emociones entrenadas, pero además visualizaremos un emoji que represente la emoción reconocida.
NOTA: Te dejo mi repositorio de github en donde también podrás encontrar los programas que elaboraremos en este post.
Creando la base de datos con los rostros que reflejen las emociones

Figura 1: Representación del proceso de captura de rostros con distintas expresiones.
El programa que usaremos para poder crear la base de datos de los rostros que reflejen las emociones será el mismo que habíamos usado para el reconocimiento de rostros, se va a realizar unas pequeñas variaciones en cuanto a los nombres de las variables y la cantidad de rostros por cada emoción (para experimentar un poco). Entonces a continuación tendremos el script llamado capturandoRostros.py
import cv2 import os import imutils #emotionName = 'Enojo' #emotionName = 'Felicidad' #emotionName = 'Sorpresa' emotionName = 'Tristeza' dataPath = '.../Reconocimiento Emociones/Data' #Cambia a la ruta donde hayas almacenado Data emotionsPath = dataPath + '/' + emotionName if not os.path.exists(emotionsPath): print('Carpeta creada: ',emotionsPath) os.makedirs(emotionsPath) cap = cv2.VideoCapture(0,cv2.CAP_DSHOW) faceClassif = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml') count = 0 while True: ret, frame = cap.read() if ret == False: break frame = imutils.resize(frame, width=640) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) auxFrame = frame.copy() faces = faceClassif.detectMultiScale(gray,1.3,5) for (x,y,w,h) in faces: cv2.rectangle(frame, (x,y),(x+w,y+h),(0,255,0),2) rostro = auxFrame[y:y+h,x:x+w] rostro = cv2.resize(rostro,(150,150),interpolation=cv2.INTER_CUBIC) cv2.imwrite(emotionsPath + '/rotro_{}.jpg'.format(count),rostro) count = count + 1 cv2.imshow('frame',frame) k = cv2.waitKey(1) if k == 27 or count >= 200: break cap.release() cv2.destroyAllWindows()
Dado que este código ya lo habíamos tratado antes, pasaré a su explicación de forma breve.
Línea 1 a 3: Importamos las librerías.
Línea 5 a 8: Debemos descomentar cada una de estas líneas, comentando las demás, para que de este modo se vayan creando las carpetas con los rostros con expresiones de: enojo, felicidad, sorpresa y tristeza.
Línea 10 a 15: Con estas líneas crearemos una carpeta correspondiente al nombre de cada emoción (líneas 5 a 8) dentro de la carpeta ‘Data’.
Línea 17 a 20: Especificamos que vamos a realizar un video streaming, en faceClassif
asignamos el detector de rostros que vamos a usar y finalmente establecemos un contador count
en 0 para que se cuenten todos los rostros que se irán almacenando.
Línea 24 a 28: Se lee cada fotograma y este a su vez será redimensionado a 640 pixeles de ancho, se aplica escala de grises y para tener una imagen del fotograma intacto nos ayudamos de frame.copy()
y asignamos a auxFrame
.
Línea 30 a 38: En faces
se almacenan todos los rostros detectados y para analizar cada uno de ellos pasaremos al for de la línea 32, en él dibujaremos un rectángulo que rodee cada rostro, luego recortaremos cada rostro rodeado, lo redimensionamos a 150 x 150 pixeles, para que todas las caras almacenadas tengan el mismo tamaño y almacenamos cada rostro en la carpeta creada en las líneas 5 a 15. Finalmente incrementamos en 1 el contador y visualizamos.
Línea 40 a 42: Establecemos que el proceso se detenga cuando una tecla sea presionada, en este caso ‘ESC’, o cuando se hayan almacenado 200 rostros (por cada emoción).
Línea 44 y 45: Indicamos que ha finalizado el video streaming y cerramos las ventanas visualizadas.

Figura 2: Carpetas creadas.
Entrenamiento de los reconocedores
Voy a realizar el entrenamiento con los tres métodos que OpenCV nos ofrece, para ello he querido optimizar el código anterior para entrenar todos los métodos en una sola ejecución, esto nos servirá para realizar pruebas sobre cada uno de ellos, sin embargo tu podrías solo usar el método que necesites. Veamos, creamos un script llamado entrenando.py
import cv2 import os import numpy as np import time def obtenerModelo(method,facesData,labels): if method == 'EigenFaces': emotion_recognizer = cv2.face.EigenFaceRecognizer_create() if method == 'FisherFaces': emotion_recognizer = cv2.face.FisherFaceRecognizer_create() if method == 'LBPH': emotion_recognizer = cv2.face.LBPHFaceRecognizer_create() # Entrenando el reconocedor de rostros print("Entrenando ( "+method+" )...") inicio = time.time() emotion_recognizer.train(facesData, np.array(labels)) tiempoEntrenamiento = time.time()-inicio print("Tiempo de entrenamiento ( "+method+" ): ", tiempoEntrenamiento) # Almacenando el modelo obtenido emotion_recognizer.write("modelo"+method+".xml") dataPath = '.../Reconocimiento Emociones/Data' #Cambia a la ruta donde hayas almacenado Data emotionsList = os.listdir(dataPath) print('Lista de personas: ', emotionsList) labels = [] facesData = [] label = 0 for nameDir in emotionsList: emotionsPath = dataPath + '/' + nameDir for fileName in os.listdir(emotionsPath): #print('Rostros: ', nameDir + '/' + fileName) labels.append(label) facesData.append(cv2.imread(emotionsPath+'/'+fileName,0)) #image = cv2.imread(emotionsPath+'/'+fileName,0) #cv2.imshow('image',image) #cv2.waitKey(10) label = label + 1 obtenerModelo('EigenFaces',facesData,labels) obtenerModelo('FisherFaces',facesData,labels) obtenerModelo('LBPH',facesData,labels)
Línea 1 a 4: Importamos OpenCV, os, numpy con un alias np y time, este último nos ayudará a conocer el tiempo empleado en el entrenamiento por cada método.
Línea 6 a 20: En estas líneas nos extenderemos un poquito, ya que he creado una función que me ayude a leer, entrenar y guardar cada reconocedor, veamos:
- Línea 6: Creamos la función
obtenerModelo
, para esta función necesitaremos demethod
que es el nombre del método a emplear,facesData
el array en donde se almacenarán todos los rostros con sus diferentes emociones y finalmentelabels
, que son las etiquetas de cada uno de los rostros correspondientes a cada emoción. - Línea 8 a 10: Si el método que deseamos usar es
EigenFaces
entonces se asignarácv2.face.EigenFaceRecognizer_create()
aemotion_recognizer
. Si deseamos usar esFisherFaces
entonces se asignarácv2.face.FisherFaceRecognizer_create()
aemotion_recognizer
. Por último si deseamos usarLBPH
se asignarácv2.face.LBPHFaceRecognizer_create()
aemotion_recognizer.
- Línea 13 a 17: En estas líneas entrenaremos al reconocedor, para ello en la línea 13 imprimimos un mensaje de
'Entrenando'
junto al método que se vaya a usar en ese momento. En la línea 14 almacenamos el tiempo inicial eninicio
, en la línea 15 entrenamos el reconocedor, para ello digitamosemotion_recognizer.train
y dentro de los paréntesis especificamos el array en donde están almacenados todos los rostros y las etiquetas de cada uno de estos rostros. En la línea 16 tomamos el tiempo actual menos el tiempo de inicio para conocer la cantidad de tiempo en segundos que tomó el entrenamiento. En la línea 17 imprimimos el método usado y el tiempo que le llevó entrenar. - Línea 20: Una vez que se ha entrenado el reconocedor, procedemos a almacenarlo con
emotion_recognizer.write
, dentro de los paréntesis debemos colocar el nombre del modelo a almacenar seguido de la extensión xml o yaml.
Línea 22 a 24: Indicamos la ruta en donde se encuentra el directorio ‘Data’, en el cual se crearon las carpetas con las emociones. Luego listamos todas las carpetas contenidas en esta ubicación y por último imprimimos dicha lista.
Línea 26 a 28: Declaramos los arrays vacíos labels
y faceData
en ellos se almacenará todos los rostros de las carpetas con una etiqueta asociada según la emoción. Declaramos label
en 0, esta nos ayudará con el valor almacenado en labels
.
Línea 30 y 31: Con un for recorremos cada elemento del array emotionsList
. Luego asignamos a emotionsPath
la ruta completa, esto nos servirá para más adelante leer cada rostro.
Línea 33 a 40: A continuación recorremos cada una de las imágenes contenidas en emotionsPath
, es decir que por cada carpeta de emociones leeremos todos los rostros contenidos en ella. En la línea 35 almacenamos el valor de label
en el array labels
, en cambio en la línea 36 leemos cada imagen y las transformamos a grises, gracias a que estamos usado 0
como segundo argumento de cv2.imread
. Una vez que se haya leído cada rostro de una carpeta se incrementará en 1 label
para que la próxima carpeta con otra emoción tenga un valor diferente.

Figura 3: Ejemplo de los rostros por cada expresión, y sus etiquetas asociadas.
Línea 42 a 44: Llamamos a la función obtenerModelo
que creamos en un principio, en ella especificamos el método que usaremos para entrenar el reconocedor, seguido del array en donde se han almacenado los rostros y finalmente cada una de las etiquetas correspondientes. En mi caso voy a realizar el entrenamiento con los 3 métodos.

Figura 4: Modelos obtenidos luego del entrenamiento.
Probando EigenFaces, FisherFaces y LBPH para el reconocimiento de emociones faciales
Una vez que hemos entrenado el o los modelos será necesario probar su funcionamiento, para ello crearemos otro script llamado reconocimientoEmociones.py
.
import cv2 import os import numpy as np def emotionImage(emotion): # Emojis if emotion == 'Felicidad': image = cv2.imread('Emojis/felicidad.jpeg') if emotion == 'Enojo': image = cv2.imread('Emojis/enojo.jpeg') if emotion == 'Sorpresa': image = cv2.imread('Emojis/sorpresa.jpeg') if emotion == 'Tristeza': image = cv2.imread('Emojis/tristeza.jpeg') return image # ----------- Métodos usados para el entrenamiento y lectura del modelo ---------- #method = 'EigenFaces' #method = 'FisherFaces' method = 'LBPH' if method == 'EigenFaces': emotion_recognizer = cv2.face.EigenFaceRecognizer_create() if method == 'FisherFaces': emotion_recognizer = cv2.face.FisherFaceRecognizer_create() if method == 'LBPH': emotion_recognizer = cv2.face.LBPHFaceRecognizer_create() emotion_recognizer.read('modelo'+method+'.xml') # -------------------------------------------------------------------------------- dataPath = '.../Reconocimiento Emociones/Data' #Cambia a la ruta donde hayas almacenado Data imagePaths = os.listdir(dataPath) print('imagePaths=',imagePaths) cap = cv2.VideoCapture(0,cv2.CAP_DSHOW) faceClassif = cv2.CascadeClassifier(cv2.data.haarcascades+'haarcascade_frontalface_default.xml') while True: ret,frame = cap.read() if ret == False: break gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) auxFrame = gray.copy() nFrame = cv2.hconcat([frame, np.zeros((480,300,3),dtype=np.uint8)]) faces = faceClassif.detectMultiScale(gray,1.3,5) for (x,y,w,h) in faces: rostro = auxFrame[y:y+h,x:x+w] rostro = cv2.resize(rostro,(150,150),interpolation= cv2.INTER_CUBIC) result = emotion_recognizer.predict(rostro) cv2.putText(frame,'{}'.format(result),(x,y-5),1,1.3,(255,255,0),1,cv2.LINE_AA) # EigenFaces if method == 'EigenFaces': if result[1] < 5700: cv2.putText(frame,'{}'.format(imagePaths[result[0]]),(x,y-25),2,1.1,(0,255,0),1,cv2.LINE_AA) cv2.rectangle(frame, (x,y),(x+w,y+h),(0,255,0),2) image = emotionImage(imagePaths[result[0]]) nFrame = cv2.hconcat([frame,image]) else: cv2.putText(frame,'No identificado',(x,y-20),2,0.8,(0,0,255),1,cv2.LINE_AA) cv2.rectangle(frame, (x,y),(x+w,y+h),(0,0,255),2) nFrame = cv2.hconcat([frame,np.zeros((480,300,3),dtype=np.uint8)]) # FisherFace if method == 'FisherFaces': if result[1] < 500: cv2.putText(frame,'{}'.format(imagePaths[result[0]]),(x,y-25),2,1.1,(0,255,0),1,cv2.LINE_AA) cv2.rectangle(frame, (x,y),(x+w,y+h),(0,255,0),2) image = emotionImage(imagePaths[result[0]]) nFrame = cv2.hconcat([frame,image]) else: cv2.putText(frame,'No identificado',(x,y-20),2,0.8,(0,0,255),1,cv2.LINE_AA) cv2.rectangle(frame, (x,y),(x+w,y+h),(0,0,255),2) nFrame = cv2.hconcat([frame,np.zeros((480,300,3),dtype=np.uint8)]) # LBPHFace if method == 'LBPH': if result[1] < 60: cv2.putText(frame,'{}'.format(imagePaths[result[0]]),(x,y-25),2,1.1,(0,255,0),1,cv2.LINE_AA) cv2.rectangle(frame, (x,y),(x+w,y+h),(0,255,0),2) image = emotionImage(imagePaths[result[0]]) nFrame = cv2.hconcat([frame,image]) else: cv2.putText(frame,'No identificado',(x,y-20),2,0.8,(0,0,255),1,cv2.LINE_AA) cv2.rectangle(frame, (x,y),(x+w,y+h),(0,0,255),2) nFrame = cv2.hconcat([frame,np.zeros((480,300,3),dtype=np.uint8)]) cv2.imshow('nFrame',nFrame) k = cv2.waitKey(1) if k == 27: break cap.release() cv2.destroyAllWindows()
Línea 1 a 3: Importamos OpenCV, os y numpy con un alias np.
Línea 5 a 11: Vamos a crear una función llamada emotionImage
, como parámetros tendremos a emotion
que puede ser felicidad, enojo, sorpresa o tristeza. Dependiendo de estos se visualizará un emoji diferente a la derecha de los fotogramas (en mi repositorio puedes encontrar estas imágenes).

Figura 5: Emojis que representarán la emoción desconocida.
- Línea 5: Definimos la función
emotionImage
, el parámetro de esta función esemotion
que corresponde a felicidad, enojo, sorpresa o tristeza. - Línea 7 a 10: Dependiendo de la emoción, se leerá la imagen de un emoji que se encuentra en la carpeta Emojis.
- Línea 11: Esta función devolverá la imagen correspondiente a la emoción reconocida.
Línea 14 a 22: Podemos escoger cualquiera de los métodos de la línea 14 a la 16, solo tendremos que descomentar uno y comentar los demás (claro que para probarlos debemos haber entrenado y guardado un modelo con estos métodos de reconocimiento). Dependiendo de dicho método se asignará a emotion_recognizer
cv2.face.EigenFaceRecognizer_create()
, cv2.face.FisherFaceRecognizer_create()
o cv2.face.LBPHFaceRecognizer_create()
. Finalmente en la lína 22 se lee el modelo correspondiente a EigenFaces, FisherFaces o LBPH previamente entrenado.
Línea 25 a 27: Especificamos la ruta del directptio ‘Data’, listamos todas carpetas contenidas en esta ubicación e imprimimos dicha lista.
Línea 29: Indicamos que vamos a realizar un video streaming.
Línea 31: Leemos el detector de rostros.
Línea 35 a 38: Se lee cada fotograma, se lo transforma a escala de grises y nos ayduamos de gray.copy()
para crear una copia limpia de cada fotograma.
Línea 40: Concatenamos dos imágenes, la primera frame
y la segunda será un área de color negro de 300 pixeles de ancho y 480 de alto que creamos con np.zeros
(usamos estas dimensiones, ya que son las mismas que posee cada imagen de los emojis).
Línea 42: En faces
se almacenan todos los rostros detectados.
Línea 44 a 49: Vamos a extraer la información de faces
en donde encontramos las coordenadas x, y, ancho y alto de cada rostro detectado. Recortamos los rostros de la imagen auxFrame
, redimensionamos dicho rostro a 150 x 150 pixeles y finalmente vamos a usar emotion_recognizer.predict
entre paréntesis el rostro recortado y redimensionado, que se almacenará en result
. Este valor se comparará con valores diferentes dependiendo de cada método empleado.
En la línea 49 visualizamos el valor obtenido de result
sobre el rostro detectado.
Línea 52 a 61: Vamos con el método EigenFaces. En la línea 53 comparamos el segundo valor almacenado en result
con 5700
(tomé el mismo valor que había usado en el post de reconocimiento facial, puedes cambiarlo de acuerdo a las pruebas que realices). Si este valor es menor a 5700
, quiere decir que se ha reconocido una emoción, por lo cual se visualiza el nombre de la emoción reconocida, además de un rectángulo verde que rodee el rostro de la persona. Mientras tanto en la línea 56 llamamos a la función emotionImage
, y a ella le entregamos imagePaths[result[0]]
que contiene el nombre de la emoción reconocida. En la línea 57, similar a la línea 40, concatenamos frame
e image
que es la imagen que contiene el emoticon.
Cuando result
es mayor a 5700
, no ha reconocido emociones por lo tanto en la línea 59 especificamos que se muestre el texto 'No identificado'
y se dibujará un rectágunlo rojo que rodee al rostro. En la línea 61 al igual que en la línea 40, concatenamos frame
y una el área en color negro.
Línea 64 a 85: El procedimiento que seguimos tanto para FisherFace como para LBPH es el mismo que en las líneas 52 a 61, la diferencia radica en el valor a comprar en las líneas 65 y 77.
Línea 87 a 93: Visualizamos nFrame
, especificamos que cuando se presione ‘ESC’ el proceso se detenga y finalmente cerramos todas las ventanas que se hayan usado para la visualización.
Resultados de EigenFaces en el reconocimiento de emociones
Tengo que resaltar, que los resultados que a continuación se muestran dependen de los rostros con los cuales se ha entrenado este reconocedor, además de que estoy probando en el mismo ambiente con el que capturé los rostros en un principio.

Figura 6: Pruebas realizadas del reconocimiento de emociones con EigenFaces.
Debo decir que en pruebas anteriores (en otro ambiente) que realicé con este método, no obtuve muy buenos resultados, sin embargo en esta ocasión al probarlo como puedes ver en la figura 6 nos fue muy bien.
Resultados de FisherFaces en el reconocimiento de emociones
Al igual que el método anterior tengo que resaltar, que los resultados que a continuación se muestran dependen de los rostros con los cuales se ha entrenado al reconocedor, además de que lo estoy probando en el mismo ambiente con el que capturé los rostros en un principio.

Figura 7: Pruebas realizadas del reconocimiento de emociones con FisherFaces.
Como puedes apreciar en la figura 7, no obtuvimos muy buenos resultados y como lo decía en el video, este resultado no fue lo que esperaba, ya que anteriormente con las pruebas que había realizado FisherFaces respondió bastante bien, incluso en el tiempo de respuesta. Por ello te recomiendo no omitir a este método, al contrario te recomiendo realizar más pruebas e incluso cambiar el valor que habíamos usado para comparar en la línea 65, ya que puede que obtengas mejores respuestas.
Resultados de Local Binary Pattern Histogram en el reconocimiento de emociones
Al igual que en los métodos anteriores tengo que resaltar, que los resultados que a continuación se muestran, dependen de los rostros con los cuales se ha entrenado al reconocedor, además de que lo estoy probando en el mismo ambiente con el que capturé los rostros en un principio.

Figura 8: Pruebas realizadas del reconocimiento de emociones con Local Binary Pattern Histogram.
Algo a resaltar con este método, es que en pruebas previas que había realizado en otros ambientes, este respondía bastante bien, y esta vez no fue la excepción, lo puedes apreciar en la figura 8 en la que ha podido reconocer las 4 emociones.
Y bien, esto ha sido todo por el tutorial de hoy, espero que te haya parecido interesante y que te haya gustado mucho, nos vemos en un siguiente post y/o video. 🙂
Hola,
muy buenos todos tus articulos! felicitaciones!
Estuve practicando un poco pero el entrenamiento me devuelve este error:
module ‘cv2.cv2’ has no attribute ‘face’
Sabrias decirme cual podria ser el motivo? o que podria verificar?
Gracias
Traceback (most recent call last):
File «C:\Users\martin\Desktop\reco\EntrenandoEmociones.py», line 37, in
obtenerModelo(‘EigenFaces’, facesData, labels)
File «C:\Users\martin\Desktop\reco\EntrenandoEmociones.py», line 8, in obtenerModelo
if method == ‘EigenFaces’: emotion_recognizer = cv2.face.EigenFaceRecognizer_create()
AttributeError: module ‘cv2.cv2’ has no attribute ‘face’
Perdon este es el error completo, gracias
Hola Martin, muchas gracias. Puede que tengas una versión diferente de OpenCV a la que yo realicé el código. Te recomiendo que imprimas help(cv2.face), para conocer como puedes llamar a estas funciones y realizar el reconocimiento.
Usa los siguientes comandos. Me sirvió.
pip uninstall opencv-contrib-python
pip install opencv-contrib-python –no-cache-dir
tengo el siguiente error
«line 22, in
emotion_recognizer.read(‘modeloFisherFaces.xml’)
cv2.error: OpenCV(4.3.0) C:\projects\opencv-python\opencv_contrib\modules\face\src\facerec.cpp:61: error: (-2:Unspecified error) File can’t be opened for reading! in function ‘cv::face::FaceRecognizer::read'»
lo que creo es que la version de opencv que instale no es la misma a la que se uso en el ejemplo, podrias decirme que version de opencv usas, gracias…
Hola Julian, para este tutorial usé OpenCV: 4.2
Hola Gaby, tengo una consulta sobre eso de la versión, es que he estado probando distintas a ver cual funciona, pero no he podido encontrar exactamente la de la 4.2, probé poniendo en el pip solo 4.2, luego con 4.2.0, y así, pero siempre me dice que no la encuentra, podrías decirme por favor cuál es exactamente la versión que estás utilizando, tipo «es la versión 4.2.34.14», y así, para poder instalarla y probarlo.
Gracias…
Hola Juan, a veces OpenCV retira o inhabilita ciertas versiones. Una pregunta, estás instalando con contrib o sin él. Puede que por allí vaya el problema, asegúrate de instalar con: pip install opencv-contrib-python
Disculpa, pudiste solucionar ese problema, tengo el mismo error :C
Hola buen dia, tengo un error con el cv2.hconcat, de antemano gracias
Hola Luis, qué error obtienes?
Hola, yo tengo Este error, no sé si podrias ayudarme :c, dice que el tamaño de las imagenes es 0 pixeles
Traceback (most recent call last):
emotion_recognizer.train(facesData, np.array(labels))
cv2.error: OpenCV(4.4.0) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-rwld3ghi\opencv_contrib\modules\face\src\eigen_faces.cpp:72: error: (-210:Unsupported format or combination of formats) In the Eigenfaces method all input samples (training images) must be of equal size! Expected 22500 pixels, but was 0 pixels. in function ‘cv::face::Eigenfaces::train’
Quiero creer que de igual manera es la versión
Hola Angel, si el código es el mismo creo que efectivamente puede ser la versión de OpenCV. Para el tutorial usé la versión 4.2!
Hola Angel, tengo el mismo problema, si se pudo resolver cambiando la versión de opencv?
Hola, Estuvo muy bueno el video. Debo presentar un proyecto en el curso de IA y me has dado una buena idea. ¿Podrías ayudarme enviando el código por favor? No me aparece en la descripción, Gracias.
Hola Katherine, muchas gracias. Puedes encontrar el código en este mismo post o en mi repo en github: https://github.com/GabySol/OmesTutorials2020
Hola felicidades, excelente aportación Me gustaría saber como lo implementarías en una Api, espero este video.
Hola Justin, no se me había ocurrido ?.
File «C:\Users\USER\Documents\scripts\Reconcimiento de emociones\reconciiento de emociones1.py», line 55, in
nFrame = cv2.hconcat([frame,image])
cv2.error: OpenCV(4.4.0) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-sxpsnzt6\opencv\modules\core\src\matrix_operations.cpp:68: error: (-215:Assertion failed) src[i].dims <= 2 && src[i].rows == src[0].rows && src[i].type() == src[0].type() in function 'cv::hconcat'
Hola yu, asegúrate de que tanto frame como image, tengan el mismo ancho.
Hola, yo tengo el mismo problema. ¿qué debo hacer?
Segui las indicaciones y funciona, el ancho debe coincidir de la imagenes de las emociones como el frame
Disculpa, ¿Como sabes el ancho del frame?
Hola buenas, podria explicar este punto mejor porfavor
Hola, muy bueno tu blog y tus videos en youtube, me gusta la manera en la que explicas. No se si alguna vez harias videos del uso reconocimiento del sonido en python.
Hola Nohely, muchas gracias! Por ahora me he enfocado en visión por computador, pero no descarto la idea de en algún momento aprender sobre reconocimiento de voz por ejemplo.
hola, quisiera sabe donde puedo encontrar las librearías; gracias.
File «E:\Hardy\cursos_2020\8CTAVO\PROCESAMIENTO_DE_SENALES\SEMANA_12_T2\PREGUNTA1\RECONOCIMIENTO DE EMOCIONES\capturandoRostros.py», line 3, in
import imutils
ModuleNotFoundError: No module named ‘imutils’
Hola David, puedes instalarla con pip install imutils.
Hola buenas!! Buenisimo tu blog, es de gran ayuda, realizando el codigo y usando LBPHFaceRecognize me salta el siguiente error a la hora de train:
Hago esto:
face_recognizer = cv2.face.LBPHFaceRecognizer_create() #esta linea funciona en una linea de ejecucion anterior independiente
Estas siguientes no:
# Entrenando el reconocedor de rostros
print(«Entrenando…»)
face_recognizer.train(facesData, np.array(labels))
Me salta este error:
Entrenando…
—————————————————————————
error Traceback (most recent call last)
in
1 # Entrenando el reconocedor de rostros
2 print(«Entrenando…»)
—-> 3 face_recognizer.train(facesData, np.array(labels))
error: OpenCV(4.4.0) /private/var/folders/nz/vv4_9tw56nv9k3tkvyszvwg80000gn/T/pip-req-build-7r9u7hyj/opencv/modules/core/src/matrix.cpp:235: error: (-215:Assertion failed) s >= 0 in function ‘setSize’
Hola Maria, muchas gracias. 🙂 No estoy segura porque te puede estar dando ese error. Puede ser tal vez que no se tenga datos en ‘facesData’ o ‘labels’, o que tal vez no sean el mismo número de datos. Otra cosita que se me ocurre que puede ser es la versión de OpenCV, si mal no me equivoco para este tutorial usé la 4.2 (puedes revisarla en la descripción del videotutorial: https://youtu.be/cZkpaL36fW4 ). Muchos saluditos!
Buenas, para la ejecucion de tu codigo debe ser la misma version de Opencv de lo contrario no ejecutaria el programa, es que algunos de los errores que se mencionan en los otros comentarios me aparecen el codigo es el mismo tuyo copia y pega xD para hacer las pruebas
Me salió el siguiente error:
AttributeError: module ‘cv2.cv2’ has no attribute ‘face’
Tengo la versión de Open CV 4.5.1
Gracias de antelación
Hola Eduardo, asegúrate de haber instalado OpenCV con contrib.
Hola! Muy bueno el blog. Disculpa como podría hacer para que no aparezca la etiqueta de la imagen al momento de reconocer la emoción? y únicamente aparezca el valor de referencia
Muchas gracias Jorge, puedes comentar la línea (cv2.putText) correspondiente a la visualización de ese texto en la imagen.
hola sobre reconocimiento de emociones
me sale asi y aya nose que hacer, nome salen los emojis
image.png
image.png
me marca que tengo error en la linea 12 y en la 78
image.png
image.png
OJALA ME PUEDAS AYUDAR GABY
GRACIAS
TE MANDE CORREO POR SI NO SE VE LAS IMAGENES
Hola, muy buen tutorial, te consulto, si por ejemplo grabo mis emociones, eso me sirve para detectar emociones de otros rostros?
Hola Víctor, sería mejor si utilizas los rostros de otras personas también sino puede que no generalice bien.
Hola Gabriela,
Hice el ejercicio que propones y super bien todo.
Me gustaría saber si existe algún modelo preentrenado para que funcione para cualquier rostro que se reconozca las emociones?
Muchas gracias
Hola Uriel, no lo he probado pero échale un ojo a este módulo: https://github.com/justinshenk/fer
Hola que tipo de camara usas o cual recomiendas. Mi camara internn veo distorcionada la imagen saludos
Hola Gabriela,
vieras que su ejemplo me estuvo funcionando muy bien, pero se me actualizó el openCV, y en el codigo de entrenamiento, me está dando este error en la linea 40.
nFrame = cv2.hconcat([frame, np.zeros((480,300,3),dtype=np.uint8)])
me da este error:
File «D:\IA\3.ReconocimientoEmociones.py», line 40, in
nFrame = cv2.hconcat([frame, np.zeros((480,300,3),dtype=np.uint8)])
error: OpenCV(4.0.1) C:\ci\opencv-suite_1573470242804\work\modules\core\src\matrix_operations.cpp:68: error: (-215:Assertion failed) src[i].dims <= 2 && src[i].rows == src[0].rows && src[i].type() == src[0].type() in function 'cv::hconcat'
Alguna idea de como arreglarlo, porque antes me funcionaba muy bien.
Hola Uriel, puede que no se esté leyendo correctamente la imagen. Prueba visualizándola en primer lugar para descartar que pueda ser eso.
Hola,
gracias por tu respuesta, ya supe que es el problema, resulta que le compré una webcam a mi computadora portatil y al parecer la webcam y la camara interna del la portatil dan conflicto por lo que genera ese error, básicamente lo que hice fue desconectar la webcam y solo trabajar con la camara integrada de la portatil y listo se solventó el problema.
error: OpenCV(4.0.1) C:\ci\opencv-suite_1573470242804\work\modules\core\src\matrix_operations.cpp:68: error: (-215:Assertion failed) src[i].dims <= 2 && src[i].rows == src[0].rows && src[i].type() == src[0].type() in function 'cv::hconcat'
Hola buen articulo.
¿Que clase de cámara usas para el dataset de imágenes?
Hola Mark, uso una webcam. 🙂
Hola, al querer poner las imagenes me dice este error
line 27, in
nFrame = cv2.hconcat([frame, np.zeros((300,300,3),dtype=np.uint8)])
AttributeError: module ‘imutils’ has no attribute ‘zeros’
Hola Noemi, puedes comentar la línea donde usas imutils? Por favor. 🙂
Hola, espero estés bien. Tu trabajo me ha servido mucho para un proyecto de la Universidad.
Quisiera saber como puedo citarte en mi trabajo por favor.
Saludos.
Hola, espero estés bien. Tu trabajo me ha servido mucho para un proyecto de la Universidad.
Quisiera saber como puedo citarte en mi trabajo por favor.
Saludos.
estoy iniciando en esto, al correr el codigo, no hace nada 🙁
Hola que tal, tengo un pequeño problema
line 68, in
nFrame = cv2.hconcat([frame,image])
cv2.error: OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-5rb_9df3\opencv\modules\core\src\matrix_operations.cpp:68: error: (-215:Assertion failed) src[i].dims <= 2 && src[i].rows == src[0].rows && src[i].type() == src[0].type() in function 'cv::hconcat'
podrian ayudarme con este error por favor
imagePaths= [‘Enojo’, ‘Felicidad’, ‘Sorpresa’, ‘Tristeza’]
Traceback (most recent call last):
File «C:/Users/PC CASA/Desktop/Reconocimiento Emociones/reconoc_Emociones.py», line 67, in
nFrame = cv2.hconcat([frame,image])
cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\core\src\matrix_operations.cpp:67: error: (-215:Assertion failed) src[i].dims <= 2 && src[i].rows == src[0].rows && src[i].type() == src[0].type() in function 'cv::hconcat'
Hola Gaby, al correr el programa no genera los tres archivos .xml, que `puede estar pasando?
Saludos
buenas noches señorita hermosa, saludos desde colombia
tengo una duda, no se por que a la hora de ejecutar no reconoce mis emociones y solo me aparece el cuadro rojo y el letrero de desconocido….. me podrias indicar por que?
Hola !! es muyy interesanteee esto, estoy buscando como gestionar fotografias, para ello preciso que el soft reconozca rostros y objetos, (comolo hacia picasa) y pueda escribir esa info en lso metadatos del archivo… SABES POR DONDE PUEDO INVESTIGAR ?
Haces un trabajo excelente Gaby, gracias por ayudarnos tanto y explicar de manera tan entendible. Me inspiras commo mujer desarrolladora de software. <3
Hola Omes, tengo un problema ¿los archivos no cargar de eingfaces y demas no cargar directamente en el carpeta propuesta en el tutorial? , la envia directamente al disco C. Podrias explicarme un poco.