Update 17/05/2012 –

A nova versão do Kinect SDK foi lançada a pouco tempo e deixou todo esse conteúdo desatualizado. Já estou preparando novo material que será adicionado em breve.  Aguardem!

 

 

Fala Filhotes! Hoje será uma dica bem simples, só para manter o assunto “quente”.

Lembra da primeira vez que você viu um Kinect de perto e quando ele ligou ele se movimentou para cima e para baixo? Então, graças ao SDK do Kinect você consegue movimentar ele programaticamente hoje. Então vamos por a mão na massa!

Limitações

“Beleza então é agora que meu Kinect vai ficar ‘dançando’ sem parar!”
Errado! Com grandes poderes vêm grandes responsabilidades!

De acordo com a documentação oficial, seu código não deve alterar a inclinação da câmera mais de uma vez por segundo ou mais de 15 vezes em um período de 20 segundos. O SDK limita a quantidade de vezes que uma aplicação consegue alterar a inclinação do sensor, se tentar mover demais o SDK irá desabilitar a movimentação por um curto tempo e toda nova chamada resultará em uma exceção.ben

O motor do Kinect não foi feito para uso constantes ou repetitivos, por isso
para evitar o desgaste use-o sabiamente, de preferência apenas quando sua aplicação for iniciada.

 

Agora que você entendeu que apesar de legal (e muito útil algumas vezes) essa inclinação do sensor pode sair muito caro, vamos ao que importa!

Nosso Projeto

Usaremos um projeto idêntico ao do Channel9 para demonstrar essa funcionalidade. Será um WPF (como nossos projetos antigos) com um slider, um button e uma image.
A image mostrará a imagem da câmera do Kinect, o slider e o botão alteram a elevação. Para alterar a elevação do sensor basta alterar o valor de NuiCamera.ElevationAngle (dentro da NUI) com um valor entre –27 e +27.

Códigos

O nosso XAML vai ficar assim:

<Window x:Class="ElevacaoKinect.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="740" Loaded="Window_Loaded" Unloaded="Window_Unloaded">
    <Grid>
        <Slider Height="36" HorizontalAlignment="Left" Margin="27,68,0,0" Maximum="27" Minimum="-27" Name="slider1" VerticalAlignment="Top" Width="143" />
        <Button Content="Movimenta" Height="23" HorizontalAlignment="Left" Margin="62,120,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
        <Image Height="250" HorizontalAlignment="Left" Margin="359,27,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="300" />
    </Grid>
</Window>

Lembre de referenciar as bibliotecas do Kinect e do Coding4Fun! Agora usaremos o que aprendemos no ultimo post (para inicializar a camera RGB do Kinect):

        // Nossa NUI
        Runtime kinectNui = new Runtime();

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //  Inicializando com uma opção qualquer
            kinectNui.Initialize(RuntimeOptions.UseColor);
            // Adiciona o handler
            kinectNui.VideoFrameReady += new EventHandler<ImageFrameReadyEventArgs>(nui_VideoFrameReady);
            // Abre o stream
            kinectNui.VideoStream.Open(ImageStreamType.Video, 2, ImageResolution.Resolution640x480, ImageType.Color);
        }

        void nui_VideoFrameReady(object sender, ImageFrameReadyEventArgs e)
        {
            // Usando o método de extensão do Coding4Fun
            image1.Source = e.ImageFrame.ToBitmapSource();
        }

        private void Window_Unloaded(object sender, RoutedEventArgs e)
        {
            // Desinicializa o NUI
            kinectNui.Uninitialize();
        }

E agora sim,  adicionaremos El Código (“o código” em espanhol) da elevação:

        /// <summary>
        /// Evnto do botão que altera a elevação
        /// </summary>
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            // Altera a elevação
            kinectNui.NuiCamera.ElevationAngle = (int)slider1.Value;
        }

E pronto, só isso! o resultado será uma tela assim:

Infelizmente eu não tenho uma webcam aqui para mostrar o Kinect se movendo, mas cada “travada” é um movimento do Kinect. Vocês podem baixar o código fonte aqui: https://skydrive.live.com/?cid=3fb03b308068885d&sc=documents&uc=1&id=3FB03B308068885D%21253#

Bom, espero que tenham gostado, prometo que a próxima vez trarei um assunto realmente “supimpa”. Aguardem!

Referências

http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/docs/ProgrammingGuide_KinectSDK.pdf

http://channel9.msdn.com/Series/KinectSDKQuickstarts/Camera-Fundamentals