ReconhecerDistancia
(DepthImageFrame quadro, byte[] bytesImagem, int distanciaMaxima)
{
if (quadro == null || bytesImagem == null) return;
using (quadro)
{
DepthImagePixel[] imagemProfundidade =
new DepthImagePixel[quadro.PixelDataLength];
quadro.CopyDepthImagePixelDataTo(imagemProfundidade);
DepthImagePoint[] pontosImagemProfundidade =
new DepthImagePoint[640 * 480];
kinect.CoordinateMapper
.MapColorFrameToDepthFrame(kinect.ColorStream.Format,
kinect.DepthStream.Format, imagemProfundidade,
pontosImagemProfundidade);
for (int i = 0; i < pontosImagemProfundidade.Length; i++)
{
var point = pontosImagemProfundidade[i];
if ( point.Depth < distanciaMaxima &&
KinectSensor.IsKnownPoint(point) )
{
var pixelDataIndex = i * 4;
byte maiorValorCor =
Math.Max(bytesImagem[pixelDataIndex],
Math.Max(bytesImagem[pixelDataIndex + 1],
bytesImagem[pixelDataIndex + 2]));
bytesImagem[pixelDataIndex] = maiorValorCor;
bytesImagem[pixelDataIndex + 1] = maiorValorCor;
bytesImagem[pixelDataIndex + 2] = maiorValorCor;
}
}
}
}
59
5.3. Aplicação
Casa do Código
Neste ponto você deve executar a aplicação e obter um resultado similar ao da
figura 5.4.
Figura 5.4: Escala cinza por distância (Melhorado)
No universo dos sensores praticamente nada é exato, infelizmente não podemos
obter um resultado perfeito, mas como você deve ter notado após aplicar estas técnicas, o resultado se torna totalmente aceitável e com um nível de precisão bastante impressionante.
Antes de finalizarmos este capítulo é interessante ressaltar um teste nesta apli-cação. Caso você aproxime demais sua mão do sensor ela voltará a ficar colorida, conforme figura 5.5, mesmo com a distância sendo menor do que a distância má-
xima para aplicar escala cinza. Você consegue imaginar por que isso ocorre?
60
Casa do Código
Capítulo 5. Fluxo de Profundidade
Figura 5.5: Escala cinza por distância (Teste)
Isso
ocorre
por
conta
de
nossa
verificação
KinectSensor.IsKnownPoint(point).
No início deste capítulo foi men-
cionado que o Kinect possui uma distância mínima e uma máxima para conseguir
identificar a profundidade de um ponto. Em nosso teste, quando a mão do usuário se aproximava mais do que a distância mínima do sensor ela passava a fazer parte dos pontos cuja distância o sensor não conhece.
61
Capítulo 6
Fluxo de Esqueleto do Usuário
O fluxo de esqueleto do usuário é um fluxo semelhante aos demais já apresentados nos capítulos anteriores, entretanto não há um sensor físico que o cria. Diferente dos outros, este fluxo é um conjunto de processamentos e de sensores que tornam o Kinect capaz de identificar usuários. O termo esqueleto de usuário refere-se à capacidade do Kinect que perceber o usuário e suas articulações, ou seja, com este fluxo conseguimos identificar por exemplo, as coordenadas X, Y e Z da mão do usuário.
Para efetuar o reconhecimento de diferentes tipos e tamanhos de esqueletos a
Microsoft treinou uma rede neural artificial que processa as informações do ambiente tentando encontrar algum usuário. De acordo com a própria Microsoft sua rede neural foi treinada utilizando o conceito de Motion Capture (mocap) de diversos tipos.
Este fluxo é utilizado para criar aplicações baseadas em movimentos, sendo as-
sim, ele pode ser considerado o fluxo mais importante do Kinect, pois praticamente toda aplicação utilizando o Kinect é feita baseada em movimentos.
6.1. Esqueleto do Usuário
Casa do Código
6.1
Esqueleto do Usuário
As informações do usuário são disponibilizadas através de coordenadas X, Y e Z no espaço de coordenadas do Kinect. Como vimos no capítulo anterior, o sensor é capaz de reconhecer até 6 usuários simultaneamente, entretanto, apenas 2 destes usuários terão o esqueleto disponível para a aplicação.
O esqueleto do usuário conta com vinte articulações (frequentemente chamadas
de Joints), sendo que cada uma possui suas próprias coordenadas. As articulações são pontos julgados importantes e através deles obtemos a descrição tridimensional do usuário. A figura 6.1 ilustra todas as articulações
que podem ser obtidas através do sensor.
64
Casa do Código
Capítulo 6. Fluxo de Esqueleto do Usuário
Figura 6.1: Articulações do usuário
Todas as articulações do Usuário estão interligadas essas ligações no contexto de computação gráfica são chamadas de ossos ou bones, mesmo que a ligação não tenha um osso físico propriamente dito para ligá-las.
Movimentos
Existem dois tipos de movimentos que são utilizados a partir do esqueleto do
usuário: poses/posturas e gestos.
Uma pose (também pode ser chamada de postura) é uma forma de manter o
65
6.2. Desenhando o Esqueleto do Usuário
Casa do Código
corpo parado por determinado tempo até que isto tenha algum significado, por
exemplo, quando um auxiliar de arbitragem no futebol nota que o atacante está em posição de impedimento ele ergue sua bandeira e se mantém assim até que o árbi-tro veja e aplique a regra. Gestos são os movimentos propriamente ditos, como por exemplo, um aceno de despedida.