Windows

Kinect y PowerPoint (I) – Controla PowerPoint con gestos

5

Estás cansado de las típicas presentaciones en PowerPoint? Vamos a ver una forma de hacer tus presentaciones mucho más atractivas, más vistosas y atrayentes con lo que captarás un mayor interés en tus asistentes.

Desde SolidQ se nos ocurrió la idea de mejorar las presentaciones, ¿y cómo las mejoramos? Pues utilizando Kinect y mediante gestos controlar tus presentaciones de PowerPoint!!

Antes que nada, cómo funciona Kinect? Vamos a ver unos conceptos básicos sobre el funcionamiento de Kinect.

Es un dispositivo que combina una cámara RGB (2) , un sensor de profundidad (1 y 3) y un array de micrófonos en la parte inferior. La cámara RGB es para el reconocimiento de los tres colores básicos y es la que nos da las imágenes, la cámara RGB tiene una resolución de 640×480 píxeles lo que todavía no nos permite que nos detecte los dedos, pero esperamos que en versiones futuras de aumente esta resolución y tengamos muchas más posibilidades. El sensor de profundidad que permite ver una habitación en 3D, emite unos rayos infrarrojos que marca líneas de profundidad, esto permite calcular el tiempo que tarda en rebotar el haz de luz y volver al dispositivo para calcular la distancia al objeto identificado. El array de micrófonos detecta las voces y las aísla del ruido ambiental, el array está sincronizado con la consola para eliminar el sonido de los juegos.

 

image

 

El software de Kinect está basado en tecnología de Inteligencia Artificial, lo que permite analizar, procesar y aprender por sí misma como está constituido el cuerpo humano y la forma de moverse. Cuando nos situamos enfrente de Kinect, lo que hace es emitir millones de haces de luz y detecta las partes humanoides separándolas del fondo.

image

 

El proceso de identificación del esqueleto (Skeleton) tiene varias fases, primero obtiene datos del mapa de profundidad mediante los rayos infrarrojos, identifica el suelo y separa los objetos del fondo (calibración de Kinect). Después identifica si hay uno o dos jugadores (por ahora reconoce máximo 2). Una vez identificado el cuerpo humano clasifica las diferentes partes del cuerpo para obtener las partes del cuerpo, Joints o articulaciones, y finalmente mediante la unión de los Joints crea el Skeleton.

image

 

El Skeleton se forma en base a 32 puntos del cuerpo humano (tobillos, rodillas, caderas, estomago, hombros, codos, manos, etc). Todo este proceso se conoce como Skeletal tracking, es el algoritmo por el cual se consigue identificar las diferentes partes del cuerpo.

image

 

Ahora ya tenemos una idea mucho más clara como funciona Kinect, vamos ahora ver cómo vamos a controlar las presentaciones de PowerPoint mediante gestos utilizando Kinect.

Lo primero, bajarse los drivers de Kinect, ya en beta 2. El código siguiente está desarrollado utilizando ya la beta 2 del SDK oficial de Kinect.

Creamos un proyecto WPF. Agregamos la referencia a la librería de Kinect que se encuentra en:

C:\Program Files\Microsoft SDKs\Kinect\v1.0 Beta2\Assemblies\Microsoft.Research.Kinect.dll

En la ventana principal, en el código xaml, añadimos una componente para poder ver nuestra imagen a través de la cámara RGB de Kinect.

<Viewbox Stretch="Uniform">

    <StackPanel>

        <Grid>

            <Image Name="videoImage"

                   Width="640"

                   Height="480"

                   VerticalAlignment="Bottom">

            </Image>

        </Grid>

    </StackPanel>

</Viewbox>

En el constructor de nuestra clase inicializamos el componente y cargamos el método Loaded.
 
public MainWindow()

{

    InitializeComponent();

    this.Loaded += new RoutedEventHandler(MainWindow_Loaded);

}

 

Y en el método Loaded añadimos la opción de usar Skeletal Tracking, la profundidad (depth)  y el evento SkeletonFrameReady, este método es el principal de nuestro proyecto Kinect, y se estará ejecutando continuamente en busca de nuevos gestos y movimiento del usuario.
void MainWindow_Loaded(object sender, RoutedEventArgs e)

{    

    if (Runtime.Kinects.Count == 0)        

        this.Title = "No kinect connected";    

    else    

    {        

        runtime = Runtime.Kinects[0];        

        runtime.Initialize(Microsoft.Research.Kinect.Nui.RuntimeOptions.UseColor | RuntimeOptions.UseSkeletalTracking | RuntimeOptions.UseDepth);    

        runtime.VideoFrameReady += runtime_VideoFrameReady;        

        runtime.SkeletonFrameReady += runtime_SkeletonFrameReady;            

        //Aqui ajustamos la resolución        

        runtime.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);        

        runtime.NuiCamera.ElevationAngle = 0;            

        //Método para activar el reconocimiento de voz        

        StartSpeechRecognition();

    }

}

En el método VideoFrameready, mostramos nuestro video sobre el componente de video que nos creamos con el código xaml:

void runtime_VideoFrameReady(object sender, Microsoft.Research.Kinect.Nui.ImageFrameReadyEventArgs e)

{    

    PlanarImage image = e.ImageFrame.Image;    

    BitmapSource source = BitmapSource.Create(image.Width, image.Height, 96, 96,PixelFormats.Bgr32, null, image.Bits, image.Width * image.BytesPerPixel);    

    videoImage.Source = source;

}

Como hemos dicho el método SkeletonFrameReady, es el que va a estar captando los movimiento y gestos del usuario, por lo que este método es el principal, crearemos los Joints que queramos utilizar y llamaremos a un método externo “GestoAvanceAtras” quien analizará los gestos.

void runtime_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)

{    

    SkeletonFrame skeletonSet = e.SkeletonFrame;    

    SkeletonData data;    

    try    

    {        

        data = data = (from s in skeletonSet.Skeletons  

        where s.TrackingState == SkeletonTrackingState.Tracked 

        select s).FirstOrDefault();        

        var head = data.Joints[JointID.Head];        

        var rightHand = data.Joints[JointID.HandRight];        

        var leftHand = data.Joints[JointID.HandLeft];        

        var rightShoulder = data.Joints[JointID.ShoulderRight];        

        var leftShoulder = data.Joints[JointID.ShoulderLeft];        

        GestoAvanceAtras(head, rightHand, leftHand, leftShoulder, rightShoulder);    

    }    

    catch (NullReferenceException error)    

    {        

        Console.WriteLine(error.Message);    

    }

}

Vamos a ver el gesto Swipe, o desplazamiento horizontal. Vamos a tener:

Avanzar en diapositivas: mano derecha, desplazamiento de derecha a izquierda.

image

Retroceder en diapositivas: mano izquierda, desplazamiento de izquierda a derecha.

image

En el código anterior vimos como llamábamos al método GestoAvanceAtras, vamos a ver el código más abajo de dicho método. Antes de eso, vamos a declararnos unas variables que nos servirán para recoger la posición de la mano izquierda, y de la mano derecha. Y unas variables que utilizaremos para el método de Swipe, con las que controlaremos el tiempo mínimo y máximo del gesto, y también la diferencia de altura que puede tener el movimiento, es decir, con esto controlamos que el movimiento sea horizontal.

public struct Vector3

{    

    public float X;   

    public float Y;    

    public float Z;    

    public DateTime date;

 }

 public enum Gesture

 {    

     None,    

     Swipe

 }

 List<Vector3> positionListRight = new List<Vector3>();

 List<Vector3> positionListLeft = new List<Vector3>();

 List<Gesture> gestureAcceptedList = new List<Gesture>();

 const float SwipeMinimalLength = 0.4f; //longitud máxima del movimiento swipe

 const float SwipeMaximalHeight = 0.1f; //altura máxima del movimiento desde inicio hasta fin

 const int SwipeMinimalDuration = 200; //en ms

 const int SwipeMaximalDuration = 500; //ms

 DateTime lastGestureDate = DateTime.Now;

 int MinimalPeriodBetweenGestures = 0; //ms transcurridos entre dos gestos

 boolean gestoAdelanteActivo = false;

 boolean gestoAtrasActivo = false;

Ahora vamos a ver el método GestoAvanceAtras. Mediante dos flags controlamos si queremos avanzar hacia delante o atrás, dependiendo del valor de dichas variables, gestoAdelanteActivo y gestoAtrasActivo.

private void GestoAvanceAtras(Joint head, Joint rightHand, Joint leftHand, Joint leftshoulder, Joint rightShoulder)

{   

    if (!gestoAtrasActivo && !gestoAdelanteActivo)   

    {       

        positionListRight.Add(new Vector3()       

        {           

            X = rightHand.Position.X,           

            Y = rightHand.Position.Y,           

            Z = rightHand.Position.Z,           

            date = DateTime.Now       

        });              

        if (SwipeAdvance())       

        {           

            gestoAdelanteActivo= true;          

            System.Windows.Forms.SendKeys.SendWait("{Right}");      

        }

        if (positionListRight.Count() > 20)       

        {

            positionListRight.RemoveAt(0);       

        }   

    }   

    else   

    {       

        gestoAdelanteActivo = false;   

    }  

    if (!gestoAtrasActivo && !gestoAdelanteActivo)   

    {       

        positionListLeft.Add(new Vector3()       

        {           

        X = leftHand.Position.X,           

        Y = leftHand.Position.Y,           

        Z = leftHand.Position.Z,           

        date = DateTime.Now       

        });       

        if (SwipeBack())       

        {           

            gestoAtrasActivo= true;           

            System.Windows.Forms.SendKeys.SendWait("{Left}");      

        }       

        if (positionListLeft.Count() > 20)       

        {           

            positionListLeft.RemoveAt(0);       

        }   

    }   

    else   

    {       

        gestoAtrasActivo = false;   

    }         

}

Y por último, el método SwipeAdvance() y SwipeBack() con muy similares. Recorremos los vectores que tenemos con las posiciones de las manos, bien el array con los movimientos de la mano derecha como el array con los movimientos de la mano izquierda. Por otra parte también medimos la duración del gesto, y el recorrido para ver si es el gesto que coincide con el que queremos.

bool SwipeAdvance()

{    

    int start = 0;    

    for (int index = 0; index < positionListRight.Count - 1; index++)    

    {        

        if ((Math.Abs(positionListRight[0].Y - positionListRight[index].Y) > SwipeMaximalHeight) || (positionListRight[index + 1].X - positionListRight[index].X > -0.01f))        

        {           

            start = index;        

        }        

        if ((Math.Abs(positionListRight[index].X - positionListRight[start].X) > SwipeMinimalLength))        

        {            

            double totalMilliseconds = (positionListRight[index].date - positionListRight[start].date).TotalMilliseconds;            

            if (totalMilliseconds >= SwipeMinimalDuration && totalMilliseconds <= SwipeMaximalDuration)            

            {                

                if (DateTime.Now.Subtract(lastGestureDate).TotalMilliseconds > MinimalPeriodBetweenGestures)                

                {                    

                    gestureAcceptedList.Add(Gesture.Swipe);                    

                    lastGestureDate = DateTime.Now;                    

                    positionListRight.Clear();                    

                    return true;                

                }            

            }        

        }    

    }    

    return false;

}

El SwipeBack es trivial y muy parecido a SwipeAdvance, os lo propongo como reto! He de agradecer al equipo de MSDN, ya que estos movimientos los cogí como inspiración del artículo de MSDN Reto Kinect, podéis encontrar más información aquí.

En nuevos post escribiré más gestos y más posibilidades para controlar PowerPoint, y también por comandos de voz!

Espero que os guste Sonrisa

Yolanda

Registro en DreamSpark y descarga de Software de Microsoft

0

 

Voy a explicar los pasos para registrarse en DreamSpark de Microsoft. Es una plataforma dirigida a estudiantes, donde puedes descargarte el software y las herramientas de Microsoft totalmente gratis. Los pasos a seguir son:

1. Entrar en DreamSpark

2. Lo primero que hay que hacer es iniciar sesión con una cuenta de Windows Live (Hotmail, msn, live)

3. Hacer click en la opción “Sign In” situado en el panel de la izquierda

clip_image002

4. Te redirigirá a una página para iniciar sesión con tu Windows Live ID

clip_image004

5. Una vez hayas iniciado sesión con tu Windows Live ID, volverás a la página de DreamSpark.

6. Hacer click en “Get Verified” del menú de la izquierda

clip_image006

7. Este proceso lo que hace es verificar que eres estudiante. Deberás seleccionar las opciones:

a. Spain

b. Verify as a Student

c. Get verified through my school

d. Click en Continue

clip_image008

8. Ahora tienes que seleccionar la Universidad en la que estudies o el nombre de la Institución. Y hacer click en Continue

clip_image010

9. Te habrá dirigido a una pantalla donde tendrás que autenticarte con tus credenciales de la Universidad, es decir tu dirección de correo de la Universidad y tu contraseña.

En mi caso elegí la Universidad de Castilla la Mancha. De esta forma el sistema verifica que eres estudiante.

clip_image012

10. Una vez te hayas verificado en el sistema ya tendrás acceso a la descarga de software y herramientas de Microsoft, que puedes acceder a ello a través de la opción “Download Software”.

clip_image014

11. El proceso de verificación sólo lo tendrás que hacer una vez, la primera vez que te registres en DreamSpark. Las posteriores veces que accedas a DreamSpark sólo necesitarás tu Windows Live ID con el que iniciaste sesión la primera vez.

Sólo para España: En el caso que tu Universidad no tenga correo interno y no dispongas de alias de correo, puedes registrarte como estudiante utilizando un código de activación. Para ello puedes ponerte en contacto con esdream@microsoft.com para que te ayuden en el registro, demostrando previamente que eres estudiante.

Software antirrobo

0

Buenas!!

Voy a compartir con todos un programa que he conocido en la campus party eu. Se trata de prey, un software que permite recuperar tu ordenador en caso de robo.

¿Cómo funciona? El ordenador capta señales wifi y mediante triangulación te manda informes del paradero de tu ordenador, incluso información como programas que se están ejecutando, identificación de la red, y si el portátil dispone de cámara web permite obtener una imagen del ladrón.

También está disponible para android, pero con espectativas de desarrollo en más dispositivos. El código es abierto y disponible para quien quiera desarrollar en el proyecto.

Se puede usar bajo Windows, Linux y Mac.

Su descarga y más info aquí

Saludos!

Problemas con actualizaciones Windows XP SP3

1

Después de un tiempo teniendo problemas con las actualizaciones de Windows Xp, ayer me puse ya seriamente a buscar el problema y por fin he encontrado la solución.

Las actualizaciones se me descargaban de windows update de forma normal, pero al instalarlas me daban error de que no se habian instalado correctamente, a pesar de tener windows original y todo aparentemente normal.

Después de intentar varias opciones y no conseguir ningun resultado, pues al final quien la sigue la consigue.

Miré con detalle el archivo WindowsUpdate.log, que se encuentra en la carpeta C:\WINDOWS.

lo podeis abrir tambien desde el menú inicio->ejecutar, escribir: %windir%\Windowsupdate.log

%windir% corresponde a la carpeta  C:\WINDOWS

Este archivo contiene información sobre las actualizaciones automáticas que se realizan en tu sistema. En el siguiente enlace se explica cómo leer este archivo:

http://support.microsoft.com/kb/902093/es

Como veis en la imagen el error lo podemos ver en la linea “FATAL:…” .Este error corresponde con el ejecutable wuauclt.exe.

Este ejecutable es el encargado de comprobar si hay actualizaciones para el sistema operativo.

(Ojo! existen programas malignos que usan el mismo nombre o similar para pasar desapercibidos en nuestro sistema)

Según Microsoft, este problema ocurre cuando se instala la última
versión del cliente Windows Update y luego se instala el SP3. Provoca que la biblioteca nueva Wups2.dll no quede
debidamente registrada. Al instalar el SP3 en esas condiciones, no
detecta la biblioteca Wups2.dll y registra la Wups.dll original del SP2
y SP3. Dado que los archivos registrados que corresponden a la nueva
Wups2.dll están perdidos, no se puede actualizar el sistema mediante
los servicios convencionales de actualización.

Para ello la solución está en abrir los servicios de windows y detener el servicio de las actualizaciones automáticas.

Inicio->Ejecutar->services.msc


y posteriormente registramos la biblioteca Wups2.dll:

Inicio->Ejecutar-> regsvr32 %windir%/system32/wups2.dll

o bien para x64:   regsvr32 %windir%/syswow64/wups2.dll

Despues volveis a activar el servicio de actualizaciones automáticas y problema resuelto, (aunque bueno, me abstengo en comentario de este tipo de errores).

 

Saludos

 

Servidor ftp

2

Muy buenas.


Hace poco descubrí un programa, que no es nuevo pero si para mi, entonces es por si hay algun despistaillo por ahi como yo…


Si quereis montaros vuestro propio ftp en vuestro pc, podeis utilizar el programa serv-u, lo podeis descargar desde aqui: www.serv-u.com


Es un programa con fácil instalación y configuración, y tendréis de forma sencilla vuestro propio servidor ftp. Lo podeis instalar sobre windows.


En el proceso de instalación os pedirá la IP, que deberá ser fija, si es dinámica no teneis que poner nada; un nombre y os creará un usuario anónimo por defecto.


Una vez instalado lo único que teneis que hacer es agregar los usuarios que querais que accedan a vuestro ftp, les dais un nombre, passwrd, y especificais la ruta de la carpeta que tendrá ese determinado usuario. Luego también se pueden configurar las permisos de acceso que tiene un usuario, limitaciones en las descargas…


Un programa tan sencillo como útil,os animo a probarlo 😉


Saludos

Ir arriba