de sua janela deve ficar similar a este:
<StackPanel Grid.Row="2" Orientation="Horizontal">
<CheckBox Name="chkEscalaCinza"
Content="Escala cinza" Margin="10,10,0,10"
HorizontalAlignment="Left" />
<CheckBox Name="chkEsqueleto"
Content="Esqueleto do Usuário"
HorizontalAlignment="Left"
Margin="10,10,0,10"/>
</StackPanel>
Além de inserir o componente na janela, também é necessário fazer a validação
81
6.2. Desenhando o Esqueleto do Usuário
Casa do Código
deste CheckBox antes de utilizar o método para desenhar o esqueleto, então nosso método que interpreta o evento AllFramesReady deve ficar assim:
private void kinect_AllFramesReady
(object sender, AllFramesReadyEventArgs e)
{
byte[] imagem = ObterImagemSensorRGB(e.OpenColorImageFrame());
if( chkEscalaCinza.IsChecked.HasValue &&
chkEscalaCinza.IsChecked.Value )
ReconhecerDistancia(e.OpenDepthImageFrame(),
imagem, 2000);
if (imagem != null)
canvasKinect.Background = new ImageBrush(
BitmapSource
.Create( kinect.ColorStream.FrameWidth,
kinect.ColorStream.FrameHeight,
96, 96, PixelFormats.Bgr32, null,
imagem,
kinect.ColorStream.FrameBytesPerPixel
* kinect.ColorStream.FrameWidth
)
);
canvasKinect.Children.Clear();
if ( chkEsqueleto.IsChecked.HasValue &&
chkEsqueleto.IsChecked.Value )
DesenharEsqueletoUsuario(e.OpenSkeletonFrame());
}
Feito isso, por padrão visualizaremos apenas a imagem da câmera do Kinect e
temos a opção de marcar o CheckBox Esqueleto do Usuário para quando dese-
jarmos visualizar o esqueleto do usuário.
82
Capítulo 7
Rastreando e Identificando
Movimentos
Neste capítulo continuaremos a utilizar o fluxo de esqueleto como no capítulo anterior, mas dessa vez focaremos na interação com o aplicativo através de movimentos.
Este método de interação pode trazer uma grande experiência ao usuário, porém
temos de levar em consideração que há alguns desafios para implementar uma boa
usabilidade com nossos movimentos. É importante para o usuário que os movi-
mentos tenham dificuldades de acordo com seu contexto, por exemplo, em um jogo
pode ser que um movimento complicado faça parte do desafio, porém se o usuário
está utilizando movimentos para navegar em um aplicativo ou acionar atalhos, eles devem ser fáceis e naturais.
Os
movimentos precisam ser bem diferenciados, evite criar movimentos simila-
res com funcionalidades diferentes, pois a interpretação de movimentos está sujeita a erros e é frustrante para a experiência do usuário acionar uma funcionalidade por acaso ao tentar executar outra.
7.1. Iniciando a Estrutura Base para Detectar Movimentos
Casa do Código
É importante conhecer o público alvo de sua aplicação e é necessário tomar pre-
cauções quanto ao tamanho do esqueleto de cada usuário e o tamanho do osso entre as articulações de cada usuário. Procure sempre fazer comparações proporcionais ao próprio esqueleto, dessa forma a interpretação do gesto se mantém consistente independente do tamanho do esqueleto.
Testar e experimentar é fundamental quando se fala de aplicações voltadas a in-
terfaces naturais. Você pode desenvolver uma aplicação baseada em movimentos
que funciona perfeitamente para você, mas que não atende seu público alvo, por-
tanto procure fazer testes, avaliar e reimplementar quantas vezes forem necessário a fim de melhorar cada vez mais a experiência do usuário.
A ideia principal da implementação do capítulo anterior é que o usuário visua-
lize seu esqueleto apenas quando desejar, isso é uma boa ideia, mas há um problema de usabilidade em nossa implementação. Quando o usuário estiver se vendo no ví-
deo exibido por nossa aplicação, ele poderá estar longe de seu computador e isso irá impossibilitá-lo de visualizar seu esqueleto naquele momento. Este mesmo problema também pode ser aplicado para quando o usuário deseja aplicar o filtro de escala cinza.
Para resolvermos isso iremos implementar o rastreamento e a identificação de
movimentos para acionar atalhos, o que pode ser bastante trabalhoso, mas monta-
remos uma estrutura na DLL AuxiliarKinect para nos ajudar.
7.1
Iniciando a Estrutura Base para Detectar Movi-
mentos
Primeiro vamos criar uma nova pasta no projeto AuxiliarKinect chamada
Movimentos. Nela serão criadas todas as classes ligadas à lógica para rastrear e identificar as poses e gestos que desenvolveremos ao longo deste livro.
Todos os movimentos em nossa aplicação poderão estar em um dos três esta-
dos de rastreamento: não identificado, em execução e identificado. Para podermos ter esses valores em nossa aplicação iremos criar um arquivo com a enumeração
EstadoRastreamento, conforme o código a seguir.
public enum EstadoRastreamento
{
NaoIdentificado,
EmExecucao,
84
Casa do Código
Capítulo 7. Rastreando e Identificando Movimentos
Identificado
}
Após isso, criaremos a primeira classe que se chamará Movimento, ela será uma
classe base para todos os movimentos (poses e gestos) de nossa aplicação. Esta classe deve ser abstrata e possuir as propriedades e métodos que todo tipo de movimento tem. Todo e qualquer tipo de movimento envolve tempo de execução, sendo assim,