Resultaten van het volgen van een lichaam ophalen
Body Tracking SDK maakt gebruik van een bodytrackerobject voor het verwerken van Azure Kinect DK-opnamen en genereert resultaten voor het bijhouden van lichamen. Het onderhoudt ook de globale status van de tracker, de verwerking van wachtrijen en de uitvoerwachtrij. Er zijn drie stappen in het gebruik van de body tracker:
- Een tracker maken
- Diepte- en IR-installatiekopieën vastleggen met Behulp van Azure Kinect DK
- De opname in de wachtrij opnemen en de resultaten weergeven.
Een tracker maken
De eerste stap bij het gebruik van lichaamstracering is het maken van een tracker en vereist het doorgeven van de sensorkalibratie k4a_calibration_t structuur. De sensorkalibratie kan worden opgevraagd met behulp van de azure Kinect Sensor SDK-functie k4a_device_get_calibration().
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;
}
Diepte- en IR-installatiekopieën vastleggen
Afbeeldingsopname met behulp van Azure Kinect DK wordt behandeld op de pagina afbeeldingen ophalen.
Notitie
K4A_DEPTH_MODE_NFOV_UNBINNED
of K4A_DEPTH_MODE_WFOV_2X2BINNED
modi worden aanbevolen voor de beste prestaties en nauwkeurigheid. Gebruik de K4A_DEPTH_MODE_OFF
of K4A_DEPTH_MODE_PASSIVE_IR
modi niet.
De ondersteunde Azure Kinect DK-modi worden beschreven in de hardwarespecificatie van Azure Kinect DK en k4a_depth_mode_t opsommingen.
// 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;
}
De opname in de wachtrij plaatsen en de resultaten oproepen
De tracker beheert intern een invoerwachtrij en een uitvoerwachtrij om de Azure Kinect DK-opnamen efficiënter asynchroon te verwerken. Gebruik de functie k4abt_tracker_enqueue_capture() om een nieuwe opname toe te voegen aan de invoerwachtrij. Gebruik de functie k4abt_tracker_pop_result() om een resultaat uit de uitvoerwachtrij weer te geven. Het gebruik van de time-outwaarde is afhankelijk van de toepassing en bepaalt de wachtrijwachttijd.
Geen wachtverwerking
Gebruik dit patroon voor toepassingen met één thread die onmiddellijke resultaten nodig hebben en geschikt zijn voor verwijderde frames (bijvoorbeeld livevideo van een apparaat bekijken). Het simple_3d_viewer
voorbeeld in GitHub Azure-Kinect-Samples is een voorbeeld van geen wachtverwerking.
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
}
Wachten op verwerking
Gebruik dit patroon voor toepassingen die geen resultaten nodig hebben voor elke frames (bijvoorbeeld het verwerken van een video uit een bestand). Het simple_sample.exe
voorbeeld in GitHub Azure-Kinect-Samples is een voorbeeld van wachtende verwerking.
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