Sugerencias ... Si buscas algún código de programación en especifico , solo escribe alguna palabra relacionada , como por ejemplo : Calculadora , Metodo , Burbuja , Applets ... etc

Buscar

Este es un proyecto Titulado EyeTracking desarrollado en OpenCV enfocado para la gente que presenta alguna discapacidad física , en donde el principal objetivo que tiene este sistema es poder controlar el sistema operativo de una computadora por medio de los movimientos corporales de la región ocular por medio de la detección de patrones como Rostros y Regiones oculares.

El proyecto aun está en su fase de desarrollo , terminado en un 80 % , los avances que sean desarrollados es la detección del rostro del usuario , la detección la parte ocular , el tracking de la región ocular y la interpretación de coordenadas , aunque este último presenta algunos problemas en la calibración de las resoluciones entre cámara web y resolución de la pantalla del PC.

C++:
  1. // Librerias ...
  2. #include "stdafx.h"
  3. #include <stdio.h>
  4. #include "cv.h"
  5. #include "highgui.h"
  6.  
  7. #define  TPL_WIDTH     25
  8. #define  TPL_HEIGHT   25
  9. #define  WINDOW_WIDTH   50
  10. #define  WINDOW_HEIGHT   50
  11. #define  THRESHOLD   0.3
  12.  
  13. // ++++++++++++++++++++++++++ Variables Globales ++++++++++++++++++++++++++++
  14.        
  15.         // Cascada de Clasificacion de Rostros
  16.         CvHaarClassifierCascade *cascade_f;
  17.         CvHaarClassifierCascade *cascade_e;
  18.        
  19.         // Almacenamiento de Memoria
  20.         CvMemStorage *storage;
  21.         CvRect *r;
  22.  
  23.         // Variables para la construccion de imagenes.
  24.         IplImage *frame , *window , *tpl , *tm , *wimdow;
  25.         int is_tracking = 0, x = 0 , y = 0;
  26.         
  27.         // Valores de posicion tpl
  28.         CvPoint minloc, maxloc;
  29.         double  minval, maxval;
  30.         int object_x0 ,  object_y0;
  31.         
  32.         // Variable para almacenamiento de resultados.
  33.         CvSeq* faces;
  34.  
  35. // Declaracion de Metodos
  36. void detectFaces();
  37. void Track();
  38. // +++++++++++++++++++++++++++ Metodo Principal +++++++++++++++++++++++++++++
  39. int main( int argc, char** argv ) {
  40. // Inicializacion de Componentes --------------------------------------
  41.    
  42.     // Archivos de cascada de caracteristicas para ...
  43.     char *file1 = "haarcascade_frontalface_alt.xml";
  44.     char *file2 = "haarcascade_eye.xml"; // Deteteccion de Ojos
  45.    
  46.     // Cargar Clasificador de Rostros
  47.     cascade_f = (CvHaarClassifierCascade*)cvLoad(file1, 0, 0, 0);
  48.     cascade_e = (CvHaarClassifierCascade*)cvLoad(file2, 0, 0, 0);
  49.    
  50.     // Inicializar el Modulo de Memoria, Necesario para el Detector de Rostros
  51.     storage = cvCreateMemStorage(0);
  52.  
  53.     // Creamos una Ventana , con el nombre de "Video"
  54.    cvNamedWindow( "Video", CV_WINDOW_AUTOSIZE ); // Con el Tamaño Automatico del Video
  55.    cvNamedWindow( "Face", CV_WINDOW_AUTOSIZE ); // Con el Tamaño Automatico del Video
  56.    cvNamedWindow( "Eye", CV_WINDOW_AUTOSIZE ); // Con el Tamaño Automatico del Video
  57.    // Iniciamos el Dispositivo de Captura de Video  ,
  58.    CvCapture* capture = cvCreateCameraCapture(0);
  59.  
  60.     cvWaitKey(33);
  61.  
  62.     frame = cvQueryFrame( capture );
  63.     if ( !frame ) return 1;
  64.    
  65.     tpl = cvCreateImage( cvSize( TPL_WIDTH, TPL_HEIGHT ),
  66.                          frame->depth, frame->nChannels );
  67.    
  68.  
  69.     tm = cvCreateImage( cvSize( WINDOW_WIDTH  - TPL_WIDTH  + 1,
  70.                                 WINDOW_HEIGHT - TPL_HEIGHT + 1 ),
  71.                         IPL_DEPTH_32F, 1 );
  72.  
  73.  
  74. //-----------------------------------------------------------------------
  75.    // Ciclo Infinito para poder optener imagenes en tiempo real.
  76.  
  77.    
  78.     while(1) {
  79.       frame = cvQueryFrame( capture ); // Obtenemos Frame desde el Buffer de Video
  80.       if( !frame ) break; // Si no Obtenemos Frame , Entonces Finalizamos el Ciclo
  81.       if (is_tracking) {
  82.           Track();
  83.       } else {
  84.         detectFaces();
  85.       }
  86.       cvShowImage( "Video", frame ); // Desplegamos la Imagen en Pantalla
  87.       // Esperamos 33 milesimas de Segundo , si el usuario presiona alguna Tecla
  88.       char c = cvWaitKey(33);
  89.       if( c == 27 ) break; // Si se Preciono la Tecla ESC entonces se rompe el Ciclo
  90.    }
  91.    // Liberar Memoria
  92.    cvReleaseImage( &frame );
  93.    cvDestroyWindow( "Video" );
  94. } // fin del metodo principal
  95. // ++++++++++++++++++++++++++++++++++++++
  96. void detectFaces() {
  97.  
  98. // Creamos imagen region
  99. IplImage *Region = cvCreateImage(cvGetSize(frame),frame->depth,frame->nChannels);
  100. cvCopy(frame,Region,NULL);
  101.    
  102.    
  103. //(1) Deteccion de rostros por medio del detector.
  104. faces = cvHaarDetectObjects( frame, cascade_f, storage,
  105. 1.1, 3, 0, cvSize(40, 40) );
  106. printf( "Rostros Encontrados : %i \n", faces->total );
  107.  
  108.  
  109.  
  110. if (faces->total> 0) {
  111.         //(2) Obtener Region del rostro.
  112.         r = (CvRect*)cvGetSeqElem(faces, 0);
  113.         printf( "Dimencion del Rostro Antes : w = %i , h = %i \n", r->width  , r->height);
  114.        
  115.         //(3) Dibujar un Rectangulo sobre el Rostro.
  116.         cvRectangle(Region,
  117.             cvPoint(r->x, r->y),
  118.             cvPoint(r->x + r->width, r->y + r->height),
  119.             CV_RGB(255, 0, 0), 1, 8, 0);
  120.  
  121.         //(4) Modificar Imagen al tamaño del rostro
  122.         cvSetImageROI(frame,*r);
  123.         cvClearMemStorage(storage);
  124.  
  125.         //(5) Salida de la posicion del rostro
  126.         printf( "Posicion Rostro (%i,%i) \n", r->x , r->y );
  127.  
  128.         x = r->x;
  129.         y = r->y;
  130.  
  131.  
  132.         //(6) Deteccion de la region ocular
  133.         CvSeq* eyes = cvHaarDetectObjects(
  134.         frame, cascade_e, storage,
  135.         1.15, 3, 0, cvSize(25, 15));
  136.        
  137.         //(7)Obtenemos region y pintamos region.
  138.         r = (CvRect*)cvGetSeqElem( eyes, 0 );
  139.         cvRectangle(frame,
  140.                     cvPoint(r->x, r->y),
  141.                     cvPoint(r->x + r->width, r->y + r->height),
  142.                     CV_RGB(0, 0, 255), 2, 8, 0);
  143.        
  144.         cvShowImage( "Eye", frame );
  145.         printf( "Posicion Eye (%i,%i) \n", r->x , r->y );
  146.  
  147.         // Obtener coordenadas
  148.         x = x + r->x;
  149.         y = y + r->y;
  150.  
  151.         printf( "Dimension del Region1 (%i,%i) \n", Region->width , Region->height );
  152.         printf( "Posicion de la region1 (%i,%i) \n", x , y );
  153. // -------------------------------------------------------------------------------------   
  154.  
  155.         object_x0 = x;
  156.         object_y0 = y;
  157.  
  158.        
  159.         printf( "Posicion Mouse(%i,%i) \n", object_x0 , object_y0 );
  160.        
  161.         cvSetImageROI( Region,
  162.                        cvRect( object_x0,
  163.                                object_y0,
  164.                                TPL_WIDTH,
  165.                                TPL_HEIGHT ) );
  166.        
  167.         printf( "Dimension del Frame2 (%i,%i) \n", frame->width , frame->height );
  168.         cvCopy( Region, tpl, NULL );
  169.         cvShowImage("Face" , tpl);
  170.        
  171.         fprintf( stdout, "Region Ocular encontrada. \n" );
  172.  
  173. // -------------------------------------------------------------------------------------
  174.  
  175.     is_tracking = 1;
  176.         // Limpiamos Memoria
  177.         cvClearMemStorage(storage);
  178.     } else {
  179.         return;
  180.     } // fin del if
  181. }
  182.  
  183. void Track() {
  184.  
  185.     // Determinamos la posicion del puntero sobre la ventana principal.
  186.     int win_x0 = object_x0 - ( ( WINDOW_WIDTH  - TPL_WIDTH  ) / 2 );
  187.     int win_y0 = object_y0 - ( ( WINDOW_HEIGHT - TPL_HEIGHT ) / 2 );
  188.    
  189.     //printf( "Posicion Track(%i,%i) \n", win_x0 , win_y0 );
  190.    
  191.     SetCursorPos(frame->width - win_x0 , win_y0 );
  192.     if (win_x0> frame->width - WINDOW_WIDTH)
  193.         win_x0 = frame->width - WINDOW_WIDTH;
  194.     if (win_x0 <0)
  195.         win_x0 = 0;
  196.     if (win_y0 <0)
  197.         win_y0 = 0;
  198.     if (win_y0> frame->height - WINDOW_HEIGHT)
  199.         win_y0 = frame->height - WINDOW_HEIGHT;
  200.    
  201.     // Buscamos Region en la ventana
  202.     cvSetImageROI( frame,
  203.                    cvRect( win_x0,
  204.                            win_y0,
  205.                            WINDOW_WIDTH,
  206.                            WINDOW_HEIGHT ) );
  207.     cvMatchTemplate( frame, tpl, tm, CV_TM_SQDIFF_NORMED );
  208.     cvMinMaxLoc( tm, &minval, &maxval, &minloc, &maxloc, 0 );
  209.     cvResetImageROI( frame );
  210.    
  211.     // Si el objeto se encontro ...
  212.     if( minval <= THRESHOLD ) {
  213.  
  214.         // Guardar posicion actual de la region objetivo
  215.         object_x0 = win_x0 + minloc.x;
  216.         object_y0 = win_y0 + minloc.y;
  217.        
  218.         // Dibujamos region
  219.         cvRectangle( frame,
  220.                      cvPoint( object_x0, object_y0 ),
  221.                      cvPoint( object_x0 + TPL_WIDTH,
  222.                               object_y0 + TPL_HEIGHT ),
  223.                      cvScalar( 0, 0, 255, 0 ), 1, 0, 0 );
  224.     } else {
  225.        
  226.         // De lo contrario desplegar mensaje ...
  227.         fprintf( stdout, "Objeto Perdido \n" );
  228.         is_tracking = 0;
  229.     }
  230. }


Publicado en C y C++, Codes, General, Noticias



 Deja un comentario