4.1
Formatos
A câmera de cores do Kinect possui uma série de configurações, que influência diretamente na qualidade da imagem e na quantidade de quadros por segundo que o
Kinect consegue processar. A tabela 4.2 ilustra estas resoluções.
28
Casa do Código
Capítulo 4. Fluxo de Cores
Figura 4.2: Tabela de Configurações da Câmera RGB
Você provavelmente já ouviu falar sobre o formato RGB ou (Red-Green-Blue),
bastante conhecido no ramo da computação. Neste formato, cada pixel da imagem
possui uma quantidade da cor vermelha, uma quantidade da cor verde e uma quan-
tidade da cor azul, a soma destes três valores representam a cor do pixel.
O formato YUV codifica uma imagem ou video levando em conta a percepção
humana. Ele permite uma redução da largura de banda de uma transmissão pois
utiliza somente 16 bits por pixel, então é muito útil para comprimir imagens, pois a perda é mascarada pela percepção humana, enquanto que o RGB possui o dobro de
tamanho por pixel e nem sempre faz diferença para nossos olhos. Na sigla YUV, o Y
representa a luminância de um pixel, ou seja, quantidade de luminosidade percebida pelo olho humano naquele pixel, enquanto que as siglas U e V representam dois
componentes diferentes de crominância, que é a forma como nossos olhos percebem as cores.
A figura 4.3 ilustra a imagem com os componentes separados.
29
4.1. Formatos
Casa do Código
Figura 4.3: Imagem YUV
O formato Bayer é bastante similar ao RGB, mas ele altera a imagem proporci-
onalmente à nossa percepção para cores, então o verde (que é a cor que mais per-cebemos) é mais levado em consideração do que o vermelho ou azul. As diferenças visuais entre os formatos RGB, YUV e Bayer são bem sutis, a figura 4.4 ilustra uma mesma imagem nos três formatos com a resolução máxima.
30
Casa do Código
Capítulo 4. Fluxo de Cores
Figura 4.4: Comparação entre formatos da Câmera RGB
O formato InfraRed ou infravermelho é bem diferente dos citados anteriormente.
Quando a câmera é habilitada com este formato, podemos visualizar a forma com
que o Kinect vê o ambiente. O resultado é uma imagem escura com diversos pontos luminosos, que representam os pontos infravermelhos que são lançados pelo emissor de luz infravermelho no ambiente.
4.2
Aplicação
Neste capítulo iremos criar uma aplicação um pouco mais complexa, que contará
com as funções mencionadas anteriormente: bater uma foto e exibir na aplicação a imagem (que será feito utilizando o fluxo de cores sob demanda), exibir na aplicação um o vídeo do que a câmera RGB está vendo (que será feito utilizando o evento) e criaremos uma opção para utilizar um filtro de escala cinza sobre a imagem.
Como você já deve estar acostumado criaremos uma nova aplicação WPF e no-
vamente iremos incluir as referências para nosso projeto auxiliar e para a SDK do Kinect. Nossa aplicação será construída por etapas primeiramente iremos fazer com que ela apenas bata foto sob demanda.
Criando o layout
O Layout desta aplicação será relativamente simples. Primeiro vamos dividir o
componente Grid em duas linhas, utilizando o Grid.RowDefinitions que já
mencionamos anteriormente. A linha inferior não deve receber um valor muito alto 31
4.2. Aplicação
Casa do Código
para sua altura (50 é suficiente), pois ela irá servir apenas para inserirmos nosso bo-tão que baterá a foto, todo o resto da altura da janela deve pertencer a linha superior, já que ela terá o componente que irá exibir a imagem de nossa foto. O código de sua tela deve ficar similar ao código a seguir.
<Window x:Class="SensorRGB.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="50"/>
</Grid.RowDefinitions>
<Button Content="Bater Foto"
Grid.Row="1" Margin="10,10"
Width="70" HorizontalAlignment="Left"
Click="Button_BaterFoto"/>
<Image Name="imagemCamera" />
</Grid>
</Window>
Utilizando um quadro sob demanda
Note que, no código anterior, já foi atribuído um evento para o bo-
tão que irá bater a foto, vamos então ao código.
Como padrão, após o
método
InitializeComponent da janela devemos inicializar o sensor de
nossa aplicação.
No caso desta aplicação, iremos criar um método cha-
mado
InicializarKinect(), pois além de fazermos a inicialização pa-
drão temos que inicializar o fluxo de cores.
Para isso, basta utilizarmos o
método
Enable() do objeto
ColorStream que pertence ao sensor, ele
pode receber por parâmetro o formato que a câmera irá utilizar (RGB, YUV,
Bayer ou IR). Caso você não informe nada ele assumirá o formato padrão (
ColorImageFormat.RgbResolution640x480Fps30).
O corpo do método criado deve ficar similar ao código a seguir.
private void InicializarKinect()
{
32
Casa do Código
Capítulo 4. Fluxo de Cores
kinect = InicializadorKinect.InicializarPrimeiroSensor(10);
kinect.ColorStream.Enable();
}