Desenvolvimento de Interface Naturais de Interação usando o hardware Kinect
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 3,412 views

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 ...

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.

Statistics

Views

Total Views
3,412
Slideshare-icon Views on SlideShare
3,070
Embed Views
342

Actions

Likes
2
Downloads
88
Comments
0

2 Embeds 342

http://blog.corollarium.com 339
http://www.tumblr.com 3

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-NonCommercial LicenseCC Attribution-NonCommercial License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • *
  • *
  • *
  • *
  • *
  • *
  • *
  • *
  • * Design centrado no usuário: provê as necessidades de mudança da interface para diferentes usuários; Multi-canal: visa capturar vários canais de entrada do usuário para a realização da interação com o computador. São considerados canais de entrada do usuário: mãos, boca, olhos, cabeça, pés e o corpo como um todo; Inexato: as ações e pensamentos dos usuários não são precisos, de modo que, o computador deve entender a requisição das pessoas; Largura de banda alta: devido à grande quantidade de dados gerados pelos dipositivos de interface utilizados, a NUI deve prover suporte a alta taxa de dados; Interação baseada por voz: considerada o meio mais conveniente, eficiente e natural de compartilhamento de informações. Em interfaces NUI possui duas abordagens: reconhecimento vocal e tecnologia de compreensão; Interação baseada por imagens: os humanos utilizam como principal sentido a visão. Para interfaces NUI, as imagens podem ser abordadas em 3 diferentes níveis: processamento de imagens, reconhecimento de imagens e percepção de imagens; e Interação baseada no comportamento: responsável por reconhecer a linguagem corporal do usuário, isto é, movimentos que expressem algum significado. Design centrado no usuário: provê as necessidades de mudança da interface para diferentes usuários; Multi-canal: visa capturar vários canais de entrada do usuário para a realização da interação com o computador. São considerados canais de entrada do usuário: mãos, boca, olhos, cabeça, pés e o corpo como um todo; Inexato: as ações e pensamentos dos usuários não são precisos, de modo que, o computador deve entender a requisição das pessoas; Largura de banda alta: devido à grande quantidade de dados gerados pelos dipositivos de interface utilizados, a NUI deve prover suporte a alta taxa de dados; Interação baseada por voz: considerada o meio mais conveniente, eficiente e natural de compartilhamento de informações. Em interfaces NUI possui duas abordagens: reconhecimento vocal e tecnologia de compreensão; Interação baseada por imagens: os humanos utilizam como principal sentido a visão. Para interfaces NUI, as imagens podem ser abordadas em 3 diferentes níveis: processamento de imagens, reconhecimento de imagens e percepção de imagens; e Interação baseada no comportamento: responsável por reconhecer a linguagem corporal do usuário, isto é, movimentos que expressem algum significado.
  • *
  • *
  • *
  • *
  • *
  • *
  • Um sensor CMOS, em particular, é um componente eletrônico em estado sólido que converte a luz em um padrão de cargas elétricas que se traduz em dados digitais. Usado comumente em câmeras digitais e que tem sido utilizado como um alternativa mais barata aos sensores do tipo CCD.
  • A OpenNI possui integração com o NITE, o q permite o rastreamento corporal, e de gestos, bem mais intuitível A OpenNI foi derivada do Sensor Kinect, driver open source da PrimeSense Usaremos esta lib para controlar o motor do Kinect
  • Controle das Mãos: Ele ignora o que outras pessoas possam estar fazendo na cena Full Body Control lets you have a totally immersive, full-body video game experience; the kind that gets you moving. Being social, NITE middleware supports multiple users, and is designed for all types of action, so you can race, box, skate, snowboard, get fit and so much more.
  • Top: Representa o software que implementa aplicações interacção natural em cima de OpenNI. Médio: Representa OpenNI, oferecendo interfaces de comunicação que interagem tanto com a Os sensores e os componentes middleware, que analisam os dados do sensor. Conclusão: Mostra os dispositivos de hardware que captam os elementos visuais e de áudio do cena.
  • Exemplifica a integração entre os módulos. 2 sensores físicos (podem ser 2 Kinects) e 3 módulos de middleware (2 de corpo e um de mão)
  • Gestures Alert Generator: Generates callbacks to the application when specific gestures are identified. Scene Analyzer: Analyzes a scene, including the separation of the foreground from the background, identification of figures in the scene, and detection of the floor plane. The Scene Analyzer’s main output is a labeled depth map, in which each pixel holds a label that states whether it represents a figure, or it is part of the background. Hand Point Generator: Supports hand detection and tracking. This node generates callbacks that provide alerts when a hand point (meaning, a palm) is detected, and when a hand point currently being tracked, changes its location. User Generator: Generates a representation of a (full or partial) body in the 3D scene.
  • Alternative View: Enables any type of map generator (depth, image, IR) to transform its data to appear as if the sensor is placed in another location (represented by another production node, usually another sensor). Cropping: Enables a map generator (depth, image, IR) to output a selected area of the frame as opposed to the entire frame. When cropping is enabled, the size of the generated map is reduced to fit a lower resolution (less pixels). For example, if the map generator is working in VGA resolution (640x480) and the application chooses to crop at 300x200, the next pixel row will begin after 300 pixels. Cropping can be very useful for performance boosting. Frame Sync: Enables two sensors producing frame data (for example, depth and image) to synchronize their frames so that they arrive at the same time. Mirror: Enables mirroring of the data produced by a generator. Mirroring is useful if the sensor is placed in front of the user, as the image captured by the sensor is mirrored, so the right hand appears as the left hand of the mirrored figure. Pose Detection: Enables a user generator to recognize when the user is posed in a specific position. Skeleton: Enables a user generator to output the skeletal data of the user. This data includes the location of the skeletal joints, the ability to track skeleton positions and the user calibration capabilities. User Position: Enables a Depth Generator to optimize the output depth map that is generated for a specific area of the scene. Error State: Enables a node to report that it is in "Error" status, meaning that on a practical level, the node may not function properly. Lock Aware: Enables a node to be locked outside the context boundary. For more information, see Sharing Devices between Applications and Locking Nodes. Hand Touching FOV Edge: Alert when the hand point reaches the boundaries of the field of view.
  • A Context object is a workspace in which the application builds an OpenNI production graph. The ScriptNode object loads an XML script from a file or string, and then runs the XML script to build a production graph. The DepthGenerator node generates a depth map. Each map pixel value represents a distance from the sensor. The ImageGenerator node generates color image maps of various formats, such as the RGB24 image format. Call its SetPixelFormat() method to set the image format to be generated. The DepthMetaData object provides a frame object for the xn::DepthGenerator node. A generator node's frame object contains a generated data frame and all its associated properties. This frame object, comprising the data frame and its properties, is accessible through the node's metadata object. The ImageMetaData object provides a frame object for the xn::ImageGenerator node. This metadata object is associated with an ImageGenerator node in the same way as the DepthMetaData object is associated with a DepthGenerator node.
  • Inicializa o objeto de contexto e cria um grafo de produção a partir de um arquivo XML. O script descreve todos os nós que o usuário deseja criar. Para cada nó de descrição dentro do arquivo XML, este método cria um nó dentro do Grafo de Produção
  • Assumindo quem a chamada InitFromXmlFIle() foi bem sucedida, um nó de produção foi criado Um nó DepthGenerator gera um mapa de profundidade no formato de um array de pixels, onde cada pixel é uma profundidade representando a distância do sensor em milimetros. Uma referência do nó é retornada ao parâmetro de profundidade (g_depth)
  • A resolução completa do frame é acessada por meio do xn::MapMetaData::FullXRes() and xn:MapMetaData::FullYRes() (ambos acessados por meio do objeto de metadados)
  • O xn::Context::WaitAnyUpdateAll( ) espera por qualquer nó que gere um novo dado de frame. O método então possibilita o acesso dos dados dos frames no Grafo de Produção. A aplicação então pode fazer um getData( ) . Este método tem um timeout
  • O ponteiro pDepth acessa cada valor do buffer de profundidade Utiliza esse valor como índice dentro do vetor g_pDepthHist
  • o getEndPosition( ) retorna a posição da mão no final do gesto. Esse parâmetro é a mão que efetuou o gesto
  • Essa lista será descrita depois
  • The following code block defines the event handler for the 'Hand Update' event.
  • Agora, a aplicação destrói a mão e deseja rastrear uma nova. O gesture Click é adicionado novamente, para que inicie o rastreamento
  • The xn::ScriptNode object loads an XML script from a file or string, and then runs the XML script to build a production graph. A xn::Context object is a workspace in which the application builds an OpenNI production graph. A xn::DepthGenerator node generates a depth map. Each map pixel value represents a distance from the sensor. A xn::GestureGenerator "GestureGenerator" node recognizes certain hand gestures and raise corresponding events accordingly. A gesture is a specific hand movement. The GestureGenerator node scans the FOV to detect gestures and generates the gesture data. A xn::HandsGenerator "HandsGenerator" node generates tracking data about a single hand or multiple hands with persistent IDs. The HandsGenerator node is a specific type of generator node, derived from the Generator class.
  • history is a history list of xn::Point3D "Point3D" objects, which are the 3D (x,y,z) co-ordinates of each depth pixel in the depth map generated by a DepthGenerator node. histogram is an array of floats to build a histogram of distribution of depth values. The following declaration for SAMPLE_XML_FILE is the path to an OpenNI XML script file for inputting and building a stored production graph. private final String SAMPLE_XML_FILE = "../../../../Data/SamplesConfig.xml";
  • o método getMetaData( ) pega dado e copia para o objeto metadado, depthMD . Os dados incluesm toda a configuração e informação associada com o dado

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

  • 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 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
  • 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
  • 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
  • Dispositivo de entrada para CLI
  • 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
  • Dispositivos de Entrada paraGUI
  • 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
  • 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
  • Dispositivos comuns para NUI• Touch screens• Sensores de movimento (acelerômetros)• Câmeras de profundidade (3D)• Sensores de áudio
  • 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
  • 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 - OG12 / 0956 / D306 / JG05A• LED de estatus
  • • Motor de inclinação vertical
  • 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
  • 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 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
  • 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.
  • 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
  • The PrimeSensorThe PrimeSensor™ Technology
  • Dispositivos da ASUS com tecnologia PrimeSense http://event.asus.com/wavi/ http://us.estore.asus.com/index.php?l=product_detail&p=3397
  • Dispositivo Xtion PRO LIVE
  • 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
  • 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
  • Ferramentas de DesenvolvimentoExistem diversas ferramentas dedesenvolvimento, cada uma com suascaracterísticas.
  • • 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
  • 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
  • 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
  • • 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
  • • É 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, 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)
  • 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
  • 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 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.
  • 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.
  • 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
  • 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
  • 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
  • OpenNI - Módulos de Sensor• Sensor 3D• Câmera RGB• Câmera Infra-vermelho• Dispositivo de Áudio (vetores de microfones, no caso do Kinect)
  • 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.
  • Cenário de desenvolvimento
  • 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
  • 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).
  • 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 Infra-vermelho (IR Generator)• Gerador de Áudio (Audio Generator)
  • 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)
  • 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 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
  • 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
  • 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.
  • 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.
  • 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.
  • 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;
  • 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.
  • 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, a classe ProductionNode é a classe base fundamental de toda a interface de Gráfico Produção OpenNI.
  • 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 imagem, por exemplo; mapas de profundidade, mapas de imagem a cores, mapas de IR, e mapas de análise da cena.
  • 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 construir um histograma acumulativo a partir dosvalores 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
  • 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
  • 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!
  • 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 deTextura• 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 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 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: %sn", 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 couldnt initialize: %sn", 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ãopSessionGenerator->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
  • 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
  • HandTracker - Evento Gesture Recognized• Depois de iniciado o tracking, o GestureGenerator não precisa mais ficar esperando por um gesto
  • 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 - 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 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
  • 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
  • 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