public static KinectSensor
InicializarPrimeiroSensor(int anguloElevacaoInicial)
{
KinectSensor kinect =
KinectSensor.KinectSensors.First(sensor =>
10
Casa do Código
Capítulo 2. Primeira aplicação com o sensor
sensor.Status == KinectStatus.Connected );
kinect.Start();
kinect.ElevationAngle = anguloElevacaoInicial;
return kinect;
}
Notou como foi simples? Apenas com algumas linhas de código podemos obter
o nosso sensor, iniciar o seu processamento e alterar a angulação do eixo motorizado.
Agora você deve colocar uma chamada para este método em nossa aplicação.
Procure pela classe MainWindow, apesar de ela ser uma janela não iremos alte-
rar em nada a parte visual, então se preocupe apenas com o arquivo C# (MainWin-
dow.xaml.cs). Além de ter adicionado a referência ao assembly Microsoft.Kinect adicione também a referência para a DLL que criamos no projeto AuxiliarKinect.
Lembre-se
também de utilizar a diretiva using para estes mesmos assemblys dentro da classe MainWindow.
Nesta aplicação, além de inicializarmos com a configuração padrão do Kinect
precisamos habilitar o rastreamento de esqueleto, pois é isto que irá nos permitir verificar a posição espacial da mão e da cabeça do usuário. Então vamos criar um método chamado InicializarKinect para fazer as operações supracitadas.
private void InicializarSensor()
{
KinectSensor kinect = InicializadorKinect
.InicializarPrimeiroSensor(10);
kinect.SkeletonStream.Enable();
}
Com nossa DLL, ficou muito simples inicializar o sensor! Agora no construtor
da classe após a chamada do método InitializeComponent que já está presente
por padrão em todas as janelas, crie uma chamada para este método. Depois conecte o sensor ao seu computador e execute a aplicação, viu o que aconteceu? A aplicação já está reconhecendo o sensor e posicionando o ângulo de elevação de seu eixo motorizado!
2.2
Criando a regra de nossa aplicação
Para armazenar o resultado da comparação de altura entre a mão direita do usuário e sua cabeça iremos criar a propriedade bool MaoDireitaAcimaCabeca. Já con-11
2.2. Criando a regra de nossa aplicação
Casa do Código
figuramos o sensor e criamos a propriedade que irá armazenar o resultado de nossa regra, mas ainda não escrevemos o código que, de fato, valida esta regra e exibe a mensagem para o usuário. Onde esta regra deve ser escrita? Antes de respondermos precisamos entender mais um conceito envolvido na programação com o Kinect.
Não iremos entrar em muitos detalhes nesta primeira aplicação, mas é impor-
tante saber que o Kinect atualiza um conjunto de informações em forma de quadros ou frames. Em sua configuração padrão, a cada segundo o Kinect cria 30 quadros, e cada quadro possui seu conjunto próprio de informações.
Agora criaremos o método que executa nossa regra, para fazer esta validação
precisamos das informações referentes ao esqueleto do usuário. Elas estão encapsuladas na classe SkeletonFrame, então o método que irá executar a regra deve
receber um objeto deste tipo por parâmetro.
O rastreamento de esqueleto do usuário do Kinect pode identificar até
seis esqueletos simultâneos e todos estes esqueletos estão no objeto da classe
SkeletonFrame. Teremos que extrair a informação sobre os esqueletos do qua-
dro e logo em seguida, vamos buscar pelo primeiro esqueleto de usuário que o Kinect esteja visualizando caso exista algum, faremos a validação para nossa regra e exibiremos a mensagem. O código a seguir descreve como este método deve ser
escrito.
private void ExecutarRegraMaoDireitaAcimaDaCabeca
(SkeletonFrame quadroAtual)
{
Skeleton[] esqueletos = new Skeleton[6];
quadroAtual.CopySkeletonDataTo(esqueletos);
Skeleton usuario =
esqueletos.FirstOrDefault( esqueleto =>
esqueleto.TrackingState == SkeletonTrackingState.Tracked );
if (usuario != null)
{
Joint maoDireita = usuario.Joints[JointType.HandRight];
Joint cabeca = usuario.Joints[JointType.Head];
bool novoTesteMaoDireitaAcimaCabeca =
maoDireita.Position.Y > cabeca.Position.Y;
if ( MaoDireitaAcimaCabeca !=
novoTesteMaoDireitaAcimaCabeca)
12
Casa do Código
Capítulo 2. Primeira aplicação com o sensor
{
MaoDireitaAcimaCabeca =
novoTesteMaoDireitaAcimaCabeca;
if (MaoDireitaAcimaCabeca)
MessageBox
.Show("A mão direita está acima da cabeça!");
}
}
}
No código anterior copiamos todas as informações dos esqueletos de usuário
para um array, depois verificamos se existe algum esqueleto que possua o estado tracked (rastreado), caso exista executamos nossa regra para este esqueleto.
Agora precisamos inserir uma chamada a este método em algum lugar da nossa
aplicação, onde devemos fazer isso?
Cada vez que o Kinect processa as informações a respeito do esqueleto
de todos os usuários e gera um novo quadro, a classe
KinectSensor dis-
para um evento que teremos que interpretar.
Neste evento é fornecido um
objeto do tipo
SkeletonFrameReadyEventArgs.
Este objeto possui di-
versas propriedades e entre eles está o objeto
SkeletonFrame que deve-