Cardoso Gabriel Schade - Microsoft Kinect: Crie aplicações interativas стр 12.

Шрифт
Фон

{ 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

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке