2013-10-03 2 views
0

저는 Kinect for Windows SDK 1.8을 약간 놀았습니다. 잠시 후 다시 익숙해졌습니다. 컬러 및 스켈레톤 스트림을 사용하여 사용자의 비디오 피드에 스켈레톤을 오버레이하는 동시에 자신의 몸통의 X, Y 및 Z 좌표를 실시간으로 표시하는 기본 응용 프로그램을 실행합니다. 이 모든 것이 완벽하게 작동하지만 응용 프로그램을 종료 할 때 문제가 발생했습니다. 첫 번째, 내 Window_Close 이벤트는 다음과 같이 보았다 :Kinect의 모든 스트림과 기능을 윈도우에서 완전히 종료하려면 어떻게합니까?

private void Window_Closed(object sender, EventArgs e) 
{ 
    // Turn off timers. 
    RefreshTimer.IsEnabled = false; 
    RefreshTimer.Stop(); 

    UpdateTimer.IsEnabled = false; 
    UpdateTimer.Stop(); 

    // Turn off Kinect 
    if (this.mainKinect != null) 
    { 
     try 
     { 
      this.mainKinect.Stop(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
     this.TxtBx_KinectStatus.Text += "\n[" + DateTime.Now.TimeOfDay.ToString() + "] " + this.mainKinect.UniqueKinectId.ToString() + " has been turned off."; 
    } 

    // Shut down application 
    Application.Current.Shutdown(); 
} 

내가 'Application.Current.Shutdown을() 내 프로그램이 중단 결코 실제로 가까운 내가 창을 닫을 때 것 때문 덧붙였다. 함수를 통해 this.mainKinect.Stop()에 매달리는 것을 발견했습니다. 여기서 mainKinect는 Kinect 객체로 실제 Kinect를 참조합니다. 두 스트림을 올바르게 종료 할 수 없다고 생각하여 추가 했으므로 Stop() 직전에

this.mainKinect.ColorStream.Disable(); 
this.mainKinect.SkeletonStream.Disable(); 

이 추가되었습니다. 나는 그것이 실제로 SkeletonStream.Disable()에 매달려 있음을 알았고, 나는 왜 그런지 모른다. 나머지 코드 대부분은 예제에서 나온 것입니다. 따라서 이것이 작동하지 않는 이유는 모르겠습니다. 아이디어가 있거나 코드를 더 게시하고 싶다면 언제든지 주저하지 마십시오.

답변

2

모든 스트림이 사용 가능한 경우 항상 확인합니다. 모든 사용 가능한 스트림을 비활성화합니다. 마지막에 연결된 모든 이벤트 핸들러를 분리하는 다음 단계는 try-catch 블록에서 Stop()을 호출하고 문제가 발생할 경우 힌트를 얻기 위해 예외 메시지를 기록합니다.

public void StopKinect() 
{ 
    if (this.sensor == null) 
    { 
     return; 
    } 

    if (this.sensor.SkeletonStream.IsEnabled) 
    { 
     this.sensor.SkeletonStream.Disable(); 
    } 

    if (this.sensor.ColorStream.IsEnabled) 
    { 
     this.sensor.ColorStream.Disable(); 
    } 

    if (this.sensor.DepthStream.IsEnabled) 
    { 
     this.sensor.DepthStream.Disable(); 
    } 

    // detach event handlers 
    this.sensor.SkeletonFrameReady -= this.SensorSkeletonFrameReady; 

    try 
    { 
     this.sensor.Stop() 
    } 
    catch (Exception e) 
    { 
     Debug.WriteLine("unknown Exception {0}", e.Message) 
    } 
} 

희망이 도움이됩니다.

+0

월요일에 다시 일할 때 감사 드려요. 유일한 것은, Stop()에 예외를 던지지 않는 것처럼 보일뿐입니다. –

+1

내가 이전 버전 (1.5 또는 1.6)에 sdk에 "버그"가 있음을 상기 방식으로 알았습니다. 중지하기 전에 스트림을 비활성화 한 것을 잊어 버린 경우 kinect의 전원을 꺼야 제대로 연결이 끊어집니다 . 위의 방법으로 kinect를 멈추고 난 후에이 문제가 발생했습니다. 그러나 버그가 새로운 SDK와 함께 존재하는지 테스트하지 않았습니다. – nhok

+0

흥미 롭습니다. Kinect를 다시 시작하고이 문제가 없어지는지 살펴 보겠습니다. 저는 SDK 1.8을 사용하고 있습니다 만, 그럴 가치가 있습니다. –