Detector de ojos

Una vez hemos detectado un rostro con opencv quizás nos interesa la detección de ojos, opencv cuenta con clasificadores en cascada entrenados para la detección de ojos, podemos detectar los ojos cerrados o abiertos.

Clasificadores para detectar ojos abiertos o cerrados:
haarcascade_mcs_lefteye.xml, haarcascade_mcs_righteye.xml
haarcascade_lefteye_2splits.xml, haarcascade_righteye_2splits.xml

Clasificadores que detectan ojos abiertos:
haarcascade_eye.xml
haarcascade_eye_tree_eyeglasses.xml

Para que la detección de ojos funcione correctamente debemos definir una región de búsqueda que no es más que una porción de la imagen donde deseamos detectar el ojo, si ya tenemos la región que contiene el rostro (mira detección de rostros) podemos usar estos valores para determinar la región correspondiente para cada clasificador:

Clasificador
EYE_SX
EYE_SY
EYE_SW
EYE_SH
haarcascade_eye.xml
0.16
0.26
0.30
0.28
haarcascade_mcs_lefteye.xml
0.10
0.19
0.40
0.36
haarcascade_lefteye_2splits.xml
0.12
0.17
0.37
0.36

Veamos como extraer los rectángulos que contienen la región para los ojos izquierdo y derecho, ya que debemos usar un detector diferente para el ojo izquierdo y derecho, este código extrae las regiones  para ambos ojos:

int leftX = cvRound(face.cols * EYE_SX);
int topY = cvRound(face.rows * EYE_SY);
int widthX = cvRound(face.cols * EYE_SW);
int heightY = cvRound(face.rows * EYE_SH);
int rightX = cvRound(face.cols * (1.0-EYE_SX-EYE_SW));

Mat topLeftOfFace = faceImg(Rect(leftX, topY, widthX,heightY));
Mat topRightOfFace = faceImg(Rect(rightX, topY, widthX,heightY));


Comentarios

  1. Estimado
    Como con el codigo que proporcionaste se puede puede encontrar el centro del ojo?

    Saludos

    ResponderEliminar
    Respuestas
    1. Este código es bastante simple solo muestra el funcionamiento de los detectores, más adelante profundizare el la detección de ojos.

      Eliminar
  2. Gracias por el aporte, estuve tratando de correr este codigo en vs c++ 2010 express y me salen dos errores
    main.cpp(30): error C2143: error de sintaxis : falta ',' delante de ':'
    main.cpp(31): error C2143: error de sintaxis : falta ';' delante de '{'

    Si pudieras ayudarme a resolver este error mil gracias

    ResponderEliminar
    Respuestas
    1. Ocurre que VS-10 no admite C++ 11 por lo que deberás cambiar el for in de la linea 30. De este modo:

      for(int i = 0; i < rect.size(); i++)
      {
      rectangle(imagen,
      Point(rect[i].x, rect[i].y),
      Point(rect[i].x + rect[i].width, rect[i].y + rect[i].height),
      CV_RGB(0,255,0), 2);
      }

      Eliminar
  3. hola, el programa no me quiere correr y muestra todo tipos de errores, tengo visual studio 2013 express y creo que ese es el problema. puedo saber en qué version lo estas simulando y qué version de opencv usas? tambn lo simulé en Dev c++ y me da error en using namespace cv, y tambien en en #include me gustaria que corriera bien me es interesante y tiene muchas aplicaciones, espero su ayuda, gracias.

    ResponderEliminar
  4. * " y tambien en en #include < opencv2 \ opencv. hpp >"

    ResponderEliminar
    Respuestas
    1. Uso la versión 2.4.6 en vs 2012 Profesional.
      Puede ser que hayas instalado opencv de manera incorrecta, mira:

      http://acodigo.blogspot.com/2013/05/instalar-opencv-para-python-en-windows.html

      Eliminar
  5. broter no me detecta los ojos correctamente solo indica posiciones extraviadas me podrias auxiliar?

    ResponderEliminar
  6. Alguien que me pueda ayudar con ese código pero en python. Por favor

    ResponderEliminar
  7. Hola! una pregunta. la región de búsqueda de ojos, de donde sacaste esos valores? estan en la documentacion de OpenCV? Gracias!

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Detección de figuras geométricas