Bagikan melalui


Mulai cepat: Membangun aplikasi pelacakan tubuh Azure Kinect

Mulai menggunakan Body Tracking SDK? Mulai cepat ini akan membantu menyiapkan dan menjalankan pelacakan tubuh! Anda dapat menemukan contoh lainnya dalam repositori Azure-Kinect-Sample ini.

Prasyarat

Header

Pelacakan tubuh menggunakan satu header, k4abt.h. Sertakan header ini selain k4a.h. Pastikan compiler pilihan Anda disiapkan untuk folder lib dan include Sensor SDK dan Body Tracking SDK. Anda juga perlu menautkan ke file k4a.lib dan k4abt.lib. Menjalankan aplikasi mengharuskan k4a.dll, k4abt.dll, onnxruntime.dll, dan dnn_model.onnx berada di jalur eksekusi aplikasi.

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

Membuka perangkat dan menyalakan kamera

Aplikasi pelacakan tubuh pertama Anda mengasumsikan ada satu perangkat Azure Kinect yang tersambung ke PC.

Pelacakan tubuh dibangun berdasarkan Sensor SDK. Untuk menggunakan pelacakan tubuh, pertama-tama Anda perlu membuka dan mengonfigurasi perangkat. Gunakan fungsi k4a_device_open() untuk membuka perangkat lalu konfigurasikan dengan objek k4a_device_configuration_t. Untuk hasil terbaik, atur mode kedalaman ke K4A_DEPTH_MODE_NFOV_UNBINNED atau K4A_DEPTH_MODE_WFOV_2X2BINNED. Pelacakan tubuh tidak akan berjalan jika mode kedalaman diatur ke K4A_DEPTH_MODE_OFF atau K4A_DEPTH_MODE_PASSIVE_IR.

Anda dapat menemukan informasi lebih lanjut tentang menemukan dan membuka perangkat di halaman ini.

Anda dapat menemukan informasi lebih lanjut tentang mode kedalaman Azure Kinect di halaman ini: spesifikasi perangkat keras dan enumerasi k4a_depth_mode_t.

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

Membuat pelacak

Langkah pertama dalam mendapatkan hasil pelacakan tubuh adalah membuat pelacak tubuh. Perlu kalibrasi sensor struktur k4a_calibration_t. Kalibrasi sensor dapat dikueri menggunakan fungsi 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);

Mendapatkan tangkapan dari perangkat Azure Kinect

Anda dapat menemukan informasi lebih lanjut tentang mengambil data gambar di halaman ini.

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

Masukkan tangkapan dalam antrean dan memunculkan hasilnya

Pelacak secara internal mempertahankan antrean input dan antrean output untuk memproses tangkapan Azure Kinect DK secara asinkron dengan lebih efisien. Langkah selanjutnya adalah menggunakan fungsi k4abt_tracker_enqueue_capture() untuk menambahkan tangkapan baru ke antrean input. Gunakan fungsi k4abt_tracker_pop_result() untuk memunculkan hasil dari antrean output. Nilai batas waktu tergantung pada aplikasi dan mengontrol waktu tunggu antrean.

Aplikasi pelacakan tubuh pertama Anda menggunakan pola pemrosesan real time. Buka mendapatkan hasil pelacakan tubuh untuk penjelasan terperinci tentang pola lain.

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
}

Mengakses data hasil pelacakan tubuh

Hasil pelacakan tubuh untuk setiap tangkapan sensor disimpan dalam struktur k4abt_frame_t bingkai tubuh. Setiap bingkai tubuh berisi tiga komponen utama: koleksi struct tubuh, peta indeks tubuh 2D, dan tangkapan input.

Aplikasi pelacakan tubuh pertama Anda hanya mengakses jumlah tubuh yang terdeteksi. Lihat mengakses data dalam bingkai tubuh untuk penjelasan terperinci tentang data dalam bingkai tubuh.

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

Penghapusan

Langkah terakhir adalah mematikan pelacak tubuh dan melepaskan objek pelacakan tubuh. Anda juga perlu menghentikan dan menutup perangkat.

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

Sumber lengkap

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

Langkah berikutnya