desenvolvimento de interface naturais de interação usando o hardware kinect
DESCRIPTION
O curso apresentará, de forma prática, os conceitos do desenvolvimento de aplicações para Interface Naturais de Usuário usando o hardware Kinect. Visa-se dar uma visão geral dos frameworks de desenvolvimento, com uma ênfase no OpenNI, seguida por uma discussão sobre o processo de desenvolvimento de tais aplicações. Durante a apresentação serão abordadas aplicações exemplos.TRANSCRIPT
Desenvolvimento de Interfaces Naturais de Interação usando o
Hardware Kinect
Roteiro• Evolução das interfaces de usuário e de seus dispositivos
• Evolução dos dispositivos de games
• O que é o Kinect?
o Como funciona
o Origem do dispositivo
o Possibilidades de uso
• Desenvolvimento
o Middlewares e frameworks
o Comparações de frameworks existentes
o Samples e Produtos Corollarium+Kinect
o Desenvolvendo com a OpenNI
Uma interface de usuário é o sistema pelo qual as pessoas (usuários) interagem com uma máquina. A interface do usuário inclui hardware (físico) e software (lógico) componentes. Interfaces de usuário existe para vários sistemas, e fornecer um meio de:
• Entrada: permitindo que os usuários manipulem um sistema • De saída: permitindo que o sistema para indicar os efeitos da manipulação dos utilizadores
Interface de usuário
• 1ª Interface computacional interativa
• Inserção de comandos por texto
• Comandos numerosos e compostos
• Devem ser decorados pelo utilizador
• Curva de aprendizagem e adaptação maior
Command Line Interface (CLI)
Dispositivo de entrada para CLI
• Janelas, botões, menus, caixas de opção, caixas de seleção e ícones (WIMP)
• Controle artificial
• Operações devem ser aprendidas por meio de botões
Graphic User Interface (GUI)
Dispositivos de Entrada para GUI
• Exige apenas que o usuário seja capaz de interagir com o ambiente por meio de interações previamente já conhecidas
• Aprendizagem facilitada, não exigindo que o usuário seja apresentado à um novo dispositivo entrada
• Interação com o computador de um modo efetivamente invisível, ou tornando-se invisível com sucessivas interações aprendidas.
Natural User Interface (NUI)
Segundo Weiyuan (2011), a NUI possuí as seguintes características:
• Design centrado no usuário• Largura de banda alta • Multi canal • Simples e natural• Interação baseada por imagens• Interação baseada por voz • Interação baseada no comportamento
Características de NUI
• Touch screens• Sensores de movimento (acelerômetros)• Câmeras de profundidade (3D)• Sensores de áudio
Dispositivos comuns para NUI
Evolução das Interfaces de usuário
Consoles e a NUI
Vídeo da evolução dos dispositivos de controle para consoles
http://vimeo.com/18743950 - History of Gaming - by Florian Smolka
Fonte: http://www.ifixit.com/Teardown/Microsoft-Kinect-Teardown/4066/1
O dispositivo Microsoft Kinect*
Principais Características
• Câmera RGB 640x480 – VNA38209015• IR CMOS 320x240 - OG12 / 0956 / D306 / JG05A • IR Projetor - Diodo laser de 830 nm - OG12 / 0956 / D306 / JG05A• LED de estatus
• Motor de inclinação vertical
• A profundidade consiste em uma fonte de luz infravermelha (IR) que projeta um padrão de pontos
• A câmera IR detecta partes refletidas do padrão de pontos e converte suas intensidades em distâncias
• Cada quadro gerado pelo sensor de profundidade possui resolução VGA (320 × 240 pixels), contendo valores de 11 bits de profundidade que oferece 2048 níveis de sensibilidade. O fluxo de saída é executado em 30 quadros por segundo
Profundidade
http://www.primesense.com/en/technology/115-the-primesense-3d-sensing-solution
• A câmera RGB utiliza resolução padrão (640 x 480) VGA e uma taxa de quadros 30 Hz
• A matriz de áudio consiste de quatro microfones, com cada canal de processamento de áudio de 16 bits a uma taxa de amostragem de 16 kHz. O hardware inclui a supressão de ruído ambiente
Áudio e RGB
• O Kinect para XBOX 360 utiliza 12 volts, mais do que a fornecida por uma porta USB padrão (5 volts).
• É necessário conectar o dispositivo na porta USB do PC e em uma fonte de alimentação separada para o Kinect para funcionar corretamente.
• O Kinect para PC, o qual não utiliza fonte auxiliar.
Alimentação
Implementado no Kinect, é capaz de capturar os dados do sensor infravermelho, fornecendo dados de profundidade em tempo real.
http://www.primesense.com/en/component/content/article/9-solutions/114-the-ps1080
PrimeSense PS1080-A2 - SoC image sensor processor
The PrimeSensor™ Technology
The PrimeSensor
http://event.asus.com/wavi/http://us.estore.asus.com/index.php?l=product_detail&p=3397
Dispositivos da ASUS com tecnologia PrimeSense
Dispositivo Xtion PRO LIVE
Brasil ≈ R$500*EUA = $$129.99
Consulta data 26/01/2012
EUA = $$149.00
EUA ≈ $200.00
EUA = $199.00
Microsoft Kinect para Xbox 360
Xtion PRO LIVE
Xtion PRO
PrimeSensor
Comparações de preço no Mercado
Suas características e benefícios são amplos, podendo ser aplicados em áreas como :
• Robótica• Realidade virtual• Vigilância• Educação (fisioterapia etc..)• Captura de movimento de pessoas ou objetos• Rastreamento• Captura de vídeo ou imagem 3D
Pode ser usado para desenvolvimento de aplicações NUI
Microsoft Kinect e a NUI
Existem diversas ferramentas de desenvolvimento, cada uma com suas características.
Ferramentas de Desenvolvimento
OpenKinect é uma comunidade de pessoas interessadas em utilizar o Microsoft Kinect em computadores e outros dispositivos criando bibliotecas livres para que o Kinect seja utilizada em diferentes plataformas
• O projeto surgiu na corrida para ganhar acesso do Microsoft Kinect no PC• Héctor Martin liberou o código da libfreenect no Github• Primeiro commit em 10 Novembro de 2010• 17 de dezembro já foi implementado libfreenect plataforma win32 • A libfreenect compõe classes de desenvolvimento para acesso ao hardware
do dispositivo.
Código fonte disponível em: https://github.com/OpenKinect/libfreenect
Google Groups: OpenKinect#openkinect - Freenode
• Imagens de profundidade e RGB• Motor (posição de orientação vertical)• Acelerômetro• LED de status• Áudio • Bindings e extensões (C#, C++ , Python, Java , AS3)• Suporte nas plataformas Windows, GNU/Linux e OS X
Imagem de profundidade Imagem RGB
libFreenect
• Não possui integração com a NITE (middleware NUI)
• Derivada da engenharia reversa do driver oficial do Kinect
• A OpenKinect não é um framework • A libfreenect é apenas um modulo, uma API para
acesso ao hardware do dispositivo Microsoft Kinect
libFreenect
• PrimeSense reconhece o interesse e as realizações da comunidade de código aberto sobre o Kinect
• Surgi um mês depois da libfreenect ser lançada em 09 de dezembro 2010
• Lança seus drivers do PrimeSensor em (LGPLv3+)• A OpenNI framework (LGPLv3+)• API para o desenvolvimento de aplicações que
necessitam de interação natural• É lançado o fork do Sensor Drive do PrimeSensor da
OpenNI para o Kinect (SensorKinect by Avin2)• Promove iniciativas sem fins lucrativos de utilização da
NUIGoogle Groups: OpenNI
• É um framework que fornece uma API para o desenvolvimento de aplicações que necessitam de interação natural.
• API abrange a comunicação com dispositivos de baixo nível (por exemplo, sensores de visão e áudio), bem como soluções de alto nível (por exemplo, o acompanhamento visual utilizando visão computacional).
• O framework está escrito e distribuído sob a GNU Lesser General Public License (LGPL)
• A modularidade do framework OpenNI permite sua fácil integração com outros softwares.
• Um exemplo interessante é a integração com o motor gráfico Ogre3D
• O NITE é um middleware usado pela interface OpenNI, e desenvolvido pela PrimeSense.
• Apesar de possuir código fechado, é gratuito e pode ser usado comercialmente.• Responsável por identificar os usuários na imagem e rastrear seus movimentos, além de prover uma API que detecta gestos.
• Modos de operação: ● Rastrear mãos, com detecção de gestos em
particular● Rastrear o corpo todo (esqueleto)
• Controle das Mãos: permite ao usuário o controle de dispositivos digitais por meio de suas mãos.
• Controle total do corpo: permite ao usuário uma experiência imersiva, como em um vídeo game
Rastreamento de mãos
Coordenadas das mãos em relação ao dispositivo (X,Y e Z) Detecção de gestos (Push, swipe, steady, wave, circle)
Rastreamento de mãos
Pontos rastreados das juntas do corpo capaz de capturar X,Y e Z em relação ao dispositivo.
http://www.openclipart.org/people/harmonic/Vitruvian_Man.svg
X
Rastreamento de esqueleto
• O Microsoft Kinect SDK 1.0 para Windows
• Destinado aos sistemas operacionais Windows 7 e Windows Embedded Standard
• O SDK fornece suporte para os componentes de hardware do dispositivo Kinect.
• É um SDK proprietário, sendo a distribuição de licença, para o uso comercial, vinculada ao somente ao dispositivo Microsoft Kinect para Windows.
Microsoft Kinect SDK para Windows
OpenKinect OpenNI Microsoft Kinect SDK v1.0
Licença LGPLv3+ LGPLv3+(Nite tem código fechado mas que pode ser usado comercialmente)
Proprietária e uso não comercial para o Microsoft Kinect para Xbox360.
Hardware Microsoft Kinect para Xbox360 e Microsoft Kinect para Windows
Qualquer compatível com padrão OpenNI
Microsoft Kinect
Driver libfreenect SensorKinect Avin2 Microsoft Kinect SDK v1.0
Multiplataforma de S.O Sim Sim Não
Múltiplos Kinects Sim Sim Sim
Câmera RGB Sim Sim Sim
Câmera Infravermelho Sim Sim Sim
Projetor Infravermelho Sim Sim Sim
LED de estatus Sim Sim Não
Motor de inclinação vertical Sim Não Sim
Vetor de microfones Implementado Não Sim
Detecção de gestos Implementação a partir do OpenCV
Sim, pelo middleware *
Detecção do esqueleto Não Sim, pelo middleware Sim
Detecção da mãos e módulos de reconhecimento de gestos
Não Sim, pelo middleware Não
Análisador de cena Não Sim Não
Desenvolvimento com a
Topologia de arquitetura OpenNI
• Camada do topo:o Representa a aplicação desenvolvida que
implementa NUI com a OpeNI.
• Camada do meio: o Representa a OpenNI, oferecendo interfaces
de comunicação que interagem tanto com os sensores e os componentes middleware, que analisam os dados do sensor.
• Camada de baixo:o Mostra os dispositivos de hardware que captam
os elementos visuais e de áudio da cena.
OpenNI Arquitetura
• A OpenNI é uma camada abstrata que provê a interface para ambos: sensores físicos e componentes de middleware
• Múltiplos componentes podem ser registrados ao framework
• Estes componentes são referenciados como módulos
• Selecionar e requerer um dispositivo, ou mesmo um componente de middleware, é simples e flexível de implementação
Módulos (Componentes)
•Sensor 3D
•Câmera RGB
•Câmera Infra-vermelho
•Dispositivo de Áudio (vetores de microfones, no caso do Kinect)
OpenNI - Módulos de Sensor
• Análise de Corpo: um componente de software que processa os dados do sensor e gera o esqueleto
• Análise de Mãos: processa os dados e gera a localização das mãos
• Análise de Gestos: identifica gestos pré definidos, por exemplo, movimento balanço das mãos.
• Análise de cena: componente que analisa a imagem da cena como um todo, gerando informações como:
o A separação entre foreground e background;
o As coordenadas do plano; e
o A indentificação única das figuras na cena.
OpenNI - Módulos Middleware
Cenário de desenvolvimento
• A OpenNI é uma interface de alto-nível.
• O OpenNI define Production Node (nós de produção)
conjunto de componentes que estabelecem o processo de
criação de dados necessários para aplicações baseadas em
NUI.
• Cada nó encapsula a funcionalidade que se relaciona com a
geração do tipo de dados específicos.
• Contudo, é definido apenas o protocolo enquanto a lógica de
geração de dados deve ser implementada pelos módulos que
se ligam a OpenNI
OpenNI- Desenvolvimento
• A aplicação que necessite rastrear partes do corpo humano em uma cena• Isto requer que o nó de produção proveja dados do corpo para a aplicação, ou, em outras palavras, um
gerador de usuário (User Generator).
Nós de Produção - Exemplo
Cada nó de produção na OpenNI é definido nas categorias abaixo;
• Nós de sensores
• Nós de Middleware
Tipos de nós de produção
• Dispositivo
• Gerador de Profundidade (Depth Generator)
• Gerador de Imagem (Image Generator)
• Gerador de Infra-vermelho (IR Generator)
• Gerador de Áudio (Audio Generator)
Nós de sensores
• Gerador de Alerta de Gestos (Gesture Alert Generator)
• Analisador de Cena (Scene Analyzer)
• Gerador de Ponto de Mão (Hand Point Generator)
• Gerador de Usuário (User Generator)
Nós de middleware
•Gravação (Recorder)
•Player
•Codec
Módulo opcional para gravação
o Alternative Viewo Croppingo Frame Synco Mirroro Pose Detectiono Skeletono User Positiono Error Stateo Lock Awareo Hand Touching FOV Edge
Capabilities
É o que permite a flexibilidade de registro de múltiplos módulos, middleware ou sensores, na OpenNI. Lista atual de capabilities suportadas pela OpeNI;
Objeto de Contexto (The context Object)
• O contexto é o objeto principal OpenNI
• Um contexto é um objeto que mantém o estado completo de aplicações que utilizam OpenNI, incluindo todas os nós de produção utilizados pela aplicação
• O aplicativo pode criar mais de um contexto, mas os contextos não podem compartilhar informações
• Neste ponto, todos os contextos conectados em módulos são carregados e analisados
• Para liberar a memória usada pelo contexto, o aplicativo deve chamar o desligamento função
• Um contexto é um espaço de trabalho onde o aplicativo cria um gráfico de produção OpenNI.
• Por analogia, isso é como uma partição do disco em que os usuários criem suas árvores de pastas.
• O objeto de contexto é o ponto de entrada para OpenNI e mantém o estado completo de um aplicativo usando OpenNI.
Objeto de Contexto (The context Object)
• Objetos de metadados OpenNI encapsulam uma série de propriedades relacionados a dados específicos própios.
• Cada gerador que produz dados, tem o seu objeto de metadados específico.
• Tem papel importante na gravação e configuração de um nó no momento em que os dados correspondentes foi gerado.
• Às vezes, ao ler dados de um nó, um aplicativo muda a configuração do nó. Isso pode causar inconsistências que podem causar erros na aplicação, se não tratada adequadamente.
Objeto de Metadatas (The Metadata objects)
• DepthGeneratoro Um nó DepthGenerator gera um mapa de profundidade
como uma matriz de pixels, em que cada pixel é um valor de profundidade representando uma distância a partir do sensor em milímetros.
o Esta classe está no primeiro nível de classes na hierarquia de classes OpenNI que normalmente é instanciado para criar um nó real. (Exemplos de outras classes do primeiro nível são ImageGenerator SceneAnalyzer.)
o Gera sáida de um mapa de profundidade e os dados de configuração associados. Acesso apartir de um DepthMetaData.
Principais nós / Classes
• ImageGeneratoro O nó ImageGenerator gera mapas coloridos de
vários formatos de imagem, tais como o formato de imagem RGB24.
o A outra função importante é do metódo GetMetadata(), que, como nós outros geradores, obtém o objeto de metadados de imagem (quadro de objeto), através do qual você pode acessar todas as propriedades e os dados reais do último quadro.
o Saída de dados do tipo ImageMetaData;
Principais nós / Classes
• UserGeneratoro O nó UserGenerator gera dados que descrevem os usuários
reconhecidos na cena, identificando individualmente cada usuário e, assim, permitindo que ações sejam definidas para usuários especificos
o Saída de dados CoM (localização de usuário na cena) e pixels de dados do usuário do SceneMetaData
o Capabilities usados
o SkeletonCapability
Permite que o nó gerar uma representação esqueleto para cada utilizador humano reconhecido.
o PoseDetectionCapabilit
Permite que o nó de reconhecer quando o usuário se coloca em uma posição específica.
Principais nós / Classes
Diagrama de Herença NodeWrapper
• A classe NodeWrapper é a classe base para todas as classes nó OpenNI no C++.
• A classe ProductionNode é uma classe base para todos os nós de produção. Como tal, a classe ProductionNode é a classe base fundamental de toda a interface de Gráfico Produção OpenNI.
Diagrama de Herença ProductionNode
Diagrama de Herença Generator
• Classe base direta para todos os outros geradores, normalmente não é instanciada.
• A classe MapGenerator é a classe base para cada nó gerador que produz um mapa de imagem, por exemplo; mapas de profundidade, mapas de imagem a cores, mapas de IR, e mapas de análise da cena.
Diagrama de Herença MapGenerator
Instalando a OpenNI + NITE + Sensor
Demonstrações OpenNI e NITE (Samples), OpenKinect (lifreenect) e,
aplicações e vídeos de produtos Corollarium
Samples da OpenNI
SimpleViewer em C++
Este exemplo apresenta um programa que utiliza um nó de DepthGenerator e um nó de ImageGenerator para construir um histograma acumulativo a partir dos valores de profundidade
SimpleViewer - Bloco de Declaração Global
• A definição a seguir é o caminho para um script XML OpenNI, utilizado para entrada e construção de um grafo de produção.
• O grafo de produção é um conjunto de nós de produção, o qual é o principal objeto da OpenNI
SimpleViewer - Bloco de Declaração Global
• O bloco de declaração a seguir define os objetos OpenNI requeridos para a construção do grafo de produção
SimpleViewer - Programa principal
• As declarações no topo do programa coletam e reportam status e erros de qualquer função da OpenNI
SimpleViewer - Script de configuração de Contexto e Grafo de Produção
• O método InitFromXmlFile() é uma combinação de dois métodos de inicialização - Init() e o RunXmlScriptFromFile()
SimpleViewer - Verificação da existência de um Nó no script XML
• Checa se a OpenNI encontrou, pelo menos, uma definição de nó no script XML
• O programa continua a execução apenas se possuir pelo menos um nó de definição
SimpleViewer - Obtendo um DepthGenerator de um Grafo de Produção
• A função FindExistingNode() tenta obter uma referência a qualquer nó produção existente
• A chamada XN_NODE_TYPE_DEPTH faz referência a um xn::DepthGenerator - um nó DepthGenerator
• Uma referência é retornada ao parâmetro de profundidade – g_dpeth
• Após a verificação da existência de uma definição de um nó é verificado se a OpenNI encontrou um nó DepthGenerator no Grafo de Produção
SimpleViewer - Obtendo um DepthGenerator de um Grafo de Produção
• Semelhante ao exemplo anterior, porém, obtendo a referência de um nó ImageGenerator
• Uma referência é retornada ao parâmetro de imagem - g_image!
SimpleViewer - Obtendo um ImageGenerator de um Grafo de Produção
SimpleViewer - Obter Dados de um nó DepthGenerator
• Na seguinte declaração, o último dado gerado é armazenado de um buffer "fácil de acessar"
• Na terminologia OpenNI: o método getMetaData() obtém o dado que é designado como "metadado para ser armazenado no objeto de metadado do nó"
• O código copia o dado do frame do nó e configuração para o objeto metadado (depthMD)
• Este objeto metadado é denominada "objeto frame"
SimpleViewer - Obter Dados de um nó ImageGenerator
• Funciona do mesmo modo que o DepthGenerator
SimpleViewer - Inicializando o Mapa de Textura
• O dimensionamento do buffer do Mapa de Texturas é calculado por arredondamento da resolução completa do frame do DepthGenerator
SimpleViewer - glutDisplay( ) callback
• Uma parte significante da programação da OpenNI é definida dentro do callback glutDisplay( )
• O trecho de código abaixo efetua a leitira de objetos frame dos nós DepthGenerator e ImageGenerator
SimpleViewer - glutDisplay( ) callback
• É feita a chamadado Data( ) para obter os ponteiros dos objetos do frame (pDepth e pImage) em seus respectivos buffers mapeados
• Por meio dos objetos de frame todos os dados do DepthGenerator e ImageGenerator são acessíveis
SimpleViewer - Escalando as Imagens
• O FullXRes( ) calcula o fator de escala entre o mapa de profundidade (map depth) e a janela GL
• O FullXRes( ) obtém a resolução total do frame
SimpleViewer - Utilizar os dados de profundidade para construír um Histograma Acumulativo de Frequência
SimpleViewer - Utilizar os dados de profundidade para construír um Histograma Acumulativo de Frequência
HandTracker em C++ (NITE)
• O bloco de declaração a seguir define os objetos OpenNI requeridos para a construção do grafo de produção
xn::Context context;XnVSessionGenerator* pSessionGenerator;
HandTracker em C++ (NITE)
• Criação do contexto e inicialização, chamando localmente pelo arquivo XML.
• Também coletam e reportam status e erros de qualquer função da OpenNI
XnStatus rc = context.InitFromXmlFile(pathdodir)
HandTracker em C++ (NITE)
• Após a inicialização é verificado pelo RC se houve algum erro e, checa-se a OpenNI encontrou, pelo menos, uma definição de nó no script XML
• O programa continua a execução apenas se possuir pelo menos um nó de definição
if (rc != XN_STATUS_OK) {printf("Erro de carregamento XML: %s\n", xnGetStatusString(rc));return 1;
}
HandTracker em C++ (NITE)
• O próximo bloco cria um gerenciador de sessão na NITE algo parecido com GesturesGenerator da OpenNI
• O tipo de gesto que inicializa a sessão para detecção dos gestos é o Wave ou levantar as mãos.
pSessionGenerator = new XnVSessionManager();rc = ((XnVSessionManager*) pSessionGenerator)->Initialize(&context,"Wave", "RaiseHand");
HandTracker em C++ (NITE)
• Após a tentativa de inicialização verificamos se tudo ocorreu bem, se não deletemos a sessão da memória e paramos a execução do programa.
if (rc != XN_STATUS_OK) {printf("Session Manager couldn't initialize: %s\n",
xnGetStatusString(rc));delete pSessionGenerator;return 1;
}
HandTracker em C++ (NITE)
• Agora iniciamos o contexto e todos os nós
context.StartGeneratingAll();
HandTracker em C++ (NITE)
• Registros dos callbacks de detecção de inicio, em progresso e de termino da sessão
pSessionGenerator->RegisterSession(NULL, &SessionStart, &SessionEnd,&SessionProgress);
HandTracker em C++ (NITE)
• Criação de detecção de wave e registro do callback de movimento e PointUpdate callback
XnVWaveDetector wave;wave.RegisterWave(NULL, OnWaveCB);wave.RegisterPointUpdate(NULL, OnPointUpdate);
• Após isso registramos o wave para a sessão ficar a espera do gesto
pSessionGenerator->AddListener(&wave);
HandTracker em C++ (NITE)
• Criação de detecção de push e registro do callback.
XnVPushDetector push;push.RegisterPush(NULL, OnPushCB);
• Após isso registramos o wave para a sessão ficar a espera do gesto
pSessionGenerator->AddListener(&push);
HandTracker em C++ (NITE)
• Criação de detecção de circulo e registro do callback.
XnVCircleDetector circle;circle.RegisterCircle(NULL, OnCircleCB);
• Após isso registramos o circulo para a sessão ficar a espera do gesto
pSessionGenerator->AddListener(&circle);
HandTracker em C++ (NITE)
• Agora iniciamos o contexto e todos os nós
context.StartGeneratingAll();
HandTracker em C++ (NITE)
• Execução e loop principal do programa, onde fica aguardando o estado da sessão, se houver algum evento do teclado é parado a execução do programa.
while (!xnOSWasKeyboardHit()) {if (bRemoting) {
((XnVMultiProcessFlowClient*) pSessionGenerator)->ReadState();} else {
context.WaitAnyUpdateAll();((XnVSessionManager*) pSessionGenerator)->Update(&context);
}}
HandTracker em C++ (NITE)
• E após isso apagamos da memória a sessão e fechamos a execução do programa.
delete pSessionGenerator;context.Shutdown();
HandTracker - Evento 'Gesture Recognized'
• O evento Gesture Recognized representa que o nó GestureGenerator foi reconhecido e nomeado como um gesto na cena
• O handler chama o método StartTracking( ) do nó HandsGenerator
• Essa chamada causa o início do tracking de uma posição específica onde a aplicação espera uma mão, que a aplicação espera com um parâmetro do tipo xn::XnPoint3D
HandTracker - Evento 'Gesture Recognized'
• Depois de iniciado o tracking, o GestureGenerator não precisa mais ficar esperando por um gesto
HandTracker - Evento 'Gesture Recognized'
HandTracker - Evento 'Hand Create'
• O evento Hand Create representa que o nó HandsGenerator foi reconhecido e iniciou o tracking de uma nova mão em resposta a chamada da aplicação (StartTracking( ))
• Este evento retorna um ID para a nova mão.
• O código abaixo apresentao handler do Hand Create
HandTracker - Evento 'Hand Create'
• O handler executa a chamada de uma nova lista de xn::XnPoint3D
• O getPosition( ) retorna a posição de cada mão criada
HandTracker - Evento 'Hand Create'
• Agora que o HandsGenerator está rastreando a mão, é adicionado ao histórico (lista)
HandTracker - Evento 'Hand Update'
• O Hand Update sinaliza nó HandsGenerator detectou que a mão rastreada anteriormente foi reconhecida em uma nova posição específica em um novo frame
• A OpenNI continua a enviar esse evento a cada frame que a mão continue presente
• O evento retorna o ID, new position e o momento do update
HandTracker - Evento 'Hand Destroy'
• O Hand Destroy é responsável por detectar que a mão, que estava sendo rastreada, foi perdida
HandTracker - Main
HandTracker - Histograma da Aplicação
HandTracker - Inicializando o Grafo de Produção
• O construtor public HandTracker( ) inicializa o Grafo de Produção
• Cria e inicializa o GestureGenerator o addGesture( ) adiciona o "Click" ao FOV
HandTracker - MyGestureRecognized
O MyGestureRecognized( ) é declarado para ser o handler do evento Gesture Recognized
HandTracker - Gerenciadores de Eventos
Este trecho de código implementa os handlers para os eventos de reconhecimento das mãos
HandTracker - Criando um DepthGenerator
• O nó tem o dado designado como "metadado para ser alocado em um objeto metadado do nó"
• Verifica set todos os nós generator estão gerando dados
HandTracker - Calculando o Tamanho do Buffer
• Os métodos getFullXRes e getFullYRes pegam o número de linhas e colunas no frame (todo o FOV), ignorando cortes
• Isso possibilita à aplicação configurar o tamanho correto do buffer
Download dos exemplos ministrados
corollarium.com/kinect
• http://openni.org/Documentation - OpenNI Documentation
• https://github.com/OpenKinect/libfreenect- libfreenect
• http://www.microsoft.com/en-us/kinectforwindows/develop/sdkeula.aspx - Kinect SDK EULA
• http://openkinect.org - OpenKinect. is an open community of people interested in making use of the amazing Xbox Kinect hardware with our PCs and other devices. We are working on free, open source libraries that will enable the Kinect to be used with Windows, Linux, and Mac
• http://www.primesense.com/en/press-releases/press-releases2010/109-primesense-supplies-3d-sensing-technology-to-project-natal-for-xbox-360 - PrimeSense™ supplies 3D-sensing technology to 'Project Natal' for Xbox 360
• http://www.primesense.com - PrimeSense. “PrimeSense has delivered an important component to the technology, helping us deliver revolutionary controller-free entertainment experiences”
• http://opencv.willowgarage.com/wiki/ - OpenCV
Referências
• http://www.primesense.com/en/component/content/article/9-solutions/114-the-ps108 0- PrimeSense Reference Design
• http://event.asus.com/wavi/ - WAVI Xtion. Intuitive living room experience
• http://www.ifixit.com/Teardown/Microsoft-Kinect-Teardown/4066/ - Microsoft Kinect Teardown
• http://www.xbox.com/pt-br/kinect -Microsoft Kinect for Xbox360.
• http://www.hitl.washington.edu/artoolkit/ - ARToolKit
• http://en.wikipedia.org/wiki/Natural_User_Interface - Natural user interface
• http://www.primesense.com/nite - NITE PrimeSense
• http://www.primesense.com/en/openni - OpenNI PrimeSense
• Weiyuan Liu; , "Natural user interface- next mainstream product user interface," Computer-Aided Industrial Design & Conceptual Design (CAIDCD), 2010 IEEE 11th International Conference on , vol.1, no., pp.203-205, 17-19 Nov. 2010
Referências