التشغيل السريع: إنشاء تطبيق "متتبع الأجسام" Kinect Azure

هل بدأت في استخدام Body Tracking SDK؟ تمكنك هذه البداية السريعة من الحصول على تطبيق "متتبع الأجسام" وتشغيله! يمكنك العثور على المزيد من الأمثلة فيمستودع Azure-Kinect-Sampleهذا.

المتطلبات الأساسية

الرؤوس

يستخدم "تتبع الأجسام" رأساً واحداًk4abt.h. أدرج هذا الرأس بالإضافة إلىk4a.h. تأكد من إعداد المحول البرمجي المُختار لكل من Sdk Sensor SDK وSDK لتتبع الأجسام libوincludeالمجلدات. تحتاج أيضاً إلى رابطk4a.libk4abt.libوملفات. يتطلب تشغيل التطبيق وجودk4a.dllوk4abt.dllوonnxruntime.dllوdnn_model.onnxفي مسار تنفيذ التطبيقات.

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

افتح الجهاز والكاميرا

يفترض تطبيق "متتبع الأجسام" الأول جهاز Azure Kinect واحداً متصلاً بالكمبيوتر.

يبني "متتبع الأجسام" على مستشعر SDK. تحتاج أولاً إلى فتح وتكوين الجهاز لاستخدام "متتبع الأجسام". استخدم الدالة k4a_device_open() لفتح الجهاز ومن ثم تكوينه مع كائنk4a_device_configuration_t. حدد وضع العمق إلىK4A_DEPTH_MODE_NFOV_UNBINNED أو K4A_DEPTH_MODE_WFOV_2X2BINNEDللحصول على أفضل النتائج. لن يعمل "متتبع الأجسام" إذا تم تعيين وضع العمق علىK4A_DEPTH_MODE_OFF أو K4A_DEPTH_MODE_PASSIVE_IR.

يمكن العثور على المزيد من المعلومات حول العثور على الجهاز وفتحه فيهذه الصفحة.

يمكن العثور على مزيد من المعلومات عن أوضاع عمق azure Kinect على هذه الصفحات:مواصفات الأجهزةو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);

إنشاء جهاز التتبع

الخطوة الأولى في الحصول على نتائج "متتبع الأجسام" هو إنشاء متتبع الأجسام. يحتاج إلى بنية معايرة الاستشعارk4a_calibration_t. يمكن الاستعلام عن معايرة المستشعر باستخدام دالة 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);

احصل على اللقطات من جهاز Azure Kinect

يمكن العثور على مزيد من المعلومات عن استرداد بيانات الصورة فيهذه الصفحة.

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

أدرج اللقطة واجمع النتائج

يحتفظ جهاز التتبع داخلياً بقائمة إدخال وقائمة إخراج لمعالجة لقطات Azure Kinect DK بشكل أكثر كفاءة. الخطوة التالية هي استخدام الدالةk4abt_tracker_enqueue_capture() لإضافة لقطة جديدة إلى قائمة الإدخال. استخدم الدالةk4abt_tracker_pop_result() لجمع النتيجة من قائمة الإخراج. تعتمد قيمة المهلة على التطبيق وتتحكم في وقت الانتظار في القائمة.

يستخدم تطبيق "متتبع الأجسام" الأول نمط المعالجة في الوقت الفعلي. راجعالحصول على نتائج متتبع الجسم للحصول على شرح مفصل للأنماط الأخرى.

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
}

الوصول إلى بيانات نتائج "متتبع الأجسام"

تُخزَّن نتائج "تتبع الأجسام" لكل لقطة استشعار في هيكل إطار الجسم k4abt_frame_t. يحتوي كل إطار أساسي على ثلاثة مكونات رئيسية: مجموعة من بنيات الجسم، وخريطة دليل الجسم ثنائية الأبعاد، ولقطة الإدخال.

يصل تطبيق تتبع الجسم الأول فقط إلى عدد الأجسام المكتشفة. راجعبيانات الوصول إلى إطار الأجسام للحصول على شرح مفصل للبيانات عن إطار الجسم.

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

تنظيف

الخطوة الأخيرة هي إغلاق "متتبع الأجسام" وترك الجسم المُتتبع. تحتاج أيضاً إلى إيقاف وإغلاق الجهاز.

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

المصدر كامل

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

الخطوات التالية