Media center para Rasberry Pi 2


Raspberry Pi 2 Model B - Placa base (ARM Quad-Core 900 MHz, 1 GB RAM, 4 x USB, HDMI, RJ-45)

OSMC es una versión renovada de Raspbmc, el media center con Kodi / XBMC especial para Raspberry Pi 2 Model B – Placa base (ARM Quad-Core 900 MHz, 1 GB RAM, 4 x USB, HDMI, RJ-45)
  basado en Debian 8.1

O S M C   viene de Open Source Media Center  de modo   que se ve claramente que estamos ante  un reproductor multimedia de código libre y abierto basado en Linux   que le permite reproducir archivos multimedia de su red local, unidades de almacenamiento de red y por supuesto desde Internet.

En términos de open source  es  un centro multimedia de los mas completos  en términos de conjuntos de características ( y de comunidad alrededor del proyecto)   y se basa en el proyecto Kodi por lo que la integración es total con éste ( y por supuesto se  pueden añadir addons ).

Aunque OSMC está basado en Linux, usted no necesita tener ninguna experiencia con Linux  para conseguirlo en funcionamiento,pues todo se gestiona fácilmente a través de la interfaz OSMC aunque  también sirve para  aquellos que quieren retocarlo pues ponen  a disposición de los repositorios   completos de Debian (que generarán más de 30.000 paquetes)

No es sólo gratis ,también es libre de hacer lo que quiera con el software(es de código abierto y libre) estando  disponible bajo la versión 2 de la GPL( es decir cualquier persona es libre de utilizar OSMC y su código, pero en caso de que realice algún cambio,  debe contribuir de nuevo al proyecto OSMC).
Este media center  puede reproducir todos los principales formatos  multimedia  pero ademas  es compatible con una variedad de protocolos de intercambio por lo que está garantizado que sea capaz de transmitir desde otros dispositivos .Ademas,  por si fuera poco, OSMC puede transmitir contenido multimedia y servir archivos a otros dispositivos  usando DLNA.

En las ultima versión se ha solucionado  algunos bugs  o errores  por lo  que es muy destacable el funcionamiento fluido  y muy  rapido  reproduciendo vídeo   al menos en una   Raspberry Pi 2 Model B – Placa base (ARM Quad-Core 900 MHz, 1 GB RAM, 4 x USB, HDMI, RJ-45)    con la que se ha podido probar su funcionamiento.

 

Algunas cosas  que han mejorado por ejemplo son las siguintes:

  • Corregidos errores de :
    • Compartir archivos con Samba
    • Cambiar configuración del mando a distancia desde el menú My OSMC
    • Instalar Apps desde el menú My OSMC sin errores
    • Evitar abrir el CD/DVD mientras se reproduce
    • Montar imágenes de tipo ISO o UDF
    • Calibración de la pantalla
    • Pérdida del Wi-Fi después de actualizar
  • Mejorada la selección y configuración de las redes Wi-Fi disponibles
  • Mejora de la información de las actualizaciones
  • Mejor soporte de mandos a distancia especiales como el RC6 MCE, Apple TV y los de Xbox
  • Mejora del rendimiento con la Raspberry Pi 2 usando su propia librería acelerada
  • Rediseño de los menús de OSMCen cuanto a colores y soporte de ratón
  • Mejora de los tiempos de acceso a unidades USB

Además se ha publicado una completa descripción del plan de actualizaciones:

  • Actualizaciones mensuales con correcciones de errores, mejoras y novedades.
  • Actualizaciones de seguridad prioritarias y en el menor tiempo posible.
  • Además de actualizar desde el menú de OSMC se podrá hacer vía terminal con los comandos normales:
    • sudo apt-get update
    • sudo apt-get dist-upgrade
  • Actualizaciones de Kodi cada vez que estén disponibles y probadas con OSMC

 

Respecto a la instalación del sw, como vamos  a ver ,sus creadores están  orgullosos de que se  pueda instalar OSMC en una gran variedad de dispositivos  como son  Raspberry Pi(1,2,3 y zero),Vero  y Apple TV (primera generación) en sólo cuestión de minutos. Precisamente el  instalador   que facilitan  ,  es lo que separa OSMC de otros productos de centros de medios de comunicación disponibles.

Ademas tambien, como otros productos, permite recibir actualizaciones periódicas que  puede elegir cuándo  y por supuesto si le gustaría instalar actualizaciones

Una peculiaridad es  que incluso cuenta con una  tienda de aplicaciones  que permite la instalación de nuevas aplicaciones de  manera totalmente  gratuita como por ejemplo obtener un cliente de torrent, navegador web y sintonizador de TV  ( todas estas apps  son  muy fácil obtenerlas  en cuestión de segundos  y ademas  incluso desde su control remoto).

 

Pasos para la instalación 
portal somc

 

OSMC es bien conocido por su facilidad de instalación . Para empezar , sólo tiene que seleccionar el sistema operativo actual para descargar el instalador dispositivo,lo cual  le permitirá directamente crear una imagen de arranque para cualquier OSMC dispositivo compatible.

Por tanto para instalar  OSMC ,lo primero es descargar  el instalador   en función del ordenador  donde   se va a instalar, siguiendo   los siguientes enlaces:

  • Windows XP SP2 +
  • OS X 10.07 +
  • Linux
 Una vez que tenga descargado el software en su ordenador en función del sistema operativo ,lo primero es descomprimir el fichero y ejecutar el fichero  ejecutable ( qt_host_installer.exe) proceso que se realizara directamente simplemente abriendo el fichero que se ha descargado :osmc-installer.exe 
La primera pantalla sera similar a la siguiente:

osmc
El instalador solo esta disponible en idioma ingles( que tendría que seleccionar) y también tendría que seleccionar el tipo de Raspberry  ( en nuestro caso  Raspberry Pi 2 )

osmc2

Ahora tendrá que seleccionar la versión de OSMC ,para  lo cual  lo recomendable es elegir la ultima versión disponible ( en el menú es la primer opción)
osmmc3

Ahora ya debemos insertar la micro-sd  con la que  arrancara la Raspberry Pi 2 Model    y seleccionar la opción de «on a SD card»    y darle a la opción de  siguiente para terminar el proceso

on sd

Por supuesto una vez terminado el instalador  extraeremos la micro-sd del lector de nuestro ordenador  ,la  insertaremos en nuestra Raspberry  y conectaremos  su cargador, y esperaremos  hasta que complete  el proceso de instalación .

 

Los creadores  de  OSMC  también ha puesto a libre disposición ,si lo prefiere,  la opción de descargar la imagen  directamente para cargarla en la sd usando los siguientes enlaces:

 

Raspberry Pi 1 / Zero

Release Checksum (MD5)
2016.02-2 78ad4d4f3bc7004061054a4fc26fb667
2016.01-1 05d20733dcc6cd1ff45dc6ece28ea557
2015.12-4 72b9e314431766044eb5d771ae1f21ae
2015.11-1 d5c0805022f67e3d17152ff69e693ed6
2015.10-1 49295615e9d81e9dab7e40539f0c6fdc
2015.08-1 4190c18baa875ffa2629d41d24346ae1
2015.07-1 9ccf219b5cf18b18ad20e54822fde7cf
2015.06-1 41fc8561d9487c210de73d42e8bae65f

Raspberry Pi 2 / 3

Release Checksum (MD5)
2016.02-2 204a2dadfef3ca21efb774a7f56582e1
2016.01-1 c956b4cdac4a593368f60eb0742faa7f
2015.12-4 1fd6d5751c1f0426af1956de6c496d78
2015.11-1 c22e321c714bd78c5978f6d6294ceb66
2015.10-1 b2839349c456de61b2921c0dfcd7dd43
2015.08-1 a09e11ec4d34dc992e9869997b69e570
2015.07-1 d28704569f64902b5fe6ea0272a3d874
2015.06-1 0f95e83ab81e9419166206e5e3bba1dc

Vero

Release Checksum (MD5)
2016.02-2 c93eafebd8dbd1d177c42eaed52e30c6
2016.01-1 e9ae3b59dd3b31ed8c717c98e2d980fd
2015.12-4 3c5d5fcdec906170736174bbb04da733
2015.11-1 c49ead38894b82e80a91ccaeb85893fd
2015.10-1 9c7ce1c243d280d9f74f5a550e5c6333
2015.08-1 6a2e73db742debd59439260670534349
2015.07-1 a66420b33773646778d92ea3e46fc389
2015.06-1 9291631c728c11dc657b26c3fa91c001

Vero 2

Release Checksum (MD5)
2016.02-2 1710a51e76a53086cbf5b7aab2a34cb8
2016.01-1 6e3bc7be1b33648c670a5a22115c1eb7

Apple TV 1

Release Checksum (MD5)
2016.02-2-USB 75c9e4683c3629bfc76c61fba4a7983e
2016.01-1-USB 0074adbe9dec64d80b2d2ad8d3614903
2016.02-2-HDD 7b1bb8ae566ad549e4ee498e5d98797d
2016.01-1-HDD a5809099ba8f19836e83abff56eeccf6
2015.12-4-HDD 4431de73552bdd9f58f52ef0279d4d78
2015.12-4-USB 216e9ac76939701043dd0105a7b87310
2015.10-2-USB c9a710b10ca31f7f7243b1d0ba33f3de

 

 

Mas información en el site oficial

TrackEye: Seguimiento en tiempo real de los ojos humanos utilizando una cámara web


 Los ojos son las características más importantes de la cara humana,así que el uso eficaz de los movimientos de los ojos como una técnica de comunicación en las interfaces de usuario a la computadora puede encontrar lugar en diversas áreas de aplicación.El seguimiento de los ojos y la información proporcionada por las características de los ojos tienen el potencial de convertirse en una interesante manera de comunicarse con un ordenador en un sistema de interacción persona-ordenador (HCI). Así que con esta motivación, el diseño de un software en tiempo real de seguimiento característica del ojo es el objetivo de este proyecto.

El propósito del proyecto lideraado por zafersavas,   y publicado en CodeProject es implementar un tiempo real eye tracker-función con las siguientes capacidades:

  • Cara en tiempo real el seguimiento con la escala y la rotación invariante
  • Seguimiento de las áreas de ojos individual
  • Seguimiento características oculares
  • Ojo dirección de la mirada hallazgo
  • Control remoto mediante movimientos oculares

La segunda versión de TrackEye soporta:

  • Dos algoritmos de detección de rostros diferentes: Haar Face Tracking y CAMSHIFT
  • Dos algoritmos de detección de ojos diferentes:  Análisis de Componentes Principales Adaptativo   y comparación de plantillas
  • Algoritmos de seguimiento pueden ser seleccionados por el usuario al comienzo del proceso a través de GUI.
  • Fuente de entrada seleccionable: Cámara Web o   Archivo de vídeo

 Tenga en cuenta que TrackEye fue escrito con OpenCV Biblioteca v3.1, así que asegúrese de usar durante la reconstrucción.

Instrucciones para ejecutar y reconstruir TrackEye

A continuación los links  del ejecutable  ,así como el codigo fuente para el seguimiento en tiempo real de los ojos humanos en las secuencias de vídeo de Interacción Persona-Ordenador utilizando una cámara web:
  • Descargar ejecutable – 2,51 MB
  • Descargar el código fuente – 199.24 KB

Instrucciones De Instalación

  1. Extraer archivo TrackEye_Executable.zip. Antes de ejecutar TrackEye_636.exe, copie los dos archivosSampleHUE.jpg y SampleEye.jpg a la carpeta C: \. Estos dos archivos se utilizan para los algoritmos CAMSHIFT y Plantilla-juego.
  2. No hay otros pasos a seguir por el usuario para ejecutar el software. No hay dependencias DLL como el software fue construido con las DLL estáticamente incluidos.

Ajustes por hacer para realizar una buena Seguimiento

Ajustes de Detección de la cara y de los ojos

Bajo TrackEye Menú -> Configuración de Tracker

  • Fuente de entrada: Video
  • Haga clic en Seleccionar archivo y seleccionar .. \ Avis \ sample.avi
  • Cara algoritmo de detección: Haar algoritmo de detección de rostros
  • Marque «Track también Eyes» checkBox
  • Ojo algoritmo de detección: Adaptativo PCA
  • Desactive la opción «Comprobar Diferencia»
  • Número de la base de datos de archivo: 8
  • Número de EigenEyes: 5
  • La distancia máxima permitida desde eyespace: 1200
  • Rostro ancho / ojo anchura plantilla: 0.3
  • ColorSpace tipo para utilizar durante PCA: CV_RGB2GRAY

Configuraciones para detección del Alumno

Compruebe «ojos de pista en los detalles» y luego seleccione «Detectar también pupilas». Haga clic en el botón «Parámetros de Ajuste»:

  • Introduzca «120» como el «Valor Umbral»
  • Haga clic en «Guardar configuración» y luego haga clic en «Cerrar»

Ajustes para la serpiente

Marque «Indique ojo límite utilizando serpientes activos». Haga clic en «Configuración de la serpiente» botón:

  • Seleccione ColorSpace de usar: CV_RGB2GRAY
  • Seleccione umbralización simple e introduzca 100 como el «Valor umbral»
  • Haga clic en «Guardar configuración» y luego haga clic en «Cerrar»

Fondo

Hasta ahora no ha habido mucho trabajo en la detección de ojos y antes de que el proyecto, los métodos anteriores se estudiaron cuidadosamente para determinar el método aplicado. Podemos clasificar los estudios relacionados con el ojo en dos categorías principales que se enumeran a continuación:

Enfoques basados ​​Equipo Especial

Este tipo de estudios de usar el equipo necesario que le dará una señal de algún tipo que es proporcional a la posición del ojo en la órbita. Varios métodos que están al día en uso son Electrooculografía, Infra-Rojo oculografía, esclerales bobinas de búsqueda. Estos métodos están completamente fuera de nuestro proyecto.

Imagen basada Enfoques

Los enfoques basados ​​en la imagen realizan detecciones ojo en las imágenes. La mayoría de los métodos basados ​​imagen tratar de detectar los ojos utilizando las características de los ojos. Los métodos utilizados hasta ahora son métodos basados ​​en el conocimiento, los métodos basados ​​en características (color, gradiente), sencilla comparación de plantillas, métodos de apariencia. Otro método interesante es «comparación de plantillas deformables», que se basa en la coincidencia de una plantilla geométrica ojo en una imagen del ojo, reduciendo al mínimo la energía del modelo geométrico.

Implementación de TrackEye

El proyecto ejecutado es en tres componentes:

  1. Detección de rostros: Realiza la detección de rostros invariante escala
  2. La detección de los ojos: Ambos ojos se detectan como resultado de este paso
  3. Extracción de características de los ojos: Características de los ojos se extraen al final de este paso

Detección De Rostro

Dos métodos diferentes se llevaron a cabo en el proyecto. Ellos son:

  1. Continuamente adaptativos Medios-Shift Algoritmo
  2. Método de detección de la cara Haar
Algoritmo de continuamente adaptativo Mean-Shift 

Adaptable Mean Shift algoritmo se utiliza para el seguimiento de rostros humanos y se basa en la técnica no paramétrica robusta para escalar gradientes de densidad de encontrar el modo (pico) de las distribuciones de probabilidad llamados el algoritmo medio turno. Como caras son rastreados en secuencias de vídeo, el algoritmo de cambio media se modifica para tratar con el problema de cambiar dinámicamente las distribuciones de probabilidad color. El diagrama de bloques del algoritmo se da a continuación:

Camshift Algoritmo

Haar-Cara Método de detección

El segundo algoritmo de detección de cara se basa en un clasificador de trabajo con características Haar-gusta (a saber, una cascada de clasificadores impulsado de trabajo con características Haar-similares). Primero de todo, se entrenó con unos pocos cientos de puntos de vista de muestra de una cara. Después de un clasificador está entrenado, que puede ser aplicado a una región de interés en una imagen de entrada. El clasificador emite una «1 «si la región es probable que muestran la cara y» 0 «en caso contrario. Para buscar el objeto en toda la imagen, se puede mover la ventana de búsqueda a través de la imagen y comprobar cada ubicación utilizando el clasificador. El clasificador está diseñado de modo que pueda ser fácilmente «cambiar de tamaño» con el fin de ser capaz de encontrar los objetos de interés en diferentes tamaños, lo que es más eficiente que cambiar el tamaño de la imagen en sí.

Detección de ojos

Dos métodos diferentes se llevaron a cabo en el proyecto:

  1. Plantilla de emparejamiento
  2. Adaptable EigenEye Método
Plantilla de emparejamiento

Plantilla-Matching es un método bien conocido para la detección de objetos. En nuestro método de correspondencia de plantilla, se crea un patrón de ojo norma manualmente y se le dio una imagen de entrada, los valores de correlación con los patrones estándar se calculan para los ojos. La existencia de un ojo se determina basándose en los valores de correlación. Este enfoque tiene la ventaja de ser simple de implementar.Sin embargo, a veces puede ser inadecuada para la detección del ojo ya que no puede tratar eficazmente con la variación en escala, pose y forma.

Método Adaptativo EigenEye

Adaptable EigenEye método se basa en el método conocidos EigenFaces . Sin embargo, como el método se utiliza para la detección de ojos lo nombramos como » EigenEye Método «. La idea principal es descomponer imágenes del ojo en un pequeño conjunto de características incluyen imágenes llamadas eigeneyes, que pueden ser considerados como los principales componentes de las imágenes originales. Estos eigeneyes funcionan como los vectores de la base ortogonal de un subespacio llamados eyespace. Sin embargo, sabemos que laeigenface método no es escalar invariante. Para proporcionar la invariancia de escala podemos cambiar el tamaño de la base de datos de los ojos una vez con la información obtenida por el algoritmo de detección de rostros ( EyeWidth / FaceWidth ? 0 . 35 ), podemos proporcionar una detección escala invariante utilizando sólo una base de datos.

Funciones OpenCV para el seguimiento de objetos y detección

OpenCV Biblioteca ofrece una gran cantidad de procesamiento de imágenes y de seguimiento de objetos y detección de bibliotecas. La función principal que se utiliza en estos proyectos y su uso se indican a continuación:

Código de ejemplo para el seguimiento Haar-Cara

  anular CTrackEyeDlg :: HaarFaceDetect (IplImage * img, CvBox2D * Facebox)
 {
     int escala = 2;
     IplImage * temp = cvCreateImage (cvSize (img-> ancho / 2, img-> Altura / 2), 8, 3);
     Pt1 CvPoint, pt2;
     int i;

     cvPyrDown (img, temperatura, CV_GAUSSIAN_5x5);
     WIN32 #ifdef
         cvFlip (temp, temp, 0);
     #terminara si
     cvClearMemStorage (almacenamiento);

     si (hid_cascade)
     {
         CvSeq * enfrenta = cvHaarDetectObjects (temp, hid_cascade, almacenamiento, 1. 2, 2,
                     CV_HAAR_DO_CANNY_PRUNING);

         NumOfHaarFaces = faces-> total;

         si (NumOfHaarFaces> 0)
         {
                 CvRect * r = (CvRect *) cvGetSeqElem (caras, 0, 0);
                 pt1.x = r-> x * escala;
                 pt2.x = (r-> x + r> ancho) * escala;
         WIN32 #ifdef
             pt1.y = img-> Altura - r-> escala y *;
             pt2.y = img-> Altura - (r> y + r> altura) * escala;
         #else
             pt1.y = r-> escala y *;
             pt2.y = (r> y + r> altura) * escala;
         #terminara si

         faceBox-> center.x = (float) (pt1.x + pt2.x) / 2 0.;
         faceBox-> center.y = (float) (pt1.y + pt2.y) / 2;
         faceBox-> Tamano.Width = (float) (pt2.x - pt1.x);
         faceBox-> size.height = (float) (pt1.y - pt2.y);
             }
     }
     cvShowImage ("Seguimiento", img);
     cvReleaseImage (y temporal);
 }

Código de ejemplo para CamShift Algoritmo

  // Las entradas para el algoritmo CamShift 
  IplImage * HUE = cvCreateImage (cvGetSize (SampleForHUE), IPL_DEPTH_8U, 1);
 extractHUE (SampleForHUE, HUE); // ** información HUE Extracto 

 int hist_size = 20;
 flotar rangos [] = {0, 180};
 flotar * pranges [] = {} rangos;
 hist = cvCreateHist (1, y hist_size, CV_HIST_ARRAY, pranges, 1);
 cvCalcHist (y HUE, hist); // Calcular el histograma de una parte HUE 

 hueFrame = cvCreateImage (cvGetSize (CameraFrame), IPL_DEPTH_8U, 1);
 backProject = cvCreateImage (cvGetSize (CameraFrame), IPL_DEPTH_8U, 1);
 extractHUE (CameraFrame, hueFrame);

 while (trackCONTROL! = 0)
 {
     extractHUE (CameraFrame, hueFrame);
     cvCalcBackProject (y hueFrame, backProject, hist); se forma // Probabilidad 
  // CvShowImage ("Tester2", backProject); 
  cvCamShift (backProject, SearchWin, cvTermCriteria (CV_TERMCRIT_EPS |
             CV_TERMCRIT_ITER, 15, 0 1), y un borrador, y Facebox).;
     SearchWin = comp.rect;
 }

Muestra Matching Plantilla Código

  // Coincidencia Plantilla para la detección de ojos 
  void Cara :: findEyes_TM (IplImage * faceImage, TrackingSettings * Ajustes)
 {
     CvSize faceSize;  faceSize = cvGetSize (faceImage);

     // Cargar plantilla de la base de datos de ojo 
  CString nomArchivo;
     // Nombre de la plantilla para el ojo izquierdo 
  fileName.Format ("% s \\% d.jpg ojo", Preferencias-> params-> DBdirectory, 0);
     IplImage * eyeImage_Left = cvLoadImage (nomArchivo, - 1);
     // Nombre de la plantilla para el ojo izquierdo 
  fileName.Format ("% s \\% d.jpg ojo", Preferencias-> params-> DBdirectory, 1);

     IplImage * eyeImage_Right = cvLoadImage (nomArchivo, - 1);

     IplImage * tempTemplateImg_Left;  IplImage * tempTemplateImg_Right;
     IplImage * templateImg_Left;  IplImage * templateImg_Right;

     si (eyeImage_Left == NULL || eyeImage_Right == NULL)
     {
         MessageBox (NULL, "plantillas no pueden ser cargados. \ N 
              Por favor revise su carpeta de ojo de base de datos "," Error ", MB_OK || MB_ICONSTOP);
         exit (1);
     }
     más
     {
         // Espacio Cambiar el color de acuerdo a los ajustes introducidos por el usuario 
  tempTemplateImg_Left = cvCreateImage (cvGetSize (eyeImage_Left), IPL_DEPTH_8U, 1);
         changeColorSpace (ajustes, eyeImage_Left, tempTemplateImg_Left);
         tempTemplateImg_Right =
                    cvCreateImage (cvGetSize (eyeImage_Right), IPL_DEPTH_8U, 1);
         changeColorSpace (ajustes, eyeImage_Right, tempTemplateImg_Right);

         flotar idealWidth = faceSize.width * Preferencias-> params-> relación;
         flotar conversionRatio = idealWidth / (float) tempTemplateImg_Left-> ancho;

         CvSize newSize;
         newSize.width = (int) idealWidth;
         newSize.height = (int) (tempTemplateImg_Left-> Altura * conversionRatio);

         templateImg_Left = cvCreateImage (newSize, IPL_DEPTH_8U, 1);
         cvResize (tempTemplateImg_Left, templateImg_Left, CV_INTER_LINEAR); // era NN 
  cvReleaseImage (y eyeImage_Left);
         cvReleaseImage (y tempTemplateImg_Left);

         templateImg_Right = cvCreateImage (newSize, IPL_DEPTH_8U, 1);
         cvResize (tempTemplateImg_Right, templateImg_Right, CV_INTER_LINEAR); // era NN 
  cvReleaseImage (y eyeImage_Right);
         cvReleaseImage (y tempTemplateImg_Right);
     }
     // ************************************************ ************* 
  // ************ Buscar faceImage para los ojos ************************ 
  // ************************************************ ************* 
  IplImage * GRAYfaceImage = cvCreateImage (faceSize, IPL_DEPTH_8U, 1);
     changeColorSpace (ajustes, faceImage, GRAYfaceImage);
     // CvCvtColor (faceImage, GRAYfaceImage, CV_RGB2GRAY); 
  // GRAYfaceImage-> origen = 1; 
  // ** Aviso a este origen imagen punto es la esquina inferior izquierda. 

     // ** Área de búsqueda Eye1 
  int x_left = 0;
     int y_left = 0;
     int width_left = (int) ((float) (faceSize.width / 2 0).);
     int height_left = (int) ((float) (faceSize.height));
     CvRect rect_Eye1 = cvRect (x_left, y_left, width_left, height_left);

     CvMat * Eye1Image = cvCreateMat (width_left, height_left, CV_8UC1);
     cvGetSubRect (GRAYfaceImage, Eye1Image, rect_Eye1);
     cvFlip (Eye1Image, Eye1Image, 0);

     // ** Área de búsqueda Eye2 
  int x_right = (int) ((float) (faceSize.width / 2 0).);
     int y_right = 0;
     int width_right = (int) ((float) (faceSize.width / 2 0).);
     int height_right = (int) ((float) (faceSize.height));
     CvRect rect_Eye2 = cvRect (x_right, y_right, width_right, height_right);

     CvMat * Eye2Image = cvCreateMat (width_right, height_right, CV_8UC1);
     cvGetSubRect (GRAYfaceImage, Eye2Image, rect_Eye2);
     cvFlip (Eye2Image, Eye2Image, 0);

     // OpenCV dice que el tamaño del resultado debe ser el siguiente: 
  Tamaño CvSize;
     size.height = Eye1Image-> Altura - templateImg_Left-> alto + 1;
     Tamano.Width = Eye1Image-> Ancho - templateImg_Left-> ancho + 1;
     IplImage * resultado1 = cvCreateImage (tamaño, IPL_DEPTH_32F, 1);
     IplImage * result2 = cvCreateImage (tamaño, IPL_DEPTH_32F, 1);

     // Ojo Izquierdo 
  cvMatchTemplate (Eye1Image, templateImg_Left, resultado1, Preferencias-> params-> tempMatch);
     // Ojo Derecho 
  cvMatchTemplate (Eye2Image, templateImg_Right, result2, Preferencias-> params-> tempMatch);

     // Encontrar la mejor ubicación partido - OJO IZQUIERDO 
  doble minValue1, maxValue1;
         CvPoint minLoc1, maxLoc1;
         cvMinMaxLoc (resultado1, y minValue1, y maxValue1, y minLoc1, y maxLoc1);
     cvCircle (resultado1, maxLoc1, 5, Preferencias-> programColors.colors [2], 1);
     // Transformar punto de volver a la imagen original 
  maxLoc1.x + = templateImg_Left-> Ancho / 2;
         maxLoc1.y + = templateImg_Left-> Altura / 2;
     Preferencias-> params-> eye1.coords.x = maxLoc1.x;
     Preferencias-> params-> eye1.coords.y = maxLoc1.y;
     Preferencias-> params-> eye1.RectSize.width = templateImg_Left-> ancho;
     Preferencias-> params-> eye1.RectSize.height = templateImg_Left-> altura;
     Preferencias-> params-> eye1.eyefound = true;

     // Encontrar la mejor ubicación partido - Ojo Derecho 
  doble minValue2, maxValue2;
         CvPoint minLoc2, maxLoc2;
         cvMinMaxLoc (result2, y minValue2, y maxValue2, y minLoc2, y maxLoc2);
     cvCircle (result2, maxLoc2, 5, Preferencias-> programColors.colors [2], 1);
     // Transformar punto de volver a la imagen original 
  maxLoc2.x + = templateImg_Left-> Ancho / 2;
         maxLoc2.y + = templateImg_Left-> Altura / 2;
     Preferencias-> params-> eye2.coords.x = maxLoc2.x + (int) faceSize.width / 2;
     Preferencias-> params-> eye2.coords.y = maxLoc2.y;
     Preferencias-> params-> eye2.RectSize.width = templateImg_Left-> ancho;
     Preferencias-> params-> eye2.RectSize.height = templateImg_Left-> altura;
     Preferencias-> params-> eye2.eyefound = true;

     cvCircle (Eye1Image, maxLoc1, 5, Preferencias-> programColors.colors [2], 1);
     cvCircle (Eye2Image, maxLoc2, 5, Preferencias-> programColors.colors [2], 1);
 }

Código de ejemplo de adaptación Método EigenEye

  Cara void :: findEyes (IplImage * faceImage, TrackingSettings * Ajustes)
 {
     IplImage ** imágenes = (IplImage **) malloc (sizeof (IplImage *) * numOfImages);
     IplImage ** eigens = (IplImage **) malloc (sizeof (IplImage *) * numOfImages);

     IplImage * averageImage;
     IplImage * proyección;

     CvSize faceSize;  faceSize = cvGetSize (faceImage);
     eigenSize newEigenSize;

     newEigenSize.width = faceSize.width * Preferencias-> params-> relación;

     newEigenSize.conversion = ((float) newEigenSize.width) / ((float) base de datos [0] -> ancho);
     newEigenSize.height = ((float) base de datos [0] -> altura) * newEigenSize.conversion;

     CvSize newSize;
     newSize.width = (int) newEigenSize.width;
     newSize.height = (int) newEigenSize.height;

     IplImage * tempImg = cvCreateImage (newSize, IPL_DEPTH_8U, 1);
     // ********** ********** Inicializaciones 
  for (int i = 0; i <Preferencias- /> params-> nImages; i ++)
     {
         imágenes [i] = cvCreateImage (newSize, IPL_DEPTH_8U, 1);
         cvResize (base de datos [i], imágenes [i], CV_INTER_LINEAR); // era NN 
  }
     cvShowImage ("eigen", imágenes [0]);
     cvReleaseImage (y tempImg);

     // Crear el espacio para Eigenfaces 
  for (i = 0; i <Preferencias- /> params-> nImages; i ++)
         eigens [i] = cvCreateImage (cvGetSize (imágenes [0]), IPL_DEPTH_32F, 1);

     averageImage = cvCreateImage (cvGetSize (imágenes [0]), IPL_DEPTH_32F, 1);
     proyección = cvCreateImage (cvGetSize (imágenes [0]), IPL_DEPTH_8U, 1);

     // ************************************************ ************* 
  // ************ Calcula los vectores propios y valores propios ************* 
  // ************************************************ ************* 
  Criterios CvTermCriteria;
     criteria.type = CV_TERMCRIT_ITER | CV_TERMCRIT_EPS;
         criteria.maxIter = 13;
         criteria.epsilon = 0. 1;

     // ** N estaba presente en lugar de numOfImages 
  cvCalcEigenObjects (Preferencias-> params-> nImages, imágenes, eigens,
                         0, 0, 0, y criterios, averageImage, vals);

     // ************************************************ ************* 
  // ************ Buscar faceImage para los ojos ************************ 
  // ************************************************ ************* 
  IplImage * GRAYfaceImage = cvCreateImage (faceSize, IPL_DEPTH_8U, 1);
     changeColorSpace (ajustes, faceImage, GRAYfaceImage);
     // CvCvtColor (faceImage, GRAYfaceImage, CV_RGB2GRAY); 
  // ** Aviso a este origen imagen punto es la esquina inferior izquierda. 
  GRAYfaceImage-> origen = 1;

     int MARGEN = Preferencias-> params-> MAXERROR;
     doble mínimo = MARGEN; doble distancia = MARGEN;

     // ** Búsqueda Eye1 Espacio 
  Preferencias-> params-> eye1.xlimitLeft = 0;
     Preferencias-> params-> eye1.xlimitRight = faceSize.width / 2 0 - imágenes [0] -> ancho -. 1;
     Preferencias-> params-> eye1.ylimitUp =
              (Int) (((float) faceSize.height) * 0 - 75 imágenes [0] -> Altura - 1.);
     Preferencias-> params-> eye1.ylimitDown = faceSize.height / 2;

     // ** Búsqueda Eye2 Espacio 
  . Preferencias-> params-> eye2.xlimitLeft = faceSize.width / 2 0;
     Preferencias-> params-> eye2.xlimitRight = faceSize.width - imágenes [0] -> Ancho - 1;
     Preferencias-> params-> eye2.ylimitUp =
          (Int) (((float) faceSize.height) * 0 - 75 imágenes [0] -> Altura - 1.);
     Preferencias-> params-> eye2.ylimitDown = faceSize.height / 2;

     Preferencias-> params-> eye1.initializeEyeParameters ();
     Preferencias-> params-> eye2.initializeEyeParameters ();
     Preferencias-> params-> eye1.RectSize.width = imágenes [0] -> anchura;
     Preferencias-> params-> eye1.RectSize.height = imágenes [0] -> altura;
     Preferencias-> params-> eye2.RectSize.width = imágenes [0] -> anchura;
     Preferencias-> params-> eye2.RectSize.height = imágenes [0] -> altura;

     IplImage * Image2Comp = cvCreateImage (cvGetSize (imágenes [0]), IPL_DEPTH_8U, 1);
     int x, y;
     // ** Buscar ojo izquierdo es decir eye1 
  for (y = Preferencias-> params-> eye1.ylimitDown; y <Preferencias- />params->eye1.ylimitUp; y + = 2)
     {
         for (x = Preferencias-> params-> eye1.xlimitLeft; x <Preferencias- />params->eye1.xlimitRight; x + = 2)
         {
             cvSetImageROI (GRAYfaceImage, cvRect
                  (x, y, imágenes [0] -> anchura, imágenes [0] -> altura));
             si (Preferencias-> params-> varianceCheck == 1)
             {
                 si (calculateSTD (GRAYfaceImage) <= (doble) (Preferencias-> params-> varianza))
                 {
                     cvResetImageROI (GRAYfaceImage);
                     continuar;
                 }
             }
             cvFlip (GRAYfaceImage, Image2Comp, 0);
             cvResetImageROI (GRAYfaceImage);
             // Decidir si se trata de un ojo o no 
  cvEigenDecomposite (Image2Comp, Preferencias-> params-> nEigens,
                                 eigens, 0, 0, averageImage, pesos);
             cvEigenProjection (eigens, Preferencias-> params-> nEigens,
                        CV_EIGOBJ_NO_CALLBACK, 0, pesos, averageImage, proyección);
             distancia = cvNorm (Image2Comp, proyección, CV_L2, 0);

             si (distancia <&& distancia mínima> 0)
             {
                 Preferencias-> params-> eye1.eyefound = true;
                 mínimo = distancia;
                 Preferencias-> params-> eye1.distance = distancia;
                 Preferencias-> params-> eye1.coords.x = x;
                 Preferencias-> params-> eye1.coords.y = y;
             }
         }
     }

     mínimo = MARGEN;  distancia = MARGEN;

     // ** Buscar ojo derecho es decir eye2 
  for (y = Preferencias-> params-> eye2.ylimitDown; y <Preferencias- />params->eye2.ylimitUp; y + = 2)
     {
         for (x = Preferencias-> params-> eye2.xlimitLeft; x <Preferencias- />params->eye2.xlimitRight; x + = 2)
         {
             cvSetImageROI (GRAYfaceImage,
                   cvRect (x, y, imágenes [0] -> anchura, imágenes [0] -> altura));
             si (Preferencias-> params-> varianceCheck == 1)
             {
                 si (calculateSTD (GRAYfaceImage) <= (doble) (Preferencias-> params-> varianza))
                 {
                     cvResetImageROI (GRAYfaceImage);
                     continuar;
                 }
             }
             cvFlip (GRAYfaceImage, Image2Comp, 0);
             cvResetImageROI (GRAYfaceImage);
             // ** Decidir si se trata de un ojo o no 
  cvEigenDecomposite (Image2Comp, Preferencias-> params-> nEigens,
                                 eigens, 0, 0, averageImage, pesos);
             cvEigenProjection (eigens, Preferencias-> params-> nEigens,
                                0, 0, pesos, averageImage, proyección);
             distancia = cvNorm (Image2Comp, proyección, CV_L2, 0);

             si (distancia <&& distancia mínima> 0)
             {
                 Preferencias-> params-> eye2.eyefound = true;
                 mínimo = distancia;
                 Preferencias-> params-> eye2.distance = distancia;
                 Preferencias-> params-> eye2.coords.x = x;
                 Preferencias-> params-> eye2.coords.y = y;
             }
         }
     }
     cvReleaseImage (y Image2Comp);

     // ** Limpiar 
  cvReleaseImage (y GRAYfaceImage);
     for (i = 0; i <Preferencias- /> params-> nImages; i ++)
         cvReleaseImage (e imágenes [i]);

     for (i = 0; i <Preferencias- /> params-> nImages; i ++)
         cvReleaseImage (y eigens [i]);

     cvReleaseImage (y averageImage);
     cvReleaseImage (y proyección);

     libres (imágenes);
     libres (eigens);
 }

Licencia:Este  traduccción del artículo, junto con cualquier código y archivos fuente asociado, está licenciado bajo la licencia de código abierto del proyecto (CPOL)

 

Fuente aqui