Desenvolvimento de InterfacesNaturais 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 Ki...
Interface de usuárioUma interface de usuário é o sistema pelo qual aspessoas (usuários) interagem com uma máquina. Ainterf...
Command Line Interface(CLI)        •    1ª Interface computacional            interativa        •    Inserção de comandos ...
Dispositivo de entrada para CLI
Graphic User Interface (GUI)          •   Janelas, botões, menus,              caixas de opção, caixas de              sel...
Dispositivos de Entrada paraGUI
Natural User Interface (NUI)    • Interação com o computador de um      modo     efetivamente  invisível, ou      tornando...
Características de NUISegundo Weiyuan (2011), a NUI possuí as seguintes características:  •    Design centrado no usuário ...
Dispositivos comuns para NUI•  Touch screens•  Sensores de movimento (acelerômetros)•  Câmeras de profundidade (3D)•  Sens...
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 Floria...
O dispositivo Microsoft Kinect* Fonte: http://www.ifixit.com/Teardown/Microsoft-Kinect-Teardown/4066/1
Principais Características
•  Câmera RGB 640x480 – VNA38209015•  IR CMOS 320x240 - OG12 / 0956 / D306 / JG05A•  IR Projetor - Diodo laser de 830 nm -...
•    Motor de inclinação vertical
Profundidade•   A profundidade consiste em uma fonte de luz    infravermelha (IR) que projeta um padrão de    pontos•   A ...
http://www.primesense.com/en/technology/115-the-primesense-3d-sensing-solution
Áudio e RGB•   A câmera RGB utiliza resolução padrão (640 x 480)    VGA e uma taxa de quadros 30 Hz•    A matriz de áudio ...
Alimentação•   O Kinect para XBOX 360 utiliza 12 volts, mais do    que a fornecida por uma porta USB padrão (5 volts).•   ...
PrimeSense PS1080-A2 - SoC image sensor processor  Implementado no Kinect, é capaz de capturar os dados do sensor infraver...
The PrimeSensorThe PrimeSensor™ Technology
Dispositivos da ASUS com tecnologia PrimeSense                    http://event.asus.com/wavi/ http://us.estore.asus.com/in...
Dispositivo Xtion PRO LIVE
Comparações de preço no Mercado                                            Xtion PROMicrosoft Kinect para Xbox 360        ...
Microsoft Kinect e a NUIPode ser usado para desenvolvimento de aplicações NUI  Suas características e benefícios são amplo...
Ferramentas de DesenvolvimentoExistem       diversas ferramentas     dedesenvolvimento, cada uma com        suascaracterís...
•  O projeto surgiu na corrida para ganhar acesso do Microsoft Kinect no PC •  Héctor Martin liberou o código da libfreene...
libFreenect•   Imagens de profundidade e RGB•   Motor (posição de orientação vertical)•   Acelerômetro•   LED de status•  ...
libFreenect•   Não possui integração com a NITE (middleware    NUI)•   Derivada da engenharia reversa do driver oficial do...
• PrimeSense reconhece o interesse e as realizações da    comunidade de código aberto sobre o Kinect•   Surgi um mês depoi...
•   É um framework que fornece uma API para o    desenvolvimento de aplicações que necessitam de    interação natural.•   ...
•   A modularidade do framework OpenNI permite sua    fácil integração com outros softwares.•   Um exemplo interessante é ...
• O NITE é um middleware usado pela interface OpenNI, edesenvolvido pela PrimeSense.• Apesar de possuir código fechado, é ...
Rastreamento de mãos• Controle das Mãos: permite ao usuário o  controle de dispositivos digitais por meio de  suas mãos.• ...
Rastreamento de mãos Coordenadas das mãos em relação ao dispositivo (X,Y e Z)   Detecção de gestos (Push, swipe, steady, w...
Rastreamento de esqueleto                                                               Xhttp://www.openclipart.org/people...
Microsoft Kinect SDK para Windows• O Microsoft Kinect SDK 1.0 para Windows• Destinado aos sistemas operacionais Windows 7 ...
OpenKinect                        OpenNI                             Microsoft Kinect SDK v1.0Licença                     ...
Desenvolvimento com a
Topologia de arquitetura OpenNI•   Camada do topo:    o Representa a aplicação desenvolvida que      implementa NUI com a ...
OpenNI Arquitetura
Módulos (Componentes)•   A OpenNI é uma camada abstrata que provê a    interface para ambos: sensores físicos e    compone...
OpenNI - Módulos de Sensor• Sensor 3D• Câmera RGB• Câmera Infra-vermelho• Dispositivo de Áudio (vetores de microfones, no ...
OpenNI - Módulos Middleware•   Análise de Corpo: um componente de software que processa    os dados do sensor e gera o esq...
Cenário de desenvolvimento
OpenNI- Desenvolvimento•   A OpenNI é uma interface de alto-nível.•   O OpenNI define Production Node (nós de produção)   ...
Nós de Produção - Exemplo•   A aplicação que necessite rastrear partes do corpo humano em uma cena•   Isto requer que o nó...
Tipos de nós de produçãoCada nó de produção na OpenNI édefinido nas categorias abaixo;• Nós de sensores• Nós de Middleware
Nós de sensores• Dispositivo• Gerador de Profundidade (Depth Generator)• Gerador de Imagem (Image Generator)• Gerador de I...
Nós de middleware• Gerador de Alerta de Gestos (Gesture    Alert Generator)•   Analisador de Cena (Scene Analyzer)•   Gera...
Módulo opcional para gravação• Gravação (Recorder)• Player• Codec
CapabilitiesÉ o que permite a flexibilidade de registro demúltiplos módulos, middleware ou sensores, naOpenNI.Lista atual ...
Objeto de Contexto (The context Object) •   O contexto é o objeto principal OpenNI •   Um contexto é um objeto que mantém ...
Objeto de Contexto (The context Object)• Um contexto é um espaço de trabalho onde o    aplicativo cria um gráfico de produ...
Objeto de Metadatas (The Metadata objects)•   Objetos de metadados OpenNI encapsulam uma    série de propriedades relacion...
Principais nós / Classes•   DepthGenerator    o   Um nó DepthGenerator gera um mapa de profundidade        como uma matriz...
Principais nós / Classes• ImageGenerator  o O nó ImageGenerator gera mapas coloridos de      vários formatos de imagem, ta...
Principais nós / Classes•   UserGenerator    o O nó UserGenerator gera dados que descrevem os usuários       reconhecidos ...
Diagrama de Herença NodeWrapper•   A classe NodeWrapper é a classe base para todas    as classes nó OpenNI no C++.
Diagrama de Herença ProductionNode•   A classe ProductionNode é uma classe base para    todos os nós de produção. Como tal...
Diagrama de Herença Generator•   Classe base direta para todos os outros    geradores, normalmente não é instanciada.
Diagrama de Herença MapGenerator•   A classe MapGenerator é a classe base para    cada nó gerador que produz um mapa de   ...
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 umnó de DepthGenerator e um nó de ImageGeneratorpara c...
SimpleViewer - Bloco de Declaração Global• A definição a seguir é o caminho para um script    XML OpenNI, utilizado para e...
SimpleViewer - Bloco de Declaração Global•    O bloco de declaração a seguir define os objetos    OpenNI requeridos para a...
SimpleViewer - Programa principal•    As declarações no topo do programa coletam e    reportam status e erros de qualquer ...
SimpleViewer - Script de configuração de Contexto    e Grafo de Produção•    O método InitFromXmlFile() é uma combinação  ...
SimpleViewer - Verificação da existência de um Nó    no script XML• Checa se a OpenNI encontrou, pelo menos, uma    defini...
SimpleViewer - Obtendo um DepthGenerator de       um Grafo de Produção• A função FindExistingNode() tenta obter uma    ref...
SimpleViewer - Obtendo um DepthGenerator de    um Grafo de Produção• Após a verificação da existência de uma definição de ...
SimpleViewer - Obtendo um ImageGenerator   de um Grafo de Produção• Semelhante ao exemplo anterior, porém, obtendo a refer...
SimpleViewer - Obter Dados de um nó      DepthGenerator•   Na seguinte declaração, o último dado gerado é    armazenado de...
SimpleViewer - Obter Dados de um nó      ImageGenerator• Funciona do mesmo modo que o DepthGenerator
SimpleViewer - Inicializando o Mapa deTextura• O dimensionamento do buffer do Mapa de Texturas é calculado por arredondame...
SimpleViewer - glutDisplay( ) callback•   Uma parte significante da programação da    OpenNI é definida dentro do callback...
SimpleViewer - glutDisplay( ) callback•   É feita a chamadado Data( ) para obter os    ponteiros dos objetos do frame (pDe...
SimpleViewer - Escalando as Imagens•   O FullXRes( ) calcula o fator de escala entre o    mapa de profundidade (map depth)...
SimpleViewer - Utilizar os dados de profundidade paraconstruír um Histograma Acumulativo de Frequência
SimpleViewer - Utilizar os dados de profundidade paraconstruí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 gr...
HandTracker em C++ (NITE)•   Criação do contexto e inicialização, chamando    localmente pelo arquivo XML.•   Também colet...
HandTracker em C++ (NITE)•   Após a inicialização é verificado pelo RC se    houve algum erro e, checa-se a OpenNI    enco...
HandTracker em C++ (NITE) •   O próximo bloco cria um gerenciador de sessão     na NITE algo parecido com GesturesGenerato...
HandTracker em C++ (NITE)•   Após a tentativa de inicialização verificamos se    tudo ocorreu bem, se não deletemos a sess...
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ãopSes...
HandTracker em C++ (NITE)•   Criação de detecção de wave e registro do    callback de movimento e PointUpdate callback    ...
HandTracker em C++ (NITE)•   Criação de detecção de push e registro do    callback.       XnVPushDetector push;       push...
HandTracker em C++ (NITE)•   Criação de detecção de circulo e registro do    callback.        XnVCircleDetector 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 ...
HandTracker em C++ (NITE)•   E após isso apagamos da memória a sessão e    fechamos a execução do programa.             de...
HandTracker - Evento Gesture Recognized• O evento Gesture Recognized representa que o nó GestureGenerator foi reconhecido ...
HandTracker - Evento Gesture Recognized• O handler chama o método StartTracking( ) do    nó HandsGenerator•   Essa chamada...
HandTracker - Evento Gesture        Recognized•    Depois de iniciado o tracking, o    GestureGenerator não precisa mais f...
HandTracker - Evento Hand Create•   O evento Hand Create representa que o nó    HandsGenerator foi reconhecido e iniciou o...
HandTracker - Evento Hand Create•   O handler executa a chamada de uma nova lista    de xn::XnPoint3D•   O getPosition( ) ...
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...
HandTracker - Evento Hand Destroy• O Hand Destroy é responsável por detectar que a mão, que estava sendo rastreada, foi pe...
HandTracker - Main
HandTracker - Histograma da Aplicação
HandTracker - Inicializando o Grafo de    Produção• O construtor public HandTracker( ) inicializa o  Grafo de Produção• Cr...
HandTracker - MyGestureRecognizedO MyGestureRecognized( ) é declarado para ser ohandler do evento Gesture Recognized
HandTracker - Gerenciadores deEventosEste trecho de código implementa os handlers paraos eventos de reconhecimento das mãos
HandTracker - Criando um    DepthGenerator• O nó tem o dado designado como "metadado para  ser alocado em um objeto metada...
HandTracker - Calculando o Tamanho do Buffer•   Os métodos getFullXRes e getFullYRes pegam    o número de linhas e colunas...
Download dos exemplos ministrados      corollarium.com/kinect
Referências•   http://openni.org/Documentation - OpenNI Documentation•   https://github.com/OpenKinect/libfreenect- libfre...
Referências•     http://www.primesense.com/en/component/content/article/9-solutions/114-    the-ps108 0- PrimeSense Refere...
Desenvolvimento de Interface Naturais de Interação usando o hardware Kinect
Desenvolvimento de Interface Naturais de Interação usando o hardware Kinect
Desenvolvimento de Interface Naturais de Interação usando o hardware Kinect
Desenvolvimento de Interface Naturais de Interação usando o hardware Kinect
Desenvolvimento de Interface Naturais de Interação usando o hardware Kinect
Próximos SlideShares
Carregando em…5
×

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

4.385 visualizações

Publicada em

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.

Publicada em: Educação
  • Seja o primeiro a comentar

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

  1. 1. Desenvolvimento de InterfacesNaturais de Interação usando o Hardware Kinect
  2. 2. 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
  3. 3. Interface de usuárioUma interface de usuário é o sistema pelo qual aspessoas (usuários) interagem com uma máquina. Ainterface do usuário inclui hardware (físico) e software(lógico) componentes. Interfaces de usuário existepara vários sistemas, e fornecer um meio de:• Entrada: permitindo que os usuários manipulem umsistema• De saída: permitindo que o sistema para indicar osefeitos da manipulação dos utilizadores
  4. 4. Command Line Interface(CLI) • 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
  5. 5. Dispositivo de entrada para CLI
  6. 6. Graphic User Interface (GUI) • 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
  7. 7. Dispositivos de Entrada paraGUI
  8. 8. Natural User Interface (NUI) • Interação com o computador de um modo efetivamente invisível, ou tornando-se invisível com sucessivas interações aprendidas. • 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
  9. 9. Características de NUISegundo 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
  10. 10. Dispositivos comuns para NUI• Touch screens• Sensores de movimento (acelerômetros)• Câmeras de profundidade (3D)• Sensores de áudio
  11. 11. Evolução das Interfaces de usuário
  12. 12. Consoles e a NUI
  13. 13. Vídeo da evolução dos dispositivos de controle para consoles http://vimeo.com/18743950 - History of Gaming - by Florian Smolka
  14. 14. O dispositivo Microsoft Kinect* Fonte: http://www.ifixit.com/Teardown/Microsoft-Kinect-Teardown/4066/1
  15. 15. Principais Características
  16. 16. • 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
  17. 17. • Motor de inclinação vertical
  18. 18. Profundidade• 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
  19. 19. http://www.primesense.com/en/technology/115-the-primesense-3d-sensing-solution
  20. 20. Áudio e RGB• 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
  21. 21. Alimentação• 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.
  22. 22. PrimeSense PS1080-A2 - SoC image sensor processor 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
  23. 23. The PrimeSensorThe PrimeSensor™ Technology
  24. 24. Dispositivos da ASUS com tecnologia PrimeSense http://event.asus.com/wavi/ http://us.estore.asus.com/index.php?l=product_detail&p=3397
  25. 25. Dispositivo Xtion PRO LIVE
  26. 26. Comparações de preço no Mercado Xtion PROMicrosoft Kinect para Xbox 360 PrimeSensor EUA = $$149.00 Brasil ≈ R$500* Xtion PRO LIVE EUA = $$129.99 EUA ≈ $200.00 EUA = $199.00 Consulta data 26/01/2012
  27. 27. Microsoft Kinect e a NUIPode ser usado para desenvolvimento de aplicações NUI 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
  28. 28. Ferramentas de DesenvolvimentoExistem diversas ferramentas dedesenvolvimento, cada uma com suascaracterísticas.
  29. 29. • 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 hardwaredo dispositivo.OpenKinect é uma comunidade de pessoas interessadas em utilizar oMicrosoft Kinect em computadores e outros dispositivos criandobibliotecas livres para que o Kinect seja utilizada em diferentesplataformas Google Groups: OpenKinect #openkinect - FreenodeCódigo fonte disponível em:https://github.com/OpenKinect/libfreenect
  30. 30. libFreenect• 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
  31. 31. 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
  32. 32. • 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 NUI Google Groups: OpenNI
  33. 33. • É 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)
  34. 34. • 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
  35. 35. • O NITE é um middleware usado pela interface OpenNI, edesenvolvido pela PrimeSense.• Apesar de possuir código fechado, é gratuito e pode serusado comercialmente.• Responsável por identificar os usuários na imagem erastrear seus movimentos, além de prover uma API quedetecta gestos.• Modos de operação: ● Rastrear mãos, com detecção de gestos em particular ● Rastrear o corpo todo (esqueleto)
  36. 36. Rastreamento de mãos• 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
  37. 37. 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)
  38. 38. Rastreamento de esqueleto Xhttp://www.openclipart.org/people/harmonic/Vitruvian_Man.svg Pontos rastreados das juntas do corpo capaz de capturar X,Y e Z em relação ao dispositivo.
  39. 39. Microsoft Kinect SDK para Windows• 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.
  40. 40. OpenKinect OpenNI Microsoft Kinect SDK v1.0Licença LGPLv3+ LGPLv3+ Proprietária e uso não (Nite tem código fechado mas que comercial para o Microsoft pode ser usado comercialmente) Kinect para Xbox360.Hardware Microsoft Kinect para Xbox360 e Qualquer compatível com padrão Microsoft Kinect Microsoft Kinect para Windows OpenNIDriver libfreenect SensorKinect Avin2 Microsoft Kinect SDK v1.0Multiplataforma de S.O Sim Sim NãoMúltiplos Kinects Sim Sim SimCâmera RGB Sim Sim SimCâmera Infravermelho Sim Sim SimProjetor Infravermelho Sim Sim SimLED de estatus Sim Sim NãoMotor de inclinação vertical Sim Não SimVetor de microfones Implementado Não SimDetecção de gestos Implementação a partir do Sim, pelo middleware * OpenCVDetecção do esqueleto Não Sim, pelo middleware SimDetecção da mãos e módulos Não Sim, pelo middleware Nãode reconhecimento de gestosAnálisador de cena Não Sim Não
  41. 41. Desenvolvimento com a
  42. 42. 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.
  43. 43. OpenNI Arquitetura
  44. 44. Módulos (Componentes)• 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
  45. 45. OpenNI - Módulos de Sensor• Sensor 3D• Câmera RGB• Câmera Infra-vermelho• Dispositivo de Áudio (vetores de microfones, no caso do Kinect)
  46. 46. OpenNI - Módulos Middleware• 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.
  47. 47. Cenário de desenvolvimento
  48. 48. OpenNI- 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
  49. 49. Nós de Produção - Exemplo• 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).
  50. 50. Tipos de nós de produçãoCada nó de produção na OpenNI édefinido nas categorias abaixo;• Nós de sensores• Nós de Middleware
  51. 51. Nós de sensores• Dispositivo• Gerador de Profundidade (Depth Generator)• Gerador de Imagem (Image Generator)• Gerador de Infra-vermelho (IR Generator)• Gerador de Áudio (Audio Generator)
  52. 52. Nós de middleware• 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)
  53. 53. Módulo opcional para gravação• Gravação (Recorder)• Player• Codec
  54. 54. CapabilitiesÉ o que permite a flexibilidade de registro demúltiplos módulos, middleware ou sensores, naOpenNI.Lista atual de capabilities suportadas pela OpeNI; o Alternative View o Cropping o Frame Sync o Mirror o Pose Detection o Skeleton o User Position o Error State o Lock Aware o Hand Touching FOV Edge
  55. 55. 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
  56. 56. Objeto de Contexto (The context Object)• 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.
  57. 57. Objeto de Metadatas (The Metadata objects)• 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.
  58. 58. Principais nós / Classes• DepthGenerator o 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.
  59. 59. Principais nós / Classes• ImageGenerator o 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;
  60. 60. Principais nós / Classes• UserGenerator o 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.
  61. 61. Diagrama de Herença NodeWrapper• A classe NodeWrapper é a classe base para todas as classes nó OpenNI no C++.
  62. 62. Diagrama de Herença ProductionNode• 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.
  63. 63. Diagrama de Herença Generator• Classe base direta para todos os outros geradores, normalmente não é instanciada.
  64. 64. Diagrama de Herença MapGenerator• 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.
  65. 65. Instalando a OpenNI + NITE + Sensor
  66. 66. Demonstrações OpenNI e NITE(Samples), OpenKinect (lifreenect) e, aplicações e vídeos de produtos Corollarium
  67. 67. Samples da OpenNI
  68. 68. SimpleViewer em C++ Este exemplo apresenta um programa que utiliza umnó de DepthGenerator e um nó de ImageGeneratorpara construir um histograma acumulativo a partir dosvalores de profundidade
  69. 69. 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
  70. 70. 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
  71. 71. SimpleViewer - Programa principal• As declarações no topo do programa coletam e reportam status e erros de qualquer função da OpenNI
  72. 72. 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()
  73. 73. 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
  74. 74. 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
  75. 75. SimpleViewer - Obtendo um DepthGenerator de um Grafo de Produção• 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
  76. 76. SimpleViewer - Obtendo um ImageGenerator 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!
  77. 77. 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"
  78. 78. SimpleViewer - Obter Dados de um nó ImageGenerator• Funciona do mesmo modo que o DepthGenerator
  79. 79. SimpleViewer - Inicializando o Mapa deTextura• O dimensionamento do buffer do Mapa de Texturas é calculado por arredondamento da resolução completa do frame do DepthGenerator
  80. 80. 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
  81. 81. 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
  82. 82. 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
  83. 83. SimpleViewer - Utilizar os dados de profundidade paraconstruír um Histograma Acumulativo de Frequência
  84. 84. SimpleViewer - Utilizar os dados de profundidade paraconstruír um Histograma Acumulativo de Frequência
  85. 85. 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;
  86. 86. 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)
  87. 87. 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: %sn", xnGetStatusString(rc)); return 1; }
  88. 88. 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");
  89. 89. 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 couldnt initialize: %sn", xnGetStatusString(rc)); delete pSessionGenerator; return 1; }
  90. 90. HandTracker em C++ (NITE)• Agora iniciamos o contexto e todos os nós context.StartGeneratingAll();
  91. 91. HandTracker em C++ (NITE) • Registros dos callbacks de detecção de inicio, em progresso e de termino da sessãopSessionGenerator->RegisterSession(NULL, &SessionStart, &SessionEnd,&SessionProgress);
  92. 92. 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);
  93. 93. 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);
  94. 94. 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);
  95. 95. HandTracker em C++ (NITE)• Agora iniciamos o contexto e todos os nós context.StartGeneratingAll();
  96. 96. 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); } }
  97. 97. 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();
  98. 98. HandTracker - Evento Gesture Recognized• O evento Gesture Recognized representa que o nó GestureGenerator foi reconhecido e nomeado como um gesto na cena
  99. 99. HandTracker - Evento Gesture Recognized• 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
  100. 100. HandTracker - Evento Gesture Recognized• Depois de iniciado o tracking, o GestureGenerator não precisa mais ficar esperando por um gesto
  101. 101. 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
  102. 102. 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
  103. 103. HandTracker - Evento Hand Create• Agora que o HandsGenerator está rastreando a mão, é adicionado ao histórico (lista)
  104. 104. 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
  105. 105. HandTracker - Evento Hand Destroy• O Hand Destroy é responsável por detectar que a mão, que estava sendo rastreada, foi perdida
  106. 106. HandTracker - Main
  107. 107. HandTracker - Histograma da Aplicação
  108. 108. 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
  109. 109. HandTracker - MyGestureRecognizedO MyGestureRecognized( ) é declarado para ser ohandler do evento Gesture Recognized
  110. 110. HandTracker - Gerenciadores deEventosEste trecho de código implementa os handlers paraos eventos de reconhecimento das mãos
  111. 111. 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
  112. 112. 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
  113. 113. Download dos exemplos ministrados corollarium.com/kinect
  114. 114. Referências• 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
  115. 115. 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

×