Share via


Resultaten van het volgen van een lichaam ophalen

Body Tracking SDK maakt gebruik van een body tracker-object om Azure Kinect DK-opnamen te verwerken en resultaten voor het volgen van lichamen te genereren. Het onderhoudt ook de globale status van de tracker, verwerkingswachtrijen en de uitvoerwachtrij. Er zijn drie stappen in het gebruik van de body tracker:

  • Een tracker maken
  • Diepte- en IR-afbeeldingen vastleggen met Azure Kinect DK
  • De opname in de wachtrij plaatsen en de resultaten weergeven.

Een tracker maken

De eerste stap bij het gebruik van lichaamstracering is het maken van een tracker. Hiervoor moet de sensorkalibratie k4a_calibration_t structuur worden doorgegeven. De sensorkalibratie kan worden opgevraagd met behulp van de Azure Kinect Sensor SDK k4a_device_get_calibration() -functie.

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;
}

Diepte- en IR-afbeeldingen vastleggen

Het vastleggen van afbeeldingen met Behulp van Azure Kinect DK wordt behandeld op de pagina afbeeldingen ophalen .

Notitie

K4A_DEPTH_MODE_NFOV_UNBINNED of K4A_DEPTH_MODE_WFOV_2X2BINNED modi worden aanbevolen voor de beste prestaties en nauwkeurigheid. Gebruik de K4A_DEPTH_MODE_OFF modi of K4A_DEPTH_MODE_PASSIVE_IR niet.

De ondersteunde Azure Kinect DK-modi worden beschreven in de azure Kinect DK-hardwarespecificatie en k4a_depth_mode_t opsommingen.

// 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;
}

De opname in de wachtrij plaatsen en de resultaten oproepen

De tracker beheert intern een invoerwachtrij en een uitvoerwachtrij om de Azure Kinect DK-opnamen efficiënter asynchroon te verwerken. Gebruik de functie k4abt_tracker_enqueue_capture() om een nieuwe opname toe te voegen aan de invoerwachtrij. Gebruik de functie k4abt_tracker_pop_result() om een resultaat uit de uitvoerwachtrij weer te geven. Het gebruik van de time-outwaarde is afhankelijk van de toepassing en bepaalt de wachttijd voor wachtrijen.

No Wait processing

Gebruik dit patroon voor toepassingen met één thread die onmiddellijke resultaten nodig hebben en die geschikt zijn voor verwijderde frames (bijvoorbeeld live video bekijken vanaf een apparaat). Het simple_3d_viewer voorbeeld in GitHub Azure-Kinect-Samples is een voorbeeld van verwerking zonder wachten.

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
}

Verwerking wachten

Gebruik dit patroon voor toepassingen die niet voor elke frames resultaten nodig hebben (bijvoorbeeld het verwerken van een video uit een bestand). Het simple_sample.exe voorbeeld in GitHub Azure-Kinect-Samples is een voorbeeld van wachtende verwerking.

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

Volgende stappen