Desenvolvimento de Interface Naturais de Interação usando o hardware Kinect

Post on 07-Nov-2014

3.652 views 5 download

Tags:

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 of Desenvolvimento de Interface Naturais de Interação usando o hardware Kinect

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