Apesar de ser bastante simples obter informações a respeito do usuário, não
se engane, uma aplicação baseada em movimentos foge bastante da trivialidade.
Lembre-se que geralmente é necessário fazer com que os movimentos sejam detec-
tados independente do esqueleto do usuário, o que pode se tornar um problema, já que as pessoas possuem tamanhos totalmente diferentes, tanto em tamanho total,
quanto em tamanho de um osso. Além disso, quando falamos de gesto, há mais um
complicador: o tempo de execução.
6.2
Desenhando o Esqueleto do Usuário
Vamos continuar com nossa aplicação dos capítulos anteriores. Agora acrescenta-
remos implementações utilizando o fluxo de esqueleto. Nossa implementação irá
desenhar as articulações e o esqueleto do usuário sobre a imagem da câmera que já está implementada.
A primeira coisa a ser feita é desenhar o esqueleto do usuário. Não há um mé-
todo nativo que faça este desenho para nós, então que tal criarmos um método de extensão para a classe SkeletonFrame? Faremos isso, mas dessa vez vamos fazer
a implementação em outras classes em nossa própria aplicação e não em nossa DLL
AuxiliarKinect. Isso porque o desenho será feito utilizando objetos WPF e não
vamos acoplar nossa DLL auxiliar neste tipo de projeto.
Para
começar
vamos
criar
uma
classe
chamada
EsqueletoUsuarioAuxiliar.
Esta classe irá implementar os métodos
para desenhar o esqueleto do usuário, além disso, ela deve receber um objeto
do tipo KinectSensor em seu construtor, pois precisaremos dele para fazer o
mapeamento do esqueleto, conforme o exemplo de código.
public class EsqueletoUsuarioAuxiliar
{
private KinectSensor kinect;
public EsqueletoUsuarioAuxiliar(KinectSensor kinect)
{
66
Casa do Código
Capítulo 6. Fluxo de Esqueleto do Usuário
this.kinect = kinect;
}
}
Agora
precisamos
criar
dentro
desta
classe
o
método
ConverterCoordenadasArticulacao.
Ele irá retornar as coordenadas de
uma articulação convertidas para um plano de duas dimensões.
Utilizaremos
novamente o
CoordinateMapper para fazer esta conversão, mas dessa vez
converteremos um SkeletonPoint para um ColorImagePoint. Este nosso
novo método irá receber por parâmetro a articulação cujas coordenadas se deseja obter e dois valores do tipo double que devem conter os valores referentes à altura e largura do componente da janela em que iremos desenhar as articulações.
É importante lembrar-se de fazer uma regra de três para que a posição da articu-lação se enquadre no tamanho do componente que iremos desenhar nosso esqueleto, esta etapa pode ser ignorada caso o componente tenha exatamente o mesmo tamanho da imagem inserida no formato da ColorStream do Kinect, o método deve
ficar similar ao código a seguir.
private ColorImagePoint ConverterCoordenadasArticulacao
(Joint articulacao, double larguraCanvas, double alturaCanvas)
{
ColorImagePoint posicaoArticulacao =
kinect.CoordinateMapper.MapSkeletonPointToColorPoint
(articulacao.Position, kinect.ColorStream.Format);
posicaoArticulacao.X = (int)
(posicaoArticulacao.X * larguraCanvas) /
kinect.ColorStream.FrameWidth;
posicaoArticulacao.Y = (int)
(posicaoArticulacao.Y * alturaCanvas) /
kinect.ColorStream.FrameHeight;
return posicaoArticulacao;
}
Com este método pronto já podemos converter a posição de nossas articulações,
agora precisamos criar o componente que será desenhado na janela. Criaremos um
método que se chama CriarComponenteVisualArticulacao para fazer este
67
6.2. Desenhando o Esqueleto do Usuário
Casa do Código
trabalho. Este novo método também deve ser inserido na classe que estamos traba-lhando. Para que seja possível desenhar as articulações em forma de círculos em um painel WPF iremos utilizar o objeto Ellipse, logo este método deve retornar um
objeto deste tipo. Para uma maior personalização iremos fazer com que o método
receba por parâmetro: o diâmetro do círculo, a largura da borda e a cor que o círculo será desenhado. A função deste método será utilizar estes parâmetros para a criação e configuração do Ellipse, conforme o código.
private Ellipse CriarComponenteVisualArticulacao
(int diametroArticulacao, int larguraDesenho, Brush corDesenho)
{
Ellipse objetoArticulacao = new Ellipse();
objetoArticulacao.Height = diametroArticulacao;
objetoArticulacao.Width = diametroArticulacao;
objetoArticulacao.StrokeThickness = larguraDesenho;
objetoArticulacao.Stroke = corDesenho;
return objetoArticulacao;
}
Já conseguimos obter as coordenadas da articulação e criar o componente visual
para representá-la, agora criaremos um método que utilize estes dois criados anteriormente para fazer o desenho da articulação em sua posição. Chamaremos este
novo método de DesenharArticulacao, ele deve receber por parâmetro um ob-
jeto Joint que é a representação da articulação do usuário e um objeto Canvas
que é o painel WPF que utilizaremos para desenhar o esqueleto do usuário.
public void DesenharArticulacao
(Joint articulacao, Canvas canvasParaDesenhar)