{ get; set; }
public KinectSensorChooser SeletorKinect
{ get; private set; }
public InicializadorKinect()
{
SeletorKinect = new KinectSensorChooser();
SeletorKinect.KinectChanged += SeletorKinect_KinectChanged;
SeletorKinect.Start();
}
O método SeletorKinect_KinectChanged é invocado toda vez que um
sensor é conectado ou desconectado (por qualquer motivo) e as informações refe-
rentes a este sensor estão encapsuladas nas propriedades OldSensor e NewSensor
do objeto KinectChangedArgs que é recebido por parâmetro. Nesta aplicação,
iremos invocar o método que inicializa o sensor cada vez que um novo sensor é
descoberto e desligar as funções de um sensor que foi desconectado, apenas para segurança, pois não é em todos os casos que o sensor foi desconectado da energia 39
4.3. Refatoração
Casa do Código
mesmo estando em um estado inválido ele ainda pode consumir recurso da má-
quina.
Para desligar todos os fluxos utilizaremos o método Disable() de cada fluxo,
mas antes de desligá-los
é necessário verificar se os mesmos estão ligados através da propriedade IsEnabled. É necessário que este desligamento esteja sendo feito dentro de um bloco try catch, pois o sensor pode entrar em um estado inválido
durante alguma operação.
private void SeletorKinect_KinectChanged(object sender,
KinectChangedEventArgs kinectArgs)
{
if (kinectArgs.OldSensor != null)
{
try
{
if (kinectArgs.OldSensor.DepthStream.IsEnabled)
kinectArgs.OldSensor.DepthStream.Disable();
if (kinectArgs.OldSensor.SkeletonStream.IsEnabled)
kinectArgs.OldSensor.SkeletonStream.Disable();
if (kinectArgs.OldSensor.ColorStream.IsEnabled)
kinectArgs.OldSensor.ColorStream.Disable();
}
catch (InvalidOperationException)
{
// Captura exceção caso o KinectSensor entre
// em um estado inválido durante a desabilitação
// de um fluxo.
}
}
if (kinectArgs.NewSensor != null)
{
if (MetodoInicializadorKinect != null)
MetodoInicializadorKinect(SeletorKinect.Kinect);
}
}
40
Casa do Código
Capítulo 4. Fluxo de Cores
Refatorando a Aplicação SensorRGB
Agora iremos refatorar nossa aplicação para se adequar a este novo
AuxiliarKinect.
Basicamente o que precisamos fazer é alterar o método
InicializarKinect para que, ao invés de utilizar o método estático de antes,
passe a utilizar nosso novo seletor.
Antes de alterarmos este método, criaremos um novo método nesta apli-
cação, chamado
InicializarSeletor.
Ele irá instanciar um novo objeto
InicializadorKinect e invocar o método já existente InicializarKinect
que agora não deve mais conter a chamada para o antigo método estático da classe InicializadorKinect e deve receber o objeto Kinect do seletor por parâmetro.
Seu código ficará similar ao código a seguir.
private void InicializarSeletor()
{
InicializadorKinect inicializador = new InicializadorKinect();
InicializarKinect(inicializador.SeletorKinect.Kinect);
}
private void InicializarKinect(KinectSensor kinectSensor)
{
kinect = kinectSensor;
kinect.ColorStream.Enable
(ColorImageFormat.RgbResolution640x480Fps30);
kinect.ColorFrameReady += kinect_ColorFrameReady;
}
Agora no construtor passaremos a invocar o método para inicializar o seletor
e não mais o sensor, pois este método já será chamado internamente. Talvez você esteja com dúvidas quanto ao motivo de termos dois métodos separados, um para
apenas o sensor e um para o seletor (que chama internamente o método do sensor), esta pergunta será respondida em breve.
Note que apenas duas linhas foram criadas, e será que a aplicação continua a
mesma? A resposta é não, agora caso aconteça algum problema com o sensor a aplicação não dispara exceções não tratadas, e sim, apenas para de atualizar os quadros do vídeo. Porém ainda existe um problema não resolvido nesta refatoração: caso o sensor volte a seu estado funcional, ele não retornará a ligar o fluxo de cores e não voltará a atualizar a imagem. Faça o seguinte teste: remova seu sensor de seu computador (as imagens irão parar de ser atualizadas) e em seguida reconecte o sensor (nada deve acontecer).
41
4.3. Refatoração
Casa do Código
Para resolver este problema, precisamos informar ao objeto inicializador
que temos um método que é necessário executar sempre que um sensor for desco-
berto, para isso, utilizaremos a propriedade MetodoInicializadorKinect. En-
tão no método InicializarSeletor após instanciar o objeto devemos atribuir à
propriedade MetodoInicializadorKinect o método InicializarKinect.
Feito isso não será mais necessário invocá-lo dentro do método que inicializa o seletor.
Refaça o teste de remover e reconectar o sensor em seu computador e você per-
ceberá que agora ele volta a funcionar assim que o Kinect é reconectado! Mas ainda não acabamos, vamos à nossa janela novamente.
No Grid principal de nossa janela crie uma nova linha acima do painel de ima-
gem com a mesma altura da linha onde está a marcação para escala cinza (não es-
queça de incluir a propriedade Grid.Row = "1" no objeto Image). Agora usaremos o Microsoft.Kinect.Toolkit.Controls.Interactions