hızlı başlangıç: Azure Kinect gövde izleme uygulaması oluşturma
Gövde Izleme SDK 'Sı ile çalışmaya başlama Bu hızlı başlangıç, gövde izlemeyle çalışmaya başlamanızı sağlayacak! bu Azure-Kinect-örnekdeposunda daha fazla örnek bulabilirsiniz.
Önkoşullar
- Azure Kinect DK’yi kurma
- Gövde İzleme SDK’sını ayarlama
- ilk Azure Kinect uygulamanızın hızlı başlangıç adımlarını nasıl derlemenize yardımcı olacak.
- Aşağıdaki algılayıcı SDK işlevleri hakkında bilgi edinin:
- Aşağıdaki gövde Izleme SDK işlevleri hakkındaki belgeleri gözden geçirin:
Üst Bilgiler
Gövde izleme tek bir üst bilgi kullanır, k4abt.h . Buna ek olarak bu üstbilgiyi dahil edin k4a.h . Seçim derleyicisinin hem algılayıcı SDK hem de gövde Izleme SDK 'Sı ve klasörleri için ayarlandığından emin olun lib include . Ayrıca, ve dosyalarına bağlantı oluşturmanız k4a.lib gerekir k4abt.lib . Uygulamanın çalıştırılması,, k4a.dll k4abt.dll onnxruntime.dll ve dnn_model.onnx uygulamalarının yürütme yolunda olması gerekir.
#include <k4a/k4a.h>
#include <k4abt.h>
Cihazı açın ve kamerayı başlatın
ilk gövde izleme uygulamanız, bilgisayara bağlı tek bir Azure Kinect cihazının olduğunu varsayar.
Gövde izleme, algılayıcı SDK 'sında oluşturulur. Gövde izlemeyi kullanmak için önce cihazı açmanız ve yapılandırmanız gerekir. Cihazı açmak için k4a_device_open () işlevini kullanın ve ardından bunu bir k4a_device_configuration_t nesnesiyle yapılandırın. En iyi sonuçlar için derinlik modunu veya olarak K4A_DEPTH_MODE_NFOV_UNBINNED ayarlayın K4A_DEPTH_MODE_WFOV_2X2BINNED . Derinlik modu veya olarak ayarlandıysa gövde İzleyicisi çalışmaz K4A_DEPTH_MODE_OFF K4A_DEPTH_MODE_PASSIVE_IR .
Bu sayfadacihazı bulma ve açma hakkında daha fazla bilgi edinebilirsiniz.
bu sayfalarda Azure Kinect derinlik modları hakkında daha fazla bilgi edinebilirsiniz: 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);
İzleyici oluşturma
Gövde izleme sonuçlarını almak için ilk adım bir gövde izleyici oluşturmaktır. Bu, algılayıcı ayarlaması k4a_calibration_t yapısına ihtiyaç duyuyor. Algılayıcı ayarı 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 yakalanan yakalamaları al
Görüntü verilerini Bu sayfadaalma hakkında daha fazla bilgi edinebilirsiniz.
// Capture a depth frame
k4a_capture_t sensor_capture;
k4a_device_get_capture(device, &sensor_capture, TIMEOUT_IN_MS);
Yakalamayı sıraya al ve sonuçları aç
izleyici, Azure Kinect DK 'yi zaman uyumsuz olarak işlemek için bir giriş kuyruğu ve bir çıkış kuyruğu saklar. Sonraki adım, k4abt_tracker_enqueue_capture() giriş kuyruğuna yeni bir yakalama eklemek için işlevini kullanmaktır. k4abt_tracker_pop_result()Çıkış sırasından bir sonuç eklemek için işlevini kullanın. Zaman aşımı değeri uygulamaya bağımlıdır ve sıraya alma bekleme süresini denetler.
İlk gövde izleme uygulamanız gerçek zamanlı işleme modelini 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şin
Her bir algılayıcı yakalamanın gövde izleme sonuçları, bir gövde çerçevesinin k4abt_frame_t yapısında depolanır. Her gövde çerçevesi üç anahtar bileşeni içerir: gövde yapıları, 2B gövde dizini Haritası ve giriş yakalama.
İlk gövde izleme uygulamanız yalnızca algılanan gövdelerin sayısına erişir. Gövde çerçevesindeki verilerin ayrıntılı açıklaması için gövde çerçevesindeki verilere erişim 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 kapatmakta ve gövde izleme nesnesini yayınlamadır. Ayrıca, cihazı durdurup 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;
}