Obtenir les résultats Body Tracking
Le Kit de développement logiciel (SDK) de suivi de corps utilise un objet dédié au suivi de corps pour traiter les captures Azure Kinect DK, et génère des résultats de suivi de corps. Il gère également l’état global du dispositif de suivi, le traitement des files d’attente et la file d’attente de sortie. L’utilisation du dispositif de suivi de corps comporte trois étapes :
- Créer un dispositif de suivi
- Capturer des images de profondeur et IR à l’aide d’un appareil Azure Kinect DK
- Mettre en file d’attente la capture et afficher les résultats
Créer un dispositif de suivi
La première étape de l’utilisation du suivi de corps consiste à créer un dispositif de suivi et à suivre la procédure d’étalonnage du capteur k4a_calibration_t. L’étalonnage du capteur peut être interrogé à l’aide de la fonction k4a_device_get_calibration() du Kit de développement logiciel (SDK) du capteur Azure Kinect.
k4a_calibration_t sensor_calibration;
if (K4A_RESULT_SUCCEEDED != k4a_device_get_calibration(device, device_config.depth_mode, K4A_COLOR_RESOLUTION_OFF, &sensor_calibration))
{
printf("Get depth camera calibration failed!\n");
return 0;
}
k4abt_tracker_t tracker = NULL;
k4abt_tracker_configuration_t tracker_config = K4ABT_TRACKER_CONFIG_DEFAULT;
if (K4A_RESULT_SUCCEEDED != k4abt_tracker_create(&sensor_calibration, tracker_config, &tracker))
{
printf("Body tracker initialization failed!\n");
return 0;
}
Capturer des images de profondeur et IR
La capture d’images à l’aide d’Azure Kinect DK est traitée dans la page Récupérer les images.
Notes
Les modes K4A_DEPTH_MODE_NFOV_UNBINNED
ou K4A_DEPTH_MODE_WFOV_2X2BINNED
sont recommandés pour bénéficier de performances et d’une précision optimales. N’utilisez pas les modes K4A_DEPTH_MODE_OFF
ou K4A_DEPTH_MODE_PASSIVE_IR
.
Les modes d’Azure Kinect DK pris en charge sont décrits dans les spécifications matérielles d’Azure Kinect DK et les énumérations k4a_depth_mode_t.
// Capture a depth frame
switch (k4a_device_get_capture(device, &capture, TIMEOUT_IN_MS))
{
case K4A_WAIT_RESULT_SUCCEEDED:
break;
case K4A_WAIT_RESULT_TIMEOUT:
printf("Timed out waiting for a capture\n");
continue;
break;
case K4A_WAIT_RESULT_FAILED:
printf("Failed to read a capture\n");
goto Exit;
}
Empiler la capture et dépiler les résultats
Le dispositif de suivi gère en interne une file d’attente d’entrée et une file d’attente de sortie pour traiter de manière asynchrone et plus efficace les captures d’Azure Kinect DK. Utilisez la fonction k4abt_tracker_enqueue_capture() pour ajouter une nouvelle capture à la file d’attente d’entrée. Utilisez la fonction k4abt_tracker_pop_result() pour afficher un résultat de la file d’attente de sortie. L’utilisation de la valeur de délai d’attente dépend de l’application et contrôle la valeur de délai d’attente de la file d’attente.
Traitement sans attente
Utilisez ce modèle pour les applications monothread qui ont besoin de résultats immédiats et peuvent prendre en charge les trames supprimées (par exemple l’affichage de vidéos en direct à partir d’un appareil). L’exemple simple_3d_viewer
situé dans GitHub Azure-Kinect-Samples constitue un exemple de traitement sans attente.
k4a_wait_result_t queue_capture_result = k4abt_tracker_enqueue_capture(tracker, sensor_capture, 0);
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, 0);
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
}
Traitement avec attente
Utilisez ce modèle pour les applications qui n’ont pas besoin de résultats pour chaque trame (par exemple le traitement d’une vidéo à partir d’un fichier). L’exemple simple_sample.exe
situé dans GitHub Azure-Kinect-Samples constitue un exemple de traitement avec attente.
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_SUCCEEDED)
{
// It should never hit timeout or error when K4A_WAIT_INFINITE is set.
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)
{
// It should never hit timeout or error when K4A_WAIT_INFINITE is set.
printf("Error! Popping body tracking result failed!\n");
break;
}
// 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