Abrufen der Body Tracking-Ergebnisse

Das Bodytracking-SDK verarbeitet Aufnahmen von Azure Kinect DK mithilfe eines Bodytrackerobjekts und generiert Bodytrackingergebnisse. Außerdem wird mithilfe des SDK der globale Status des Trackers, der Verarbeitungswarteschlangen und der Ausgabewarteschlange verwaltet. Die Verwendung des Bodytrackers umfasst drei Schritte:

  • Erstellen eines Trackers
  • Erfassen von Tiefen- und Infrarotbildern mithilfe von Azure Kinect DK
  • Einreihen der Aufzeichnungen in eine Warteschlange und Ausgeben der Ergebnisse

Erstellen eines Trackers

Der erste Schritt bei der Verwendung des Bodytrackers besteht darin, einen Tracker zu erstellen. Dazu muss die Struktur k4a_calibration_t für die Sensorkalibrierung übergeben werden. Die Sensorkalibrierung kann mithilfe der Funktion k4a_device_get_calibration() des Azure Kinect Sensor SDK abgefragt werden.

k4a_calibration_t sensor_calibration;
if (K4A_RESULT_SUCCEEDED != k4a_device_get_calibration(device, device_config.depth_mode, K4A_COLOR_RESOLUTION_OFF, &sensor_calibration))
{
    printf("Get depth camera calibration failed!\n");
    return 0;
}

k4abt_tracker_t tracker = NULL;
k4abt_tracker_configuration_t tracker_config = K4ABT_TRACKER_CONFIG_DEFAULT;
if (K4A_RESULT_SUCCEEDED != k4abt_tracker_create(&sensor_calibration, tracker_config, &tracker))
{
    printf("Body tracker initialization failed!\n");
    return 0;
}

Aufnehmen von Tiefen- und Infrarotbildern

Wie Bilder mithilfe von Azure Kinect DK aufgenommen werden, wird auf der Seite Abrufen von Bildern behandelt.

Hinweis

Für eine optimale Leistung und Genauigkeit werden die Modi K4A_DEPTH_MODE_NFOV_UNBINNED oder K4A_DEPTH_MODE_WFOV_2X2BINNED empfohlen. Verwenden Sie nicht die Modi K4A_DEPTH_MODE_OFF oder K4A_DEPTH_MODE_PASSIVE_IR.

Die unterstützten Azure Kinect DK-Modi werden in der Hardwarespezifikation und der Enumeration k4a_depth_mode_t von Azure Kinect DK beschrieben.

// Capture a depth frame
switch (k4a_device_get_capture(device, &capture, TIMEOUT_IN_MS))
{
case K4A_WAIT_RESULT_SUCCEEDED:
    break;
case K4A_WAIT_RESULT_TIMEOUT:
    printf("Timed out waiting for a capture\n");
    continue;
    break;
case K4A_WAIT_RESULT_FAILED:
    printf("Failed to read a capture\n");
    goto Exit;
}

Einstellen der Aufzeichnung in die Warteschlange und Abrufen der Ergebnisse

Die Nachverfolgung verwaltet intern eine Eingabewarteschlange und eine Ausgabewarteschlange, um die asynchrone Verarbeitung der Azure Kinect DK-Aufzeichnungen effizienter durchzuführen. Mit der Funktion k4abt_tracker_enqueue_capture() fügen Sie der Eingabewarteschlange eine neue Aufzeichnung hinzu. Mit der Funktion k4abt_tracker_pop_result() können Sie ein Ergebnis aus der Ausgabewarteschlange ausgeben. Die Verwendung des Timeoutwerts hängt von der Anwendung ab und steuert die Wartezeit beim Queuing.

Keine Warteverarbeitung

Verwenden Sie dieses Muster für Singlethread-Anwendungen, die sofortige Ergebnisse benötigen und verworfene Frames (z. B. beim Anzeigen von Livevideos von einem Gerät) berücksichtigen können. Das simple_3d_viewer-Beispiel in den Azure Kinect-Beispielen auf GitHub ist ein Beispiel für die Verarbeitung ohne Wartezeit.

k4a_wait_result_t queue_capture_result = k4abt_tracker_enqueue_capture(tracker, sensor_capture, 0);
k4a_capture_release(sensor_capture); // Remember to release the sensor capture once you finish using it
if (queue_capture_result == K4A_WAIT_RESULT_FAILED)
{
    printf("Error! Adding capture to tracker process queue failed!\n");
    break;
}

k4abt_frame_t body_frame = NULL;
k4a_wait_result_t pop_frame_result = k4abt_tracker_pop_result(tracker, &body_frame, 0);
if (pop_frame_result == K4A_WAIT_RESULT_SUCCEEDED)
{
    // Successfully popped the body tracking result. Start your processing
    ...

    k4abt_frame_release(body_frame); // Remember to release the body frame once you finish using it
}

Warteverarbeitung

Verwenden Sie dieses Muster für Anwendungen, die nicht für alle Frames Ergebnisse benötigen (z. B. bei der Verarbeitung eines Videos aus einer Datei). Das simple_sample.exe-Beispiel in den Azure Kinect-Beispielen auf GitHub ist ein Beispiel für die Warteverarbeitung.

k4a_wait_result_t queue_capture_result = k4abt_tracker_enqueue_capture(tracker, sensor_capture, K4A_WAIT_INFINITE);
k4a_capture_release(sensor_capture); // Remember to release the sensor capture once you finish using it
if (queue_capture_result != K4A_WAIT_RESULT_SUCCEEDED)
{
    // It should never hit timeout or error when K4A_WAIT_INFINITE is set.
    printf("Error! Adding capture to tracker process queue failed!\n");
    break;
}

k4abt_frame_t body_frame = NULL;
k4a_wait_result_t pop_frame_result = k4abt_tracker_pop_result(tracker, &body_frame, K4A_WAIT_INFINITE);
if (pop_frame_result != K4A_WAIT_RESULT_SUCCEEDED)
{
    // It should never hit timeout or error when K4A_WAIT_INFINITE is set.
    printf("Error! Popping body tracking result failed!\n");
    break;
}
// Successfully popped the body tracking result. Start your processing
...

k4abt_frame_release(body_frame); // Remember to release the body frame once you finish using it

Nächste Schritte