Recentemente fizemos um evento na faculdade Infórium e tive a oportunidade de falar sobre o bom e velho Kinect. Como é meio difícil explicar passo a passo na palestra ( é pouco tempo) vamos voltar com uma sequência de posts explicando cada parte:
Hoje iremos cobrir a parte da câmera RGB. Se quiser hoje eu consegui fazer um video explicando o passo a passo, então você pode só ver ele.
Tutorial
Nivel: Básico
Objetivo: Mostrar a imagem da câmera do Kinect em sua aplicação.
Video:
Requerimentos
Para usar o SDK, você vai precisar de:
- Visual Studio 2010 (Podendo ser a versão express)
- .NET framework 4.o
- windows 7 ou windows 8 consumer preview
Versão 1.5
Houve muitas mudanças da versão beta do SDK para a 1.5 mas foram para melhor. Alem de uma nomenclatura mais clara de classes e métodos, aumentou consideravelmente os recursos que o SDK disponibiliza.
A versão 1.5 ainda traz varias novidades com relação a 1.0, entre elas o SDK de localização de face (Posição dos olhos, sobrancelhas, etc..) e a capacidade de rastrear pessoas sentadas (para uma lista com todas as melhorias clique aqui)
Se você já desenvolveu para a versão 1.0 do Kinect SDK então você não deverá ter problemas com essa versão!
Arquivos necessários
No site oficial do Kinect SDK, você irá encontrar 3 downloads:
* Kinect SDK - provê os drivers necessários para programar para o Kinect. (Necessário)
* Kinect Toolkit – Traz vários exemplos, códigos e documentação. ( É extramente recomendável o download desse)
* Language Packs – Pacote de línguas para permitir o reconhecimento de voz do Kinect. (Infelizmente ainda não tem português )
Se você instalou o developer toolkit então basta executa-lo para mostrar todos os exemplos/documentos ( tem uns MUITOS INTERESSANTES )
Precisa de alguma ajuda ou exemplo? Clique em algum e seja feliz!
Começando a usar a “mágica”:
Agora que ja está tudo instalado, vamos criar um novo projeto no Visual Studio:
No meu caso estou criando um projeto WPF, mas fique a vontade para criar um outro tipo
E depois vamos adicionar a referência ao Microsoft.Kinect ( que é o Kinect SDK que acabamos de baixar):
Agora estamos prontos! Bora programar!
Dentro do MainWindow.cs (code-behind da janela principal) vamos colocar um using e criar uma variável do KinectSensor que representará o nosso sensor:
using Microsoft.Kinect;
namespace TesteCameraRGB
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
// Nosso Sensor
KinectSensor sensor;
...
O Kinect SDK permite que você tenha mais de 1 Kinect conectado ao sistema, então dentro do construtor do MainWindow vamos fazer isso:
public MainWindow()
{
InitializeComponent();
// Verificamos quantos sensores estão conectado
if (KinectSensor.KinectSensors.Count > 0)
{
// Pega o sensor conectado
sensor = KinectSensor.KinectSensors[0];
Agora habilitamos a função que queremos do Kinect, e adicionamos um evento no ColorStreamReady ou AllFrameReady:
//Habilita a camera RGB sensor.ColorStream.Enable(ColorImageFormat.RgbResolution640x480Fps30); // Associo o evento ao AllFrameReady sensor.AllFramesReady += new EventHandler<AllFramesReadyEventArgs>(sensor_AllFramesReady);
// Inicio o sensor sensor.Start();
A diferença entre os dois eventos é: O ColorStreamReady é responsável apenas pelo stream de cores e só será disparado quando o stream de cores tiver disponível, enquanto com AllFrameReady você tem acesso a todos os streams e será disparado depois de que todos os streams tiverem prontos, por isso se tiver um stream que é 15fps e outro 30fps o AllFramesReady será disparada na velocidade do mais lento ( nesse caso 15fps) fazendo você perder alguns ‘pacotes’ se a velocidade for diferente.
E depois disso nós usamos o método Start() para inicializar o Kinect.
Excelente! Antes de prosseguirmos vamos voltar ao modo de design e adicionar uma imagem dentro do grid:
<Grid>
<Image Height="287" HorizontalAlignment="Left" Margin="12,12,0,0" Name="imgKinect" Stretch="Fill" VerticalAlignment="Top" Width="479" />
</Grid>
Estou chamando ela de imgKinect e ela que irá mostrar o “vídeo” do kinect.
“Mas como uma imagem irá mostrar um vídeo?” - Um vídeo é só um conjunto de imagens que passam muito rápidas, e cada vez que o kinect entrar no nosso evento (aproximadamente 30 vezes por segundo) ele atualizará a imagem.
Continuando dentro do design, vamos implementar o evento Unloaded de window:
E dentro do MainWindow.cs vamos implementar esse evento:
private void Window_Unloaded(object sender, RoutedEventArgs e)
{
// Se existir um sensor para ele
if (sensor != null)
{
sensor.Stop();
sensor.Dispose();
}
}
Lembre de sempre desativar o Kinect quando o seu sistema não precisar usar-lo!
Agora só falta uma ultima coisa! Vamos implementar o evento AllFrameReady:
/// <summary>
/// A cada vez que o kinect detectar uma imagem ele passará aqui
/// </summary>
void sensor_AllFramesReady(object sender, AllFramesReadyEventArgs e)
{
// Pego o frame de cor
using (ColorImageFrame cframe = e.OpenColorImageFrame())
{
// Se não vier nada então sai do metodo
if (cframe == null)
return;
// Array de bytes com o tamanho do frame
byte[] cbytes = new byte[cframe.PixelDataLength];
// Copio os bytes para o array de bytes
cframe.CopyPixelDataTo(cbytes);
// Numero de bytes por linha / width * (R G B Vazio)
int stride = cframe.Width * 4;
// Cria um bitmap baseado nos bytes, passando o tamanho da imagem (640x480), o dpi (no nosso caso é um padrão 96x96 mesmo)
// passando o formato do pixel (32 bits), a paleta (nulo), os bytes (cbytes) e o stride)
imgKinect.Source = BitmapImage.Create(640, 480, 96, 96, PixelFormats.Bgr32, null, cbytes, stride);
}
}
Detalhe que o Kinect não retorna imagens nem nada bonitinho para gente, apenas bytes e o trabalho de conversão fica sendo todo nosso. Mas mesmo que pareça confuso de inicio você vai ver que o Kinect SDK não é nenhum bicho de 7 cabeças.
pois é… estamos cortando custos na parte de designer =/
Então eu vou ficar por aqui… Ja estou criando mais artigos ( com videos! ) sobre o kinect e vamos tentar cobrir todas as partes (do mais basico como hoje, ao mais avançado).
Por hoje é só, qualquer duvida, no video eu crio esse projeto do zero e explico ( pelo menos tento) parte por parte.
Espero que tenham entendido, ate mais.
[EDITADO]
Segue a coleção completa de artigos (até agora):




Comment
Rafael
31 de maio de 2012 at 14:17Olá André,
Achei o seu post muito interessante. Gostaria de saber se você fará um tutorial nesse estilo falando como desenvolver uma aplicação para mostrar os skeletons, inclusive mudando os modos de traking (closest1player, sticky1player, etc..)
Desde já, agradeço.
André Castro
31 de maio de 2012 at 14:23Olá Rafael! Obrigado pelo feedback! Sim eu tenho o objetivo de fazer um post para todas as partes do kinect, depth, skeleton e até o novo face tracking. E todos com um video (de preferência mostrando como criar a aplicação do zero). O próximo post é o depth ( que eu queria terminar essa semana, mas não sei se consigo por causa do vídeo e tal).
Abraços,
Bruno
5 de junho de 2012 at 12:52Parabéns pelo Post André, ficou muito bom! Simples e direto.
Já acompanhava seus posts sobre o SDK anterior e continuarei acompanhando essa “série” com o SDK 1.5.
Parabéns pela iniciativa!
Allyson
10 de junho de 2012 at 0:15Olá Rafael, sou do IFRN e estou desenvolvendo um projeto de pesquisa que consiste na criação de uma aplicação para o kinect. Gostaria saber se você quer apoiar a pesquisa, estamos com algumas dificuldades, com relação a conhecimentos técnicos do SDK. Desde de já gostaria de parabenizar o seu trabalho, sem dúvidas, é uma iniciativa excelente. Contato: allison_jc@hotmail.com
Inácio
5 de agosto de 2012 at 13:54Olá André, parabéns pelos posts. Estou começando a desenvolver uma aplicação que vou usar para meu TCC e gostaria de esclarecer uma dúvida.
A versão 1.5 da SDK funciona para o Kinect do X-BOX ou somente para o Kinect para Windows?
André Castro
5 de agosto de 2012 at 15:01Qualquer um dos dois serve, no meu caso mesmo eu estava usando o do XBOX!
Leonardo
13 de agosto de 2012 at 1:45Parabéns pelo post André, ficou muito bom! Foi o primeiro “passo” para o desenrolar de meu TCC. Parabéns pela iniciativa. Ansioso por novos vídeos.
Jaderson Webler
24 de agosto de 2012 at 19:04Muito bom o post, me ajudou muito, parabéns!
Ramon Cidade
24 de outubro de 2012 at 8:13Finalmente um post de verdade!
Dá pra ver que você realmente criou este tutorial e não traduziu de algum site gringo como tenho visto por aí…
Vai me ajudar muito no meu TCC!
Parabéns amigo!
João Gomes
5 de novembro de 2012 at 13:08Parabéns pelo video, ta me ajudando muito. Estou desenvolvendo um sistema de segurança usando o kinect, como faço pra saber se algo está se movendo na frente do kinect, se qualquer coisa se mover quero disparar um alarme. Poderia me ajudar?
Desde já agradeço, um grande abraço…
André Castro
12 de novembro de 2012 at 10:48Ola João, desculpe a demora, então, você pode usar esse artigo como referência:
http://www.100loop.com/destaque/kinect-sdk-1-5-parte-4-esqueleto/
sempre que o myskeleton não for nulo, terá alguém na frente do Kinect.
Abraços
João Gomes
14 de novembro de 2012 at 13:40O exemplo quatro está com um erro. Você utilizou algum outro framework ou biblioteca além da microsoft.kinect? Não estou conseguindo fazer funcionar.. Abraços.
João Gomes
19 de novembro de 2012 at 22:02Como faço pra tirar uma foto utilizando o kinect? Quero tirar a foto e armazenar o arquivo da mesma.
Agradeço pela força, ta me ajudando muito. Abraços
Michelle Harumi
30 de novembro de 2012 at 14:40Olá, adorei o seu tutorial… Pretendo utiliza-lo no computador igual a você, você por um acaso sabe adiferença entre o kinect do Xbox ou o kinect for windows? De acordo com o seu comentário, é possível usar o do Xbox no computador. Então porque gastar 1000 reais em algo que já tenho?
Trackbacks