Извлечение данных изображения Azure Kinect
На этой странице приводятся сведения о том, как получать изображения из Kinect Azure. В статье представлено, как захватывать кадры и получать доступ к изображениям, скоординированным по цвету и глубине на устройстве. Чтобы получить доступ к изображениям, необходимо сначала открыть и настроить устройство, только после этого вы сможете захватывать изображения. Перед настройкой и записью образа необходимо Найти и открыть устройство.
Можно также обратиться к Примеру SDK Enumerate, в котором показано, как использовать функции, описанные в этой статье.
Рассматриваются следующие функции:
k4a_device_start_cameras()
k4a_device_get_capture()
k4a_capture_get_depth_image()
k4a_image_get_buffer()
k4a_image_release()
k4a_capture_release()
k4a_device_stop_cameras()
Настройка и запуск устройства
Две камеры, имеющиеся на устройстве Kinect, поддерживают несколько режимов, разрешений и выходных форматов. Полный список см. в разделе Спецификации оборудования для набора Azure Kinect Development Kit.
Конфигурация потоковой передачи задается с помощью значений в структуре k4a_device_configuration_t
.
k4a_device_configuration_t config = K4A_DEVICE_CONFIG_INIT_DISABLE_ALL;
config.camera_fps = K4A_FRAMES_PER_SECOND_30;
config.color_format = K4A_IMAGE_FORMAT_COLOR_MJPG;
config.color_resolution = K4A_COLOR_RESOLUTION_2160P;
config.depth_mode = K4A_DEPTH_MODE_NFOV_UNBINNED;
if (K4A_RESULT_SUCCEEDED != k4a_device_start_cameras(device, &config))
{
printf("Failed to start device\n");
goto Exit;
}
После запуска камер они будут продолжать захватывать данные, пока не будет вызван k4a_device_stop_cameras()
или пока устройство не будет закрыто.
Стабилизация
При запуске устройств с помощью функции синхронизации нескольких устройств настоятельно рекомендуется пользоваться настройкой фиксированной экспозиции. При проведении ручной настройки экспозиции может потребоваться до восьми захватов кадра с устройства, прежде чем картинка и частота кадров стабилизируются. При автоматической экспозиции может потребоваться до 20 захватов, прежде чем картинка и частота кадров стабилизируются.
Получение захваченного кадра на устройстве
Кадры изображения захватываются на устройстве согласованным образом. Каждый захваченный кадр содержит представление глубины, инфракрасное и цветовое представление или сочетание этих представлений.
По умолчанию API возвращает только тот захваченный кадр, который получил все представления, запрошенные в режиме потоковой передачи. Вы можете настроить API так, чтобы он возвращал частичные захваты — только с глубиной или цветом, как только они станут доступны, очистив параметр synchronized_images_only
в k4a_device_configuration_t
.
// Capture a depth frame
k4a_capture_t capture = NULL;
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;
}
После того как API успешно вернул запись, необходимо вызвать k4a_capture_release()
, когда вы завершите работу с объектом захвата.
Получить изображение из захваченного кадра
Чтобы получить захваченную картинку, вызовите соответствующую функцию для каждого типа представления. Одно из двух значений:
Необходимо вызвать k4a_image_release()
для любого дескриптора k4a_image_t
, возвращаемого этими функциями, после завершения работы с изображением.
Доступ к буферам изображений
k4a_image_t
имеет множество функций доступа для получения свойств изображения.
Чтобы получить доступ к буферу памяти изображения, используйте k4a_image_get_buffer.
В следующем примере представлено, как получить доступ к захваченному представлению глубины. Этот же принцип применяется к другим типам представлений. Однако убедитесь, что переменная типа представления заменена правильно, например инфракрасное или цветное.
// Access the depth16 image
k4a_image_t image = k4a_capture_get_depth_image(capture);
if (image != NULL)
{
printf(" | Depth16 res:%4dx%4d stride:%5d\n",
k4a_image_get_height_pixels(image),
k4a_image_get_width_pixels(image),
k4a_image_get_stride_bytes(image));
// Release the image
k4a_image_release(image);
}
// Release the capture
k4a_capture_release(capture);
Дальнейшие действия
Теперь вы узнали, как захватывать кадры и получать доступ к изображениям, скоординированным по цвету и глубине на устройстве Azure Kinect. Вы также можете ознакомиться: