Dela via


Hämta kroppsspårningsresultat

SDK för kroppsspårning använder ett body tracker-objekt för att bearbeta Azure Kinect DK-avbildningar och genererar resultat för kroppsspårning. Den upprätthåller också global status för spåraren, bearbetningsköerna och utdatakön. Det finns tre steg i att använda kroppsspåraren:

  • Skapa en spårare
  • Samla in djup- och IR-avbildningar med Azure Kinect DK
  • Spara avbildningen och pop resultatet.

Skapa en spårare

Det första steget i att använda kroppsspårning är att skapa en spårare och kräver att sensorkalibreringen skickas k4a_calibration_t struktur. Sensorkalibreringen kan efterfrågas med hjälp av funktionen Azure Kinect Sensor SDK k4a_device_get_calibration().

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

Avbilda djup- och IR-bilder

Bildinsamling med Azure Kinect DK beskrivs på sidan hämta bilder .

Kommentar

K4A_DEPTH_MODE_NFOV_UNBINNED eller K4A_DEPTH_MODE_WFOV_2X2BINNED lägen rekommenderas för bästa prestanda och noggrannhet. Använd inte lägena K4A_DEPTH_MODE_OFF eller K4A_DEPTH_MODE_PASSIVE_IR .

De Azure Kinect DK-lägen som stöds beskrivs i maskinvaruspecifikationen för Azure Kinect DK och k4a_depth_mode_t uppräkningar.

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

Spara avbildningen och pop resultatet

Spåraren underhåller internt en indatakö och en utdatakö för att asynkront bearbeta Azure Kinect DK-insamlingen mer effektivt. Använd funktionen k4abt_tracker_enqueue_capture() för att lägga till en ny avbildning i indatakön. Använd funktionen k4abt_tracker_pop_result() för att visa ett resultat från utdatakön. Användningen av timeout-värdet är beroende av programmet och styr köväntetiden.

Ingen väntande bearbetning

Använd det här mönstret för entrådade program som behöver omedelbara resultat och som kan hantera borttagna bildrutor (t.ex. visning av livevideo från en enhet). Exemplet simple_3d_viewer som finns i GitHub Azure-Kinect-Samples är ett exempel på ingen väntande bearbetning.

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
}

Vänta bearbetning

Använd det här mönstret för program som inte behöver resultat för varje bildruta (t.ex. bearbetning av en video från en fil). Exemplet simple_sample.exe som finns i GitHub Azure-Kinect-Samples är ett exempel på väntebearbetning.

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ästa steg