Share via


Hızlı Başlangıç: Azure Kinect gövde izleme uygulaması oluşturma

Gövde İzleme SDK'sını kullanmaya mı başlıyorsunuz? Bu hızlı başlangıç, vücut izleme ile çalışmaya başlamanızı sağlayacak! Bu Azure-Kinect-Sample deposunda daha fazla örnek bulabilirsiniz.

Önkoşullar

Üst Bilgiler

Gövde izleme tek bir üst bilgi kullanır: k4abt.h. Bu üst bilgiyi öğesine ek olarak k4a.hekleyin. Seçtiğiniz derleyicinin hem Algılayıcı SDK'sı hem de Gövde İzleme SDK'sı lib ve include klasörleri için ayarlandığından emin olun. Ve k4abt.lib dosyalarına k4a.lib da bağlantı vermeniz gerekir. Uygulamayı çalıştırmak için , k4abt.dll, onnxruntime.dllve dnn_model.onnx uygulamalarının yürütme yolunda olması gerekirk4a.dll.

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

Cihazı açın ve kamerayı başlatın

İlk vücut izleme uygulamanız, bilgisayara bağlı tek bir Azure Kinect cihazı olduğunu varsayar.

Gövde izleme, Algılayıcı SDK'sını oluşturur. Gövde izlemeyi kullanmak için önce cihazı açmanız ve yapılandırmanız gerekir. k4a_device_open() işlevini kullanarak cihazı açın ve k4a_device_configuration_t nesnesiyle yapılandırın. En iyi sonuçları elde etmek için derinlik modunu veya K4A_DEPTH_MODE_WFOV_2X2BINNEDolarak K4A_DEPTH_MODE_NFOV_UNBINNED ayarlayın. Derinlik modu veya K4A_DEPTH_MODE_PASSIVE_IRolarak ayarlanırsa K4A_DEPTH_MODE_OFF gövde izleyicisi çalışmaz.

Bu sayfada cihazı bulma ve açma hakkında daha fazla bilgi bulabilirsiniz.

Bu sayfalarda Azure Kinect derinlik modları hakkında daha fazla bilgi bulabilirsiniz: donanım belirtimi ve k4a_depth_mode_t numaralandırmaları.

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

İzleyiciyi oluşturma

Gövde izleme sonuçlarını almanın ilk adımı bir gövde izleyicisi oluşturmaktır. Sensör kalibrasyonu k4a_calibration_t yapısına ihtiyacı vardır. Algılayıcı kalibrasyonu k4a_device_get_calibration() işlevi kullanılarak sorgulanabilir.

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

Azure Kinect cihazından yakalamaları alma

Bu sayfada görüntü verilerini alma hakkında daha fazla bilgi bulabilirsiniz.

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

Yakalamayı sıralama ve sonuçları açma

İzleyici, Azure Kinect DK'nin yakalamalarını daha verimli bir şekilde zaman uyumsuz olarak işlemek için dahili olarak bir giriş kuyruğu ve bir çıkış kuyruğu tutar. Sonraki adım, giriş kuyruğuna k4abt_tracker_enqueue_capture() yeni bir yakalama eklemek için işlevini kullanmaktır. k4abt_tracker_pop_result() Çıkış kuyruğundan bir sonuç açmak için işlevini kullanın. Zaman aşımı değeri uygulamaya bağlıdır ve kuyruğa alma bekleme süresini denetler.

İlk gövde izleme uygulamanız gerçek zamanlı işleme desenini kullanır. Diğer desenlerin ayrıntılı açıklaması için gövde izleme sonuçlarını alma bölümüne bakın.

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
}

Gövde izleme sonuç verilerine erişme

Her algılayıcı yakalaması için gövde izleme sonuçları bir gövde çerçevesi k4abt_frame_t yapısında depolanır. Her gövde çerçevesi üç temel bileşen içerir: gövde yapılarından oluşan bir koleksiyon, 2B gövde dizini haritası ve giriş yakalama.

İlk vücut izleme uygulamanız yalnızca algılanan gövde sayısına erişir. Gövde çerçevesindeki verilerin ayrıntılı açıklaması için gövde çerçevesindeki verilere erişme bölümüne bakın.

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

Temizleme

Son adım, gövde izleyicisini kapatmak ve gövde izleme nesnesini serbest bırakmaktır. Ayrıca cihazı durdurmanız ve kapatmanız gerekir.

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

Tam kaynak

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

Sonraki adımlar