Kinect v2 get_IsAvailable()



  • Hallo,

    ich bin gerade daran die Kinect 2 unter Windows 8.1 zum laufen zu bringen und bin auf eine Funktion get_IsAvailable() gestoßen die angeben soll, ob tatsächlich eine Kinect 2 angeschlossen ist. Denn scheinbar gibt es immer einen DefaultKinectSensor.
    Nach ein wenig Recherche (Google) hat sich ergeben, dass erst nach einigen ms (ca. 300) nach dem Aufruf von KinectSensor->Open() der get_IsAvailable()-Wert auf true gesetzt wird. Diese Zeit scheint aber von System zu System unterschiedlich zu sein, bei uns waren es jedenfalls mehr als 300 ms.
    Was ich nicht will, ist eine while schleife die solange läuft bis true zurückgegeben wird oder ein sleep mit festen 300ms.
    Es scheint noch eine Art Callback-Möglichkeit auf eine Veränderung des IsAbailable zu geben. Allerdings habe ich keine Erfahrung mit dem entsprechenden WindowsHandler (WAITABLE_HANDLE).
    Hat jemand Erfahrung und wie man die Kinect2-API sinnvoll einbinden kann? Mein Ziel wäre tatsächlich eine Art Callback auf diesen Available-Wert, der dann die ganze restliche Initialisierung anstößt. Aber wie das am besten umzusetzen wäre weiß ich nicht.
    Viele Dank schonmal im Voraus!



  • Es gibt das KinectSensor.IsAvailableChanged Event, an daß du eine Methode binden kannst.



  • Und weißt du auch wie genau das benutzt werden soll?
    In der "Kinect.h" gibt es nur den IKinectSensor von dem man einen Pointer bekommt.
    Die API vom IKinectSensor enthält die virtuelle Methode

    virtual HRESULT STDMETHODCALLTYPE SubscribeIsAvailableChanged( 
      /* [annotation][out][retval] */ 
      _Out_  WAITABLE_HANDLE *waitableHandle) = 0;
    

    Damit kann ich aber leider nicht viel Anfangen bzw. weiß nicht wie ich das nutzen muss.



  • Sieht für mich wie ein ganz normales Delegate aus: https://msdn.microsoft.com/en-us/library/hh755798.aspx



  • Sorry, aber ich checks gerade nicht so wirklich. Ich kenne mich mit diesen Windows-Spezifika nicht so aus, falls es das sein sollte.

    event TypedEventHandler<KinectSensor, IsAvailableChangedEventArgs>^ IsAvailableChanged {
             EventRegistrationToken add (TypedEventHandler<KinectSensor, IsAvailableChangedEventArgs>^ value);
             void remove (EventRegistrationToken token);
    }
    

    Was genau macht das und wie verwende ich es? Könnt ihr mir vllt ein kurzes Code-Beispiel geben? Ich kenne diese ^-Syntax auch gar nicht. Ist das Standard-C++ oder VS-spezifisch?
    In der "Kinect.h" gibt es wie gesagt nur so eine Subscribe-Methode einer abstrakten "IKinectSensor"-Klasse.
    Ich kenne das bisher so, dass ich einfach einen Funktionspointer übergebe.

    void my_callback( int arg ){/*...*/}
    
    void register_callback( void (*callback)( int arg )){/*...*/}
    
    register_callback( my_callback );
    


  • OK, du programmierst also mit nativem C++. Dann schau dir mal das Beispiel Kinect 4 Windows v2 Events Sample in C++ an.
    In den beiden Dateien WorkingWithKinectEvents.cpp/.h findest du die Implementation (und auch ein Beispiel für Subscribe/Unsubscribe und die Event-Behandlung).


Log in to reply