Quickstart: Een Azure Kinect-toepassing voor het volgen van lichamen bouwen
Gaat u aan de slag met de Body Tracking-SDK? In deze quickstart leert u hoe het volgen van lichamen werkt. Meer voorbeelden vindt u in de opslagplaats Azure-Kinect-Sample.
Vereisten
- Azure Kinect DK installeren
- De Body Tracking-SDK instellen
- De quickstart Uw eerste Azure Kinect-toepassing bouwen doornemen.
- Vertrouwd raken met de volgende Sensor SDK-functies:
- Raadpleeg de documentatie over de volgende functies van de Body Tracking SDK:
Kopteksten
Bij het volgen van lichamen wordt één header gebruikt: k4abt.h
. Gebruik deze header naast k4a.h
. Zorg ervoor dat de gewenste compiler is ingesteld voor de mappen lib
en include
van de Sensor- en de Body Tracking-SDK. U moet ook een koppeling maken naar de bestanden k4a.lib
en k4abt.lib
. Voor het uitvoeren van de toepassing zijn k4a.dll
, k4abt.dll
, onnxruntime.dll
en dnn_model.onnx
nodig in het uitvoerpad van de toepassing.
#include <k4a/k4a.h>
#include <k4abt.h>
Het apparaat openen en de camera starten
In uw eerste toepassing voor het volgen van lichamen wordt ervan uitgegaan dat er één Azure Kinect-apparaat is verbonden met de pc.
Bij het volgen van lichamen wordt gebruikgemaakt van de Sensor-SDK. Als u lichamen wilt volgen, moet u eerst het apparaat openen en configureren. Gebruik de functie k4a_device_open() om het apparaat te openen. Configureer het vervolgens met het object k4a_device_configuration_t. Voor de beste resultaten stelt u de dieptemodus in op K4A_DEPTH_MODE_NFOV_UNBINNED
of K4A_DEPTH_MODE_WFOV_2X2BINNED
. De bodytracker wordt niet uitgevoerd als de dieptemodus is ingesteld op K4A_DEPTH_MODE_OFF
of K4A_DEPTH_MODE_PASSIVE_IR
.
U vindt meer informatie over het zoeken en openen van het apparaat op deze pagina.
U vindt meer informatie over de Azure Kinect-dieptemodi op deze pagina's: hardwarespecificaties en k4a_depth_mode_t-opsommingen.
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);
De tracker maken
Als u lichamen wilt volgen, moet u om te beginnen een lichaamstracker maken. De structuur k4a_calibration_t is nodig voor sensorkalibratie. De kalibratie van de sensor kan worden opgevraagd met behulp van de functie 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);
Opnamen ophalen van het Azure Kinect-apparaat
U kunt meer informatie over het ophalen van beeldgegevens vinden op deze pagina.
// Capture a depth frame
k4a_capture_t sensor_capture;
k4a_device_get_capture(device, &sensor_capture, TIMEOUT_IN_MS);
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. De volgende stap is het gebruik van 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 op te roepen uit de uitvoerwachtrij. De time-outwaarde is afhankelijk van de toepassing en bepaalt de wachttijd voor de wachtrij.
In uw eerste toepassing voor het volgen van lichamen wordt gebruikgemaakt van het patroon voor realtimeverwerking. Raadpleeg Resultaten voor het volgen van een lichaam ophalen voor een gedetailleerde uitleg van de andere patronen.
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
}
De gegevens over het volgen van lichamen bekijken
De resultaten van het volgen van lichamen worden voor elke sensor opgeslagen in een lichaamskader (k4abt_frame_t-structuur). Elk lichaamskader bevat drie belangrijke onderdelen: een verzameling van lichaamsstructuren, een lichaamsindex in 2D en de vastgelegde invoer.
Uw eerste toepassing voor het volgen van lichamen heeft alleen toegang tot het aantal gedetecteerde lichamen. Raadpleeg Gegevens in kader openen voor een gedetailleerde uitleg bij de gegevens in een lichaamskader.
size_t num_bodies = k4abt_frame_get_num_bodies(body_frame);
printf("%zu bodies are detected!\n", num_bodies);
Opschonen
De laatste stap bestaat uit het afsluiten van de lichaamstracker en het vrijgeven van het object voor lichaamstracering. U moet ook het apparaat stoppen en sluiten.
k4abt_tracker_shutdown(tracker);
k4abt_tracker_destroy(tracker);
k4a_device_stop_cameras(device);
k4a_device_close(device);
Volledige bron
#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;
}