Realidad Aumentada aplicada a la Matemática

Luego de algún tiempo retomo la escritura en el blog, para comentarles el emprendimiento que se ha iniciado en favor de aplicar la tecnología de la Realidad Aumentada para poder reforzar los aprendizajes en matemática, fundamentalmente en los primeros grados.  El Informe Horizon 2010 elaborado por el eLearn Center de la UOC y el New Media Consortium   vaticinó que la realidad aumentada sencilla sólo tardaría de dos a tres años en imprimir una fuerte influencia en la educación; esta vaticinio se ha ido cumpliendo en estos cerca de 3 años; el grato reto que asumí fue poder ser referentes en el uso de esta tecnología; por fortuna se coincidió con la empresa mexicana  M.C. Ar  en este empeño y en estos meses estoy trabajando para ellos en el desarrollo de un sistema que pueda apoyar la enseñanza de las Matemáticas basándonos en la curricula de primer grado en México, que es muy similar en los contenidos a varias de las currículas latinoamericanas en especial la peruana.

Durante el desarrollo del proyecto se van construyendo  juegos de RA, que usan conceptos de las denominadas aplicaciones de computación basadas en el gesto. El lenguaje de programación que se eligió fue CSharp bajo el framework Microsoft XNA; dentro de este entorno se usaron  librerías de visión artificial basadas en OpenCV y adaptada a CSharp con la denominación de OpenCvSharp. Las aplicaciones construidas  logran interactividad a través de los gestos; usando para ello la detección de flujo de movimiento,  es decir, se determina el patrón aparente de movimiento de objetos, superficies, y los bordes en una escena visual que es causado por el movimiento relativo entre un observador (un ojo una cámara ) y la escena,

Experimentalmente se esta validando las aplicaciones en la  I.E. «Jesús Nazareno», bajo estrategias del juego didáctico; donde se introducen los juegos  para poder validar sus resultados, que espero poder comentar en este espacio. Estos son algunos de los conceptos que se están trabajando:

–        Clasificación de objetos.

–        Seriación de objetos.

–        Representación de la cardinalidad de un conjunto de objetos.

–        Identificación de números ordinales.

–        Identificación de la relación “mayor que”, “menor que”, “igual que”

–        Sumar y restar de números.

Videos ilustrativos de lo que se esta avanzando:

Juan Cadillo

El Flujo Óptico

En esta semana me puse a revisar algunos algoritmos de ejemplo que traen las librerías de OpenCvSharp, y me dí con el de flujo óptico. Cuando trabaje con processing deseaba poder implementar algún algoritmo de este tipo, pero las librerías de opencv para processing no me soportaban la cámara y por la inexperiencia de esos días no entendía como hacerlo y me conforme con la detección de movimiento para poder construir juegos para niños. Ahora con un poco más de experiencia y armado de un marco mucho más rico de funciones dentro de OpenCV para C#,  he adaptado el algoritmo de ejemplo que trae y  poder mover un pequeño cuadrado (pensar que para animar un simple cuadrado tuve que romperme la cabeza con processing… hace algunos años).

Algo de teoría

Flujo óptico

El flujo óptico sucede cuando nos movemos en una dirección determinada. Si miramos hacia el punto al que nos dirigimos (el centro de expansión) éste no muestra movimiento, mientras que si miramos al espacio circundante, el campo visual parece expandirse. Este efecto, nuestro cerebro lo percibe con  precisión, y  contribuye al control de la locomoción.

El objetivo inmediato del análisis de imágenes basado en el flujo óptico es determinar el campo de movimiento (representación bidimensional de un movimiento tridimensional)

Algoritmo de Lucas-Kanade

Asumen constantes los vectores de velocidad u y v en una pequeña porción de la imagen.

lucas_a

lucas1

lucas_b

donde la matriz A contiene las derivadas espaciales de la imagen, el vector v corresponde al vector de flujo óptico (u,v) y el vector b contiene las derivadas temporales de la imagen.

lucas_c

lucas2

lucas_d

Para poder realizar el cálculo de flujo óptico tiene que ser posible la inversión de la matriz

lucas_e

Shi y Tomassi definen en las propiedades que debe cumplir una región para que el flujo óptico se estimado apropiadamente utilizando la técnica de LK. Sean λ1 y λ2 los valores propios de la matriz $$A^TA$ para cierta región R de la imagen, entonces se debe cumplir que:

  • min (λ1 y λ2) > λmin) existe en R
  • (λ1 / λ2) < t

Veamos la implementación del algoritmo original ofrecido dentro de los ejemplo de OpenCvSahrp

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

namespace OpenCvSharp.Test
{
/// <summary>
/// Lucas & Kanade アルゴリズムによるオプティカルフローの計算
/// </summary>
/// <remarks>http://opencv.jp/sample/optical_flow.html#optflowHSLK</remarks&gt;
class OpticalFlowLK
{
public OpticalFlowLK()
{
using (IplImage srcImg1 = Cv.LoadImage(Const.ImagePenguin1, LoadMode.GrayScale))
using (IplImage srcImg2 = Cv.LoadImage(Const.ImagePenguin1b, LoadMode.GrayScale))
using (IplImage dstImg = Cv.LoadImage(Const.ImagePenguin1b, LoadMode.Color))
{
// (1)速度ベクトルを格納する構造体の確保,等
int cols = srcImg1.Width;
int rows = srcImg1.Height;
using (CvMat velx = Cv.CreateMat(rows, cols, MatrixType.F32C1))
using (CvMat vely = Cv.CreateMat(rows, cols, MatrixType.F32C1))
{
Cv.SetZero(velx);
Cv.SetZero(vely);

// (2)オプティカルフローを計算
Cv.CalcOpticalFlowLK(srcImg1, srcImg2, Cv.Size(15, 15), velx, vely);

// (3)オプティカルフローを描画
for (int i = 0; i < cols; i += 5)
{
for (int j = 0; j < rows; j += 5)
{
int dx = (int)Cv.GetReal2D(velx, j, i);
int dy = (int)Cv.GetReal2D(vely, j, i);
Cv.Line(dstImg, Cv.Point(i, j), Cv.Point(i + dx, j + dy), Cv.RGB(255, 0, 0), 1, Cv.AA, 0);
}
}

// (4)オプティカルフローの表示
Cv.NamedWindow(«ImageLK», WindowMode.AutoSize);
Cv.ShowImage(«ImageLK», dstImg);
Cv.NamedWindow(«velx», WindowMode.AutoSize);
Cv.ShowImage(«velx», velx);
Cv.NamedWindow(«vely», WindowMode.AutoSize);
Cv.ShowImage(«vely», vely);
Cv.WaitKey(0);
Cv.DestroyAllWindows();
}
}

}
}
}

Aquí el video de la implementación del algoritmo en tiempo real:

Y este video con el movimiento detectado sobre un cuadrado:

Juan Cadillo