Snabbstart: Skapa ett azure Kinect-program för kroppsspårning

Komma igång med SDK för kroppsspårning? Den här snabbstarten hjälper dig att komma igång med kroppsspårning! Du hittar fler exempel på den här lagringsplatsen Azure-Kinect-Sample.

Förutsättningar

Sidhuvuden

Brödtextspårning använder en enda rubrik, k4abt.h. Inkludera det här huvudet utöver k4a.h. Kontrollera att valfri kompilator har konfigurerats för både Sensor SDK och SDK lib för kroppsspårning och include mappar. Du måste också länka till k4a.lib och k4abt.lib filer. Körning av programmet kräver k4a.dll, k4abt.dll, onnxruntime.dlloch dnn_model.onnx för att finnas i programkörningssökvägen.

#include <k4a/k4a.h>
#include <k4abt.h>

Öppna enheten och starta kameran

Ditt första kroppsspårningsprogram förutsätter att en enda Azure Kinect-enhet är ansluten till datorn.

Kroppsspårning bygger på Sensor SDK. Om du vill använda brödtextspårning måste du först öppna och konfigurera enheten. Använd funktionen k4a_device_open() för att öppna enheten och konfigurera den sedan med ett k4a_device_configuration_t-objekt . För bästa resultat anger du djupläget till K4A_DEPTH_MODE_NFOV_UNBINNED eller K4A_DEPTH_MODE_WFOV_2X2BINNED. Kroppsspåraren körs inte om djupläget är inställt på K4A_DEPTH_MODE_OFF eller K4A_DEPTH_MODE_PASSIVE_IR.

Du hittar mer information om hur du hittar och öppnar enheten på den här sidan.

Du hittar mer information om djuplägen för Azure Kinect på följande sidor: maskinvaruspecifikation och k4a_depth_mode_t uppräkningar.

k4a_device_t device = NULL;
k4a_device_open(0, &device);

// Start camera. Make sure depth camera is enabled.
k4a_device_configuration_t deviceConfig = K4A_DEVICE_CONFIG_INIT_DISABLE_ALL;
deviceConfig.depth_mode = K4A_DEPTH_MODE_NFOV_UNBINNED;
deviceConfig.color_resolution = K4A_COLOR_RESOLUTION_OFF;
k4a_device_start_cameras(device, &deviceConfig);

Skapa spåraren

Det första steget i att få resultat från kroppsspårning är att skapa en kroppsspårare. Den behöver sensorkalibrering k4a_calibration_t struktur. Du kan köra frågor mot sensorkalibreringen med hjälp av funktionen k4a_device_get_calibration().

k4a_calibration_t sensor_calibration;
k4a_device_get_calibration(device, deviceConfig.depth_mode, deviceConfig.color_resolution, &sensor_calibration);

k4abt_tracker_t tracker = NULL;
k4abt_tracker_configuration_t tracker_config = K4ABT_TRACKER_CONFIG_DEFAULT;
k4abt_tracker_create(&sensor_calibration, tracker_config, &tracker);

Hämta avbildningar från Azure Kinect-enheten

Mer information om hur du hämtar bilddata finns på den här sidan.

// Capture a depth frame
k4a_capture_t sensor_capture;
k4a_device_get_capture(device, &sensor_capture, TIMEOUT_IN_MS);

Köa avbildningen och pop resultatet

Spåraren underhåller internt en indatakö och en utdatakö för att asynkront bearbeta Azure Kinect DK:et. Nästa steg är att använda k4abt_tracker_enqueue_capture() funktionen för att lägga till en ny avbildning i indatakön. k4abt_tracker_pop_result() Använd funktionen för att visa ett resultat från utdatakön. Tidsgränsvärdet är beroende av programmet och styr köväntetiden.

Ditt första kroppsspårningsprogram använder realtidsbearbetningsmönstret. En detaljerad förklaring av de andra mönstren finns i Hämta resultat för brödtextspårning .

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_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, K4A_WAIT_INFINITE);
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
}

Få åtkomst till resultatdata för brödtextspårning

Kroppsspårningsresultaten för varje sensorfångst lagras i en kroppsram k4abt_frame_t struktur. Varje brödtextram innehåller tre viktiga komponenter: en samling kroppsstrukturer, en 2D-brödtextindexkarta och indatainsamlingen.

Ditt första program för kroppsspårning har bara åtkomst till antalet identifierade kroppar. Se åtkomst till data i brödtextram för detaljerad förklaring av data i en brödtextram.

size_t num_bodies = k4abt_frame_get_num_bodies(body_frame);
printf("%zu bodies are detected!\n", num_bodies);

Rensa

Det sista steget är att stänga av kroppsspåraren och släppa kroppsspårningsobjektet. Du måste också stoppa och stänga enheten.

k4abt_tracker_shutdown(tracker);
k4abt_tracker_destroy(tracker);
k4a_device_stop_cameras(device);
k4a_device_close(device);

Fullständig källa

#include <stdio.h>
#include <stdlib.h>

#include <k4a/k4a.h>
#include <k4abt.h>

#define VERIFY(result, error)                                                                            \
    if(result != K4A_RESULT_SUCCEEDED)                                                                   \
    {                                                                                                    \
        printf("%s \n - (File: %s, Function: %s, Line: %d)\n", error, __FILE__, __FUNCTION__, __LINE__); \
        exit(1);                                                                                         \
    }                                                                                                    \

int main()
{
    k4a_device_t device = NULL;
    VERIFY(k4a_device_open(0, &device), "Open K4A Device failed!");

    // Start camera. Make sure depth camera is enabled.
    k4a_device_configuration_t deviceConfig = K4A_DEVICE_CONFIG_INIT_DISABLE_ALL;
    deviceConfig.depth_mode = K4A_DEPTH_MODE_NFOV_UNBINNED;
    deviceConfig.color_resolution = K4A_COLOR_RESOLUTION_OFF;
    VERIFY(k4a_device_start_cameras(device, &deviceConfig), "Start K4A cameras failed!");

    k4a_calibration_t sensor_calibration;
    VERIFY(k4a_device_get_calibration(device, deviceConfig.depth_mode, deviceConfig.color_resolution, &sensor_calibration),
        "Get depth camera calibration failed!");

    k4abt_tracker_t tracker = NULL;
    k4abt_tracker_configuration_t tracker_config = K4ABT_TRACKER_CONFIG_DEFAULT;
    VERIFY(k4abt_tracker_create(&sensor_calibration, tracker_config, &tracker), "Body tracker initialization failed!");

    int frame_count = 0;
    do
    {
        k4a_capture_t sensor_capture;
        k4a_wait_result_t get_capture_result = k4a_device_get_capture(device, &sensor_capture, K4A_WAIT_INFINITE);
        if (get_capture_result == K4A_WAIT_RESULT_SUCCEEDED)
        {
            frame_count++;
            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_TIMEOUT)
            {
                // It should never hit timeout when K4A_WAIT_INFINITE is set.
                printf("Error! Add capture to tracker process queue timeout!\n");
                break;
            }
            else if (queue_capture_result == K4A_WAIT_RESULT_FAILED)
            {
                printf("Error! Add 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)
            {
                // Successfully popped the body tracking result. Start your processing

                size_t num_bodies = k4abt_frame_get_num_bodies(body_frame);
                printf("%zu bodies are detected!\n", num_bodies);

                k4abt_frame_release(body_frame); // Remember to release the body frame once you finish using it
            }
            else if (pop_frame_result == K4A_WAIT_RESULT_TIMEOUT)
            {
                //  It should never hit timeout when K4A_WAIT_INFINITE is set.
                printf("Error! Pop body frame result timeout!\n");
                break;
            }
            else
            {
                printf("Pop body frame result failed!\n");
                break;
            }
        }
        else if (get_capture_result == K4A_WAIT_RESULT_TIMEOUT)
        {
            // It should never hit time out when K4A_WAIT_INFINITE is set.
            printf("Error! Get depth frame time out!\n");
            break;
        }
        else
        {
            printf("Get depth capture returned error: %d\n", get_capture_result);
            break;
        }

    } while (frame_count < 100);

    printf("Finished body tracking processing!\n");

    k4abt_tracker_shutdown(tracker);
    k4abt_tracker_destroy(tracker);
    k4a_device_stop_cameras(device);
    k4a_device_close(device);

    return 0;
}

Nästa steg