Detalles Técnicos dentro del proyecto “Uso de las TICs en el desarrollo de las habilidades del Siglo XXI”


Dentro del proyecto “Uso de las TICs en el desarrollo de las habilidades del Siglo XXI”, se esta construyendo un conjunto de aplicaciones que posibiliten el uso efectivo de los contenidos preparados en base al trabajo con los niños y niñas.
En esta oportunidades les contaré del trabajo que vengo realizando en la construcción de una aplicación de realidad aumentada de la cual espero pueda motivar a los niños a aprender el lenguaje de señas; esta aplicación esta formada por varios componentes:

  • Componente de reconocimiento y ubicación del rostro
  • Componente de reconocimiento de voz
  • Componente de detección de movimiento y Menú
  • Componente de ubicación de contenidos

Veamos el primero:

Componente de reconocimiento y ubicación del rostro

La detección del rostro es uno de los elementos fundamentales en cualquier sistema de reconocimiento facial, en nuestro caso buscamos identificar un rostro y sobre su ubicación colocar contenido que ilustra el uso de un conjunto de señas. El identificador debe ser capaz de reconocer el rostro más grande dentro del flujo de video (esto debe ser independiente de la edad, el sexo y la orientación). Dentro del proyecto la implementación de este componente da pie a un conjunto de investigaciones de corte técnico para buscar una solución eficiente.
Algunos de los retos afrontados son la detección facial, el escalado, la pose, iluminación, la oclusión y la edad.
Por motivos de uso de plataformas el desarrollo se ha realizado sobre Csharp y OpenCVSharp; usando los algoritmos implementados para OpenCVSharp, siendo usadas las funciones de clasificación en cascada que usa la técnica de Viola y Jones.

detección de rostro

menurostro2
Este es el algoritmo en bruto que fue usado y optimizado para nuestro caso y es extraído de los ejemplos de OpenCvSharp 1.4.1

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;

namespace OpenCvSharp.Test
{
///

///

/// http://opencv.jp/sample/object_detection.html#face_detection
class FaceDetect
{
public FaceDetect()
{
// CvHaarClassifierCascade, cvHaarDetectObjects

CvColor[] colors = new CvColor[]{
new CvColor(0,0,255),
new CvColor(0,128,255),
new CvColor(0,255,255),
new CvColor(0,255,0),
new CvColor(255,128,0),
new CvColor(255,255,0),
new CvColor(255,0,0),
new CvColor(255,0,255),
};

const double Scale = 1.14;
const double ScaleFactor = 1.0850;
const int MinNeighbors = 2;

using (IplImage img = new IplImage(Const.ImageYalta, LoadMode.Color))
using (IplImage smallImg = new IplImage(new CvSize(Cv.Round(img.Width / Scale), Cv.Round(img.Height / Scale)), BitDepth.U8, 1))
{

using (IplImage gray = new IplImage(img.Size, BitDepth.U8, 1))
{
Cv.CvtColor(img, gray, ColorConversion.BgrToGray);
Cv.Resize(gray, smallImg, Interpolation.Linear);
Cv.EqualizeHist(smallImg, smallImg);
}

using (CvHaarClassifierCascade cascade = CvHaarClassifierCascade.FromFile(Const.XmlHaarcascade)) //
using (CvMemStorage storage = new CvMemStorage())
{
storage.Clear();

//
Stopwatch watch = Stopwatch.StartNew();
CvSeq faces = Cv.HaarDetectObjects(smallImg, cascade, storage, ScaleFactor, MinNeighbors, 0, new CvSize(30, 30));
watch.Stop();
Console.WriteLine(“detection time = {0}ms\n”, watch.ElapsedMilliseconds);

//
for (int i = 0; i < faces.Total; i++)
{
CvRect r = faces[i].Value.Rect;
CvPoint center = new CvPoint
{
X = Cv.Round((r.X + r.Width * 0.5) * Scale),
Y = Cv.Round((r.Y + r.Height * 0.5) * Scale)
};
int radius = Cv.Round((r.Width + r.Height) * 0.25 * Scale);
img.Circle(center, radius, colors[i % 8], 3, LineType.AntiAlias, 0);
}
}

//
CvWindow.ShowImages(img);
}
}
}
}

Componente de reconocimiento de voz:

Se esta usando los componentes de reconocimiento de voz de Microsoft en especial el System.Speech.Recognition, que permite el reconocimiento de voz; para reducir los tiempos se ha construido una gramática simple como por ejemplo reconocer cuatro palabras: izquierda, derecha e izquierda.

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using System.Speech.Synthesis;
using System.Speech.Recognition;
using System.Speech.Recognition.SrgsGrammar;

namespace voz
{
/// <summary>
/// This is the main type for your game
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
SpeechSynthesizer mysyn = new SpeechSynthesizer();
SpriteFont letraPuntaje, letraPuntaje1;
string texto;
//SpeechRecognitionEngine _Recognition = new SpeechRecognitionEngine();
private SpeechRecognitionEngine reconocedor = new SpeechRecognitionEngine();
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = “Content”;
}

/// <summary>

protected override void Initialize()
{
// TODO: Add your initialization logic here
reconocedor.SetInputToDefaultAudioDevice();
texto = “derecha”;
SrgsDocument doc = new SrgsDocument();
SrgsRule rules = new SrgsRule(“rules”, new SrgsOneOf(“derecha”, “izquierda”, “arriba”, “abajo”));
doc.Rules.Add(rules);
doc.Root = rules;
doc.Culture = reconocedor.RecognizerInfo.Culture;
doc.Language = “es-ES”;
reconocedor.LoadGrammar(new Grammar(doc));//

reconocedor.SpeechRecognized += new EventHandler<SpeechRecognizedEventArgs>(reconocedor_SpeechRecognized);

reconocedor.RecognizeAsync(RecognizeMode.Multiple);
base.Initialize();
}

/// <summary>
/// LoadContent will be called once per game and is the place to load
/// all of your content.
/// </summary>
List<string> nombre = new List<string>();
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
letraPuntaje = Content.Load<SpriteFont>(“letra”);

foreach (InstalledVoice voz in mysyn.GetInstalledVoices())
{
nombre.Add(voz.VoiceInfo.Name.ToString());
}

// TODO: use this.Content to load your game content here
}
void reconocedor_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{

///destripa el datagrmaa

foreach (RecognizedWordUnit word in e.Result.Words)
{

texto = word.Text;
}
}
/// <summary>
/// UnloadContent will be called once per game and is the place to unload
/// all content.
/// </summary>
protected override void UnloadContent()
{
// TODO: Unload any non ContentManager content here
}

/// <summary>
/// Allows the game to run logic such as updating the world,
/// checking for collisions, gathering input, and playing audio.
/// </summary>
/// <param name=”gameTime”>Provides a snapshot of timing values.</param>
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();

// TODO: Add your update logic here

base.Update(gameTime);
}

/// <summary>
/// This is called when the game should draw itself.
/// </summary>
/// <param name=”gameTime”>Provides a snapshot of timing values.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);

// TODO: Add your drawing code here

spriteBatch.Begin();
spriteBatch.DrawString(letraPuntaje, texto, new Vector2(60, 180),
Color.PaleVioletRed, MathHelper.ToRadians(0), new Vector2(0, 0), 2f, SpriteEffects.None, 0);
spriteBatch.End();
base.Draw(gameTime);
}

}
}

Componente de detección de movimiento y Menú

Respecto a este componente básicamente se cuenta en número de pixeles blancos dentro de una imagen en blanco y negro dentro de una región de la imagen ver la figura inferior.

blancoynegro

Componente de ubicación de contenidos

Este es el componente más importante y esta relacionado con el trabajo de los niños y niñas de la I.E. “Jesús Nazareno”. Ellos están aprendiendo de una manera muy dinámica el lenguaje de señas, este aprendizaje está siendo alentado por los padres de familia y afortunadamente con la participación de especialistas del Centro de Educación Especial “Señor de la Soledad” se ha podido mejorar la interpretación de las señas. Para ello se usan gif animados los que son ubicados sobre la posición de ubicación del rostro y se coordinan en base a estructuras CASE.

bailar trabajar comer barrer

Aquí la primera versión del Software

Juan Cadillo

3 Comentarios

  1. Pingback: Detalles Técnicos dentro del proyecto “Uso de las TICs en el …

  2. Pingback: Detalles Técnicos dentro del proyecto &l...

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s