kinect/codes/Azure-Kinect-Sensor-SDK/include/k4a/k4a.h

2279 lines
85 KiB
C

/** \file k4a.h
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
* Kinect For Azure SDK.
*/
#ifndef K4A_H
#define K4A_H
#ifdef __cplusplus
#include <cinttypes>
#else
#include <inttypes.h>
#endif
#include <k4a/k4aversion.h>
#include <k4a/k4atypes.h>
#include <k4a/k4a_export.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* \defgroup Functions Functions
* \ingroup csdk
*
* Public functions of the API
*
* @{
*/
/** Gets the number of connected devices
*
* \returns Number of sensors connected to the PC.
*
* \relates k4a_device_t
*
* \remarks
* This API counts the number of Azure Kinect devices connected to the host PC.
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT uint32_t k4a_device_get_installed_count(void);
/** Sets and clears the callback function to receive debug messages from the Azure Kinect device.
*
* \param message_cb
* The callback function to receive messages from. Set to NULL to unregister the callback function.
*
* \param message_cb_context
* The callback functions context.
*
* \param min_level
* The least critical error the user wants to be notified about.
*
* \return ::K4A_RESULT_SUCCEEDED if the callback function was set or cleared successfully. ::K4A_RESULT_FAILED if an
* error is encountered or the callback function has already been set.
*
* \remarks
* Call this function to set or clear the callback function that is used to deliver debug messages to the caller. This
* callback may be called concurrently, it is up to the implementation of the callback function to ensure the
* parallelization is handled.
*
* \remarks
* Clearing the callback function will block until all pending calls to the callback function have completed.
*
* \remarks
* To update \p min_level, \p k4a_set_debug_message_handler can be called with the same value \p message_cb and by
* specifying a new \p min_level.
*
* \remarks
* Logging provided via this API is independent of the logging controlled by the environmental variable controls \p
* K4A_ENABLE_LOG_TO_STDOUT, \p K4A_ENABLE_LOG_TO_A_FILE, and \p K4A_LOG_LEVEL. However there is a slight change in
* default behavior when using this function. By default, when \p k4a_set_debug_message_handler() has not been used to
* register a message callback, the default for environmental variable controls is to send debug messages as if
* K4A_ENABLE_LOG_TO_STDOUT=1 were set. If \p k4a_set_debug_message_handler registers a callback function before
* k4a_device_open() is called, then the default for environmental controls is as if K4A_ENABLE_LOG_TO_STDOUT=0 was
* specified. Physically specifying the environmental control will override the default.
*
* \p min_level
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_set_debug_message_handler(k4a_logging_message_cb_t *message_cb,
void *message_cb_context,
k4a_log_level_t min_level);
/** Sets the callback functions for the SDK allocator
*
* \param allocate
* The callback function to allocate memory. When the SDK requires memory allocation this callback will be
* called and the application can provide a buffer and a context.
*
* \param free
* The callback function to free memory. The SDK will call this function when memory allocated by \p allocate
* is no longer needed.
*
* \return ::K4A_RESULT_SUCCEEDED if the callback function was set or cleared successfully. ::K4A_RESULT_FAILED if an
* error is encountered or the callback function has already been set.
*
* \remarks
* Call this function to hook memory allocation by the SDK. Calling with both \p allocate and \p free as NULL will
* clear the hook and reset to the default allocator.
*
* \remarks
* If this function is called after memory has been allocated, the previous version of \p free function may still be
* called in the future. The SDK will always call the \p free function that was set at the time that the memory
* was allocated.
*
* \remarks
* Not all memory allocation by the SDK is performed by this allocate function. Small allocations or allocations
* from special pools may come from other sources.
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_set_allocator(k4a_memory_allocate_cb_t allocate, k4a_memory_destroy_cb_t free);
/** Open an Azure Kinect device.
*
* \param index
* The index of the device to open, starting with 0. Optionally pass in #K4A_DEVICE_DEFAULT.
*
* \param device_handle
* Output parameter which on success will return a handle to the device.
*
* \relates k4a_device_t
*
* \return ::K4A_RESULT_SUCCEEDED if the device was opened successfully.
*
* \remarks
* If successful, k4a_device_open() will return a device handle in the device_handle parameter.
* This handle grants exclusive access to the device and may be used in the other Azure Kinect API calls.
*
* \remarks
* When done with the device, close the handle with k4a_device_close()
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_device_open(uint32_t index, k4a_device_t *device_handle);
/** Closes an Azure Kinect device.
*
* \param device_handle
* Handle obtained by k4a_device_open().
*
* \relates k4a_device_t
*
* \remarks Once closed, the handle is no longer valid.
*
* \remarks Before closing the handle to the device, ensure that all \ref k4a_capture_t captures have been released with
* k4a_capture_release().
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT void k4a_device_close(k4a_device_t device_handle);
/** Reads a sensor capture.
*
* \param device_handle
* Handle obtained by k4a_device_open().
*
* \param capture_handle
* If successful this contains a handle to a capture object. Caller must call k4a_capture_release() when its done using
* this capture.
*
* \param timeout_in_ms
* Specifies the time in milliseconds the function should block waiting for the capture. If set to 0, the function will
* return without blocking. Passing a value of #K4A_WAIT_INFINITE will block indefinitely until data is available, the
* device is disconnected, or another error occurs.
*
* \returns
* ::K4A_WAIT_RESULT_SUCCEEDED if a capture is returned. If a capture is not available before the timeout elapses, the
* function will return ::K4A_WAIT_RESULT_TIMEOUT. All other failures will return ::K4A_WAIT_RESULT_FAILED.
*
* \relates k4a_device_t
*
* \remarks
* Gets the next capture in the streamed sequence of captures from the camera. If a new capture is not currently
* available, this function will block until the timeout is reached. The SDK will buffer at least two captures worth
* of data before dropping the oldest capture. Callers needing to capture all data need to ensure they read the data as
* fast as the data is being produced on average.
*
* \remarks
* Upon successfully reading a capture this function will return success and populate \p capture.
* If a capture is not available in the configured \p timeout_in_ms, then the API will return ::K4A_WAIT_RESULT_TIMEOUT.
*
* \remarks
* If the call is successful and a capture is returned, callers must call k4a_capture_release() to return the allocated
* memory.
*
* \remarks
* This function needs to be called while the device is in a running state;
* after k4a_device_start_cameras() is called and before k4a_device_stop_cameras() is called.
*
* \remarks
* This function returns an error when an internal problem is encountered; such as loss of the USB connection, inability
* to allocate enough memory, and other unexpected issues. Any error returned by this function signals the end of
* streaming data, and caller should stop the stream using k4a_device_stop_cameras().
*
* \remarks
* If this function is waiting for data (non-zero timeout) when k4a_device_stop_cameras() or k4a_device_close() is
* called on another thread, this function will return an error.
*
* \returns ::K4A_WAIT_RESULT_SUCCEEDED if a capture is returned. If a capture is not available before the timeout
* elapses, the function will return ::K4A_WAIT_RESULT_TIMEOUT. All other failures will return ::K4A_WAIT_RESULT_FAILED.
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*
*/
K4A_EXPORT k4a_wait_result_t k4a_device_get_capture(k4a_device_t device_handle,
k4a_capture_t *capture_handle,
int32_t timeout_in_ms);
/** Reads an IMU sample.
*
* \param device_handle
* Handle obtained by k4a_device_open().
*
* \param imu_sample
* Pointer to the location for the API to write the IMU sample.
*
* \param timeout_in_ms
* Specifies the time in milliseconds the function should block waiting for the sample. If set to 0, the function will
* return without blocking. Passing a value of #K4A_WAIT_INFINITE will block indefinitely until data is available, the
* device is disconnected, or another error occurs.
*
* \returns
* ::K4A_WAIT_RESULT_SUCCEEDED if a sample is returned. If a sample is not available before the timeout elapses, the
* function will return ::K4A_WAIT_RESULT_TIMEOUT. All other failures will return ::K4A_WAIT_RESULT_FAILED.
*
* \relates k4a_device_t
*
* \remarks
* Gets the next sample in the streamed sequence of IMU samples from the device. If a new sample is not currently
* available, this function will block until the timeout is reached. The API will buffer at least two camera capture
* intervals worth of samples before dropping the oldest sample. Callers needing to capture all data need to ensure they
* read the data as fast as the data is being produced on average.
*
* \remarks
* Upon successfully reading a sample this function will return success and populate \p imu_sample.
* If a sample is not available in the configured \p timeout_in_ms, then the API will return ::K4A_WAIT_RESULT_TIMEOUT.
*
* \remarks
* This function needs to be called while the device is in a running state;
* after k4a_device_start_imu() is called and before k4a_device_stop_imu() is called.
*
* \remarks
* This function returns an error when an internal problem is encountered; such as loss of the USB connection, inability
* to allocate enough memory, and other unexpected issues. Any error returned by this function signals the end of
* streaming data, and caller should stop the stream using k4a_device_stop_imu().
*
* \remarks
* If this function is waiting for data (non-zero timeout) when k4a_device_stop_imu() or k4a_device_close() is
* called on another thread, this function will return an error.
*
* \remarks
* The memory the IMU sample is written to is allocated and owned by the caller, so there is no need to call an Azure
* Kinect API to free or release the sample.
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_wait_result_t k4a_device_get_imu_sample(k4a_device_t device_handle,
k4a_imu_sample_t *imu_sample,
int32_t timeout_in_ms);
/** Create an empty capture object.
*
* \param capture_handle
* Pointer to a location to store the handle.
*
* \relates k4a_capture_t
*
* \remarks
* Call this function to create a \ref k4a_capture_t handle for a new capture. Release it with k4a_capture_release().
*
* The new capture is created with a reference count of 1.
*
* \returns
* Returns #K4A_RESULT_SUCCEEDED on success. Errors are indicated with #K4A_RESULT_FAILED and error specific data can be
* found in the log.
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_capture_create(k4a_capture_t *capture_handle);
/** Release a capture.
*
* \param capture_handle
* Capture to release.
*
* \relates k4a_capture_t
*
* \remarks
* Call this function when finished using the capture.
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT void k4a_capture_release(k4a_capture_t capture_handle);
/** Add a reference to a capture.
*
* \param capture_handle
* Capture to add a reference to.
*
* \relates k4a_capture_t
*
* \remarks
* Call this function to add an additional reference to a capture. This reference must be removed with
* k4a_capture_release().
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT void k4a_capture_reference(k4a_capture_t capture_handle);
/** Get the color image associated with the given capture.
*
* \param capture_handle
* Capture handle containing the image.
*
* \relates k4a_capture_t
*
* \remarks
* Call this function to access the color image part of this capture. Release the \ref k4a_image_t with
* k4a_image_release();
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_image_t k4a_capture_get_color_image(k4a_capture_t capture_handle);
/** Get the depth image associated with the given capture.
*
* \param capture_handle
* Capture handle containing the image.
*
* \relates k4a_capture_t
*
* \remarks
* Call this function to access the depth image part of this capture. Release the \ref k4a_image_t with
* k4a_image_release();
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_image_t k4a_capture_get_depth_image(k4a_capture_t capture_handle);
/** Get the IR image associated with the given capture.
*
* \param capture_handle
* Capture handle containing the image.
*
* \relates k4a_capture_t
*
* \remarks
* Call this function to access the IR image part of this capture. Release the \ref k4a_image_t with
* k4a_image_release();
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_image_t k4a_capture_get_ir_image(k4a_capture_t capture_handle);
/** Set or add a color image to the associated capture.
*
* \param capture_handle
* Capture handle to hold the image.
*
* \param image_handle
* Image handle containing the image.
*
* \relates k4a_capture_t
*
* \remarks
* When a \ref k4a_image_t is added to a \ref k4a_capture_t, the \ref k4a_capture_t will automatically add a reference
* to the \ref k4a_image_t.
*
* \remarks
* If there is already a color image contained in the capture, the existing image will be dereferenced and replaced with
* the new image.
*
* \remarks
* To remove a color image to the capture without adding a new image, this function can be called with a NULL
* image_handle.
*
* \remarks
* Any \ref k4a_image_t contained in this \ref k4a_capture_t will automatically be dereferenced when all references to
* the \ref k4a_capture_t are released with k4a_capture_release().
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT void k4a_capture_set_color_image(k4a_capture_t capture_handle, k4a_image_t image_handle);
/** Set or add a depth image to the associated capture.
*
* \param capture_handle
* Capture handle to hold the image.
*
* \param image_handle
* Image handle containing the image.
*
* \relates k4a_capture_t
*
* \remarks
* When a \ref k4a_image_t is added to a \ref k4a_capture_t, the \ref k4a_capture_t will automatically add a reference
* to the \ref k4a_image_t.
*
* \remarks
* If there is already an image depth image contained in the capture, the existing image will be dereferenced and
* replaced with the new image.
*
* \remarks
* To remove a depth image to the capture without adding a new image, this function can be called with a NULL
* image_handle.
*
* \remarks
* Any \ref k4a_image_t contained in this \ref k4a_capture_t will automatically be dereferenced when all references to
* the \ref k4a_capture_t are released with k4a_capture_release().
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT void k4a_capture_set_depth_image(k4a_capture_t capture_handle, k4a_image_t image_handle);
/** Set or add an IR image to the associated capture.
*
* \param capture_handle
* Capture handle to hold the image.
*
* \param image_handle
* Image handle containing the image.
*
* \relates k4a_capture_t
*
* \remarks
* When a \ref k4a_image_t is added to a \ref k4a_capture_t, the \ref k4a_capture_t will automatically add a reference
* to the \ref k4a_image_t.
*
* \remarks
* If there is already an IR image contained in the capture, the existing image will be dereferenced and replaced with
* the new image.
*
* \remarks
* To remove a IR image to the capture without adding a new image, this function can be called with a NULL image_handle.
*
* \remarks
* Any \ref k4a_image_t contained in this \ref k4a_capture_t will automatically be dereferenced when all references to
* the \ref k4a_capture_t are released with k4a_capture_release().
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT void k4a_capture_set_ir_image(k4a_capture_t capture_handle, k4a_image_t image_handle);
/** Set the temperature associated with the capture.
*
* \param capture_handle
* Capture handle to set the temperature on.
*
* \param temperature_c
* Temperature in Celsius to store.
*
* \relates k4a_capture_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT void k4a_capture_set_temperature_c(k4a_capture_t capture_handle, float temperature_c);
/** Get the temperature associated with the capture.
*
* \param capture_handle
* Capture handle to retrieve the temperature from.
*
* \return
* This function returns the temperature of the device at the time of the capture in Celsius. If
* the temperature is unavailable, the function will return NAN.
*
* \relates k4a_capture_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT float k4a_capture_get_temperature_c(k4a_capture_t capture_handle);
/** Create an image.
*
* \param format
* The format of the image that will be stored in this image container.
*
* \param width_pixels
* Width in pixels.
*
* \param height_pixels
* Height in pixels.
*
* \param stride_bytes
* The number of bytes per horizontal line of the image.
* If set to 0, the stride will be set to the minimum size given the \p format and \p width_pixels.
*
* \param image_handle
* Pointer to store image handle in.
*
* \remarks
* This function is used to create images of formats that have consistent stride. The function is not suitable for
* compressed formats that may not be represented by the same number of bytes per line.
*
* \remarks
* For most image formats, the function will allocate an image buffer of size \p height_pixels * \p stride_bytes.
* Buffers #K4A_IMAGE_FORMAT_COLOR_NV12 format will allocate an additional \p height_pixels / 2 set of lines (each of \p
* stride_bytes). This function cannot be used to allocate #K4A_IMAGE_FORMAT_COLOR_MJPG buffers.
*
* \remarks
* To create an image object without the API allocating memory, or to represent an image that has a non-deterministic
* stride, use k4a_image_create_from_buffer().
*
* \remarks
* The \ref k4a_image_t is created with a reference count of 1.
*
* \remarks
* When finished using the created image, release it with k4a_image_release.
*
* \returns
* Returns #K4A_RESULT_SUCCEEDED on success. Errors are indicated with #K4A_RESULT_FAILED.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_image_create(k4a_image_format_t format,
int width_pixels,
int height_pixels,
int stride_bytes,
k4a_image_t *image_handle);
/** Create an image from a pre-allocated buffer.
*
* \param format
* The format of the image that will be stored in this image container.
*
* \param width_pixels
* Width in pixels.
*
* \param height_pixels
* Height in pixels.
*
* \param stride_bytes
* The number of bytes per horizontal line of the image.
*
* \param buffer
* Pointer to a pre-allocated image buffer.
*
* \param buffer_size
* Size in bytes of the pre-allocated image buffer.
*
* \param buffer_release_cb
* Callback to the buffer free function, called when all references to the buffer have been released. This parameter is
* optional.
*
* \param buffer_release_cb_context
* Context for the buffer free function. This value will be called as a parameter to \p buffer_release_cb when
* the callback is invoked.
*
* \param image_handle
* Pointer to store image handle in.
*
* \remarks
* This function creates a \ref k4a_image_t from a pre-allocated buffer. When all references to this object reach zero
* the provided \p buffer_release_cb callback function is called so that the memory can be released. If this function
* fails, the API will not use the memory provided in \p buffer, and the API will not call \p buffer_release_cb.
*
* \remarks
* The \ref k4a_image_t is created with a reference count of 1.
*
* \remarks
* Release the reference on this function with k4a_image_release().
*
* \returns
* Returns #K4A_RESULT_SUCCEEDED on success. Errors are indicated with #K4A_RESULT_FAILED and error specific data can be
* found in the log.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_image_create_from_buffer(k4a_image_format_t format,
int width_pixels,
int height_pixels,
int stride_bytes,
uint8_t *buffer,
size_t buffer_size,
k4a_memory_destroy_cb_t *buffer_release_cb,
void *buffer_release_cb_context,
k4a_image_t *image_handle);
/** Get the image buffer.
*
* \param image_handle
* Handle of the image for which the get operation is performed on.
*
* \remarks
* Use this buffer to access the raw image data.
*
* \returns
* The function will return NULL if there is an error, and will normally return a pointer to the image buffer.
* Since all \ref k4a_image_t instances are created with an image buffer, this function should only return NULL if the
* \p image_handle is invalid.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT uint8_t *k4a_image_get_buffer(k4a_image_t image_handle);
/** Get the image buffer size.
*
* \param image_handle
* Handle of the image for which the get operation is performed on.
*
* \remarks
* Use this function to know what the size of the image buffer is returned by k4a_image_get_buffer().
*
* \returns
* The function will return 0 if there is an error, and will normally return the image size.
* Since all \ref k4a_image_t instances are created with an image buffer, this function should only return 0 if the
* \p image_handle is invalid.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT size_t k4a_image_get_size(k4a_image_t image_handle);
/** Get the format of the image.
*
* \param image_handle
* Handle of the image for which the get operation is performed on.
*
* \remarks
* Use this function to determine the format of the image buffer.
*
* \returns
* This function is not expected to fail, all \ref k4a_image_t's are created with a known format. If the
* \p image_handle is invalid, the function will return ::K4A_IMAGE_FORMAT_CUSTOM.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_image_format_t k4a_image_get_format(k4a_image_t image_handle);
/** Get the image width in pixels.
*
* \param image_handle
* Handle of the image for which the get operation is performed on.
*
* \returns
* This function is not expected to fail, all \ref k4a_image_t's are created with a known width. If the \p
* image_handle is invalid, the function will return 0.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT int k4a_image_get_width_pixels(k4a_image_t image_handle);
/** Get the image height in pixels.
*
* \param image_handle
* Handle of the image for which the get operation is performed on.
*
* \returns
* This function is not expected to fail, all \ref k4a_image_t's are created with a known height. If the \p
* image_handle is invalid, the function will return 0.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT int k4a_image_get_height_pixels(k4a_image_t image_handle);
/** Get the image stride in bytes.
*
* \param image_handle
* Handle of the image for which the get operation is performed on.
*
* \returns
* This function is not expected to fail, all \ref k4a_image_t's are created with a known stride. If the
* \p image_handle is invalid, or the image's format does not have a stride, the function will return 0.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT int k4a_image_get_stride_bytes(k4a_image_t image_handle);
/** Get the image's device timestamp in microseconds.
*
* \param image_handle
* Handle of the image for which the get operation is performed on.
*
* \remarks
* Returns the device timestamp of the image. Timestamps are recorded by the device and represent the mid-point of
* exposure. They may be used for relative comparison, but their absolute value has no defined meaning.
*
* \returns
* If the \p image_handle is invalid or if no timestamp was set for the image,
* this function will return 0. It is also possible for 0 to be a valid timestamp originating from the beginning
* of a recording or the start of streaming.
*
* \deprecated
* Deprecated starting in 1.2.0. Please use k4a_image_get_device_timestamp_usec().
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_DEPRECATED_EXPORT uint64_t k4a_image_get_timestamp_usec(k4a_image_t image_handle);
/** Get the image's device timestamp in microseconds.
*
* \param image_handle
* Handle of the image for which the get operation is performed on.
*
* \remarks
* Returns the device timestamp of the image, as captured by the hardware. Timestamps are recorded by the device and
* represent the mid-point of exposure. They may be used for relative comparison, but their absolute value has no
* defined meaning.
*
* \returns
* If the \p image_handle is invalid or if no timestamp was set for the image, this function will return 0. It is also
* possible for 0 to be a valid timestamp originating from the beginning of a recording or the start of streaming.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT uint64_t k4a_image_get_device_timestamp_usec(k4a_image_t image_handle);
/** Get the image's system timestamp in nanoseconds.
*
* \param image_handle
* Handle of the image for which the get operation is performed on.
*
* \remarks
* Returns the system timestamp of the image. Timestamps are recorded by the host. They may be used for relative
* comparision, as they are relative to the corresponding system clock. The absolute value is a monotonic count from
* an arbitrary point in the past.
*
* \remarks
* The system timestamp is captured at the moment host PC finishes receiving the image.
*
* \remarks
* On Linux the system timestamp is read from clock_gettime(CLOCK_MONOTONIC), which measures realtime and is not
* impacted by adjustments to the system clock. It starts from an arbitrary point in the past. On Windows the system
* timestamp is read from QueryPerformanceCounter(), it also measures realtime and is not impacted by adjustments to the
* system clock. It also starts from an arbitrary point in the past.
*
* \returns
* If the \p image_handle is invalid or if no timestamp was set for the image, this function will return 0. It is also
* possible for 0 to be a valid timestamp originating from the beginning of a recording or the start of streaming.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT uint64_t k4a_image_get_system_timestamp_nsec(k4a_image_t image_handle);
/** Get the image exposure in microseconds.
*
* \param image_handle
* Handle of the image for which the get operation is performed on.
*
* \remarks
* Returns an exposure time in microseconds. This is only supported on color image formats.
*
* \returns
* If the \p image_handle is invalid, or no exposure was set on the image, the function will return 0. Otherwise,
* it will return the image exposure time in microseconds.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT uint64_t k4a_image_get_exposure_usec(k4a_image_t image_handle);
/** Get the image white balance.
*
* \param image_handle
* Handle of the image for which the get operation is performed on.
*
* \remarks
* Returns the image's white balance. This function is only valid for color captures, and not for depth or IR captures.
*
* \returns
* Returns the image white balance in Kelvin. If \p image_handle is invalid, or the white balance was not set or
* not applicable to the image, the function will return 0.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT uint32_t k4a_image_get_white_balance(k4a_image_t image_handle);
/** Get the image ISO speed.
*
* \param image_handle
* Handle of the image for which the get operation is performed on.
*
* \remarks
* This function is only valid for color captures, and not for depth or IR captures.
*
* \returns
* Returns the ISO speed of the image. 0 indicates the ISO speed was not available or an error occurred.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT uint32_t k4a_image_get_iso_speed(k4a_image_t image_handle);
/** Set the device time stamp, in microseconds, of the image.
*
* \param image_handle
* Handle of the image to set the timestamp on.
*
* \param timestamp_usec
* Device timestamp of the image in microseconds.
*
* \remarks
* Use this function in conjunction with k4a_image_create() or k4a_image_create_from_buffer() to construct a
* \ref k4a_image_t.
*
* \remarks
* The device timestamp represents the mid-point of exposure of the image, as captured by the hardware.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT void k4a_image_set_device_timestamp_usec(k4a_image_t image_handle, uint64_t timestamp_usec);
/** Set the device time stamp, in microseconds, of the image.
*
* \param image_handle
* Handle of the image to set the timestamp on.
*
* \param timestamp_usec
* Device timestamp of the image in microseconds.
*
* \remarks
* Use this function in conjunction with k4a_image_create() or k4a_image_create_from_buffer() to construct a
* \ref k4a_image_t.
*
* \remarks
* The device timestamp represents the mid-point of exposure of the image, as captured by the hardware.
*
* \relates k4a_image_t
*
* \deprecated
* Deprecated starting in 1.2.0. Please use k4a_image_set_device_timestamp_usec().
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_DEPRECATED_EXPORT void k4a_image_set_timestamp_usec(k4a_image_t image_handle, uint64_t timestamp_usec);
/** Set the system time stamp, in nanoseconds, of the image.
*
* \param image_handle
* Handle of the image to set the timestamp on.
*
* \param timestamp_nsec
* Timestamp of the image in nanoseconds.
*
* \remarks
* Use this function in conjunction with k4a_image_create() or k4a_image_create_from_buffer() to construct a
* \ref k4a_image_t.
*
* \remarks
* The system timestamp is a high performance and increasing clock (from boot). The timestamp represents the time
* immediately after the image buffer was read by the host PC.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT void k4a_image_set_system_timestamp_nsec(k4a_image_t image_handle, uint64_t timestamp_nsec);
/** Set the exposure time, in microseconds, of the image.
*
* \param image_handle
* Handle of the image to set the exposure time on.
*
* \param exposure_usec
* Exposure time of the image in microseconds.
*
* \remarks
* Use this function in conjunction with k4a_image_create() or k4a_image_create_from_buffer() to construct a
* \ref k4a_image_t. An exposure time of 0 is considered invalid. Only color image formats are expected to have a valid
* exposure time.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT void k4a_image_set_exposure_usec(k4a_image_t image_handle, uint64_t exposure_usec);
/** Set the exposure time, in microseconds, of the image.
*
* \param image_handle
* Handle of the image to set the exposure time on.
*
* \param exposure_usec
* Exposure time of the image in microseconds.
*
* \remarks
* Use this function in conjunction with k4a_image_create() or k4a_image_create_from_buffer() to construct a
* \ref k4a_image_t. An exposure time of 0 is considered invalid. Only color image formats are expected to have a valid
* exposure time.
*
* \deprecated
* Deprecated starting in 1.2.0. Please use k4a_image_set_exposure_usec().
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_DEPRECATED_EXPORT void k4a_image_set_exposure_time_usec(k4a_image_t image_handle, uint64_t exposure_usec);
/** Set the white balance of the image.
*
* \param image_handle
* Handle of the image to set the white balance on.
*
* \param white_balance
* White balance of the image in degrees Kelvin.
*
* \remarks
* Use this function in conjunction with k4a_image_create() or k4a_image_create_from_buffer() to construct a
* \ref k4a_image_t. A white balance of 0 is considered invalid. White balance is only meaningful for color images,
* and not expected on depth or IR images.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT void k4a_image_set_white_balance(k4a_image_t image_handle, uint32_t white_balance);
/** Set the ISO speed of the image.
*
* \param image_handle
* Handle of the image to set the ISO speed on.
*
* \param iso_speed
* ISO speed of the image.
*
* \remarks
* Use this function in conjunction with k4a_image_create() or k4a_image_create_from_buffer() to construct a
* \ref k4a_image_t. An ISO speed of 0 is considered invalid. Only color images are expected to have a valid ISO speed.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT void k4a_image_set_iso_speed(k4a_image_t image_handle, uint32_t iso_speed);
/** Add a reference to the k4a_image_t.
*
* \param image_handle
* Handle of the image for which the get operation is performed on.
*
* \remarks
* References manage the lifetime of the object. When the references reach zero the object is destroyed. A caller must
* not access the object after its reference is released.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT void k4a_image_reference(k4a_image_t image_handle);
/** Remove a reference from the k4a_image_t.
*
* \param image_handle
* Handle of the image for which the get operation is performed on.
*
* \remarks
* References manage the lifetime of the object. When the references reach zero the object is destroyed. A caller must
* not access the object after its reference is released.
*
* \relates k4a_image_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT void k4a_image_release(k4a_image_t image_handle);
/** Starts color and depth camera capture.
*
* \param device_handle
* Handle obtained by k4a_device_open().
*
* \param config
* The configuration we want to run the device in. This can be initialized with ::K4A_DEVICE_CONFIG_INIT_DISABLE_ALL.
*
* \returns
* ::K4A_RESULT_SUCCEEDED is returned on success.
*
* \relates k4a_device_t
*
* \remarks
* Individual sensors configured to run will now start to stream captured data.
*
* \remarks
* It is not valid to call k4a_device_start_cameras() a second time on the same \ref k4a_device_t until
* k4a_device_stop_cameras() has been called.
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_device_start_cameras(k4a_device_t device_handle, const k4a_device_configuration_t *config);
/** Stops the color and depth camera capture.
*
* \param device_handle
* Handle obtained by k4a_device_open().
*
* \relates k4a_device_t
*
* \remarks
* The streaming of individual sensors stops as a result of this call. Once called, k4a_device_start_cameras() may
* be called again to resume sensor streaming.
*
* \remarks
* This function may be called while another thread is blocking in k4a_device_get_capture().
* Calling this function while another thread is in that function will result in that function returning a failure.
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT void k4a_device_stop_cameras(k4a_device_t device_handle);
/** Starts the IMU sample stream.
*
* \param device_handle
* Handle obtained by k4a_device_open().
*
* \returns
* ::K4A_RESULT_SUCCEEDED is returned on success. ::K4A_RESULT_FAILED if the sensor is already running or a failure is
* encountered
*
* \relates k4a_device_t
*
* \remarks
* Call this API to start streaming IMU data. It is not valid to call this function a second time on the same
* \ref k4a_device_t until k4a_device_stop_imu() has been called.
*
* \remarks
* This function is dependent on the state of the cameras. The color or depth camera must be started before the IMU.
* ::K4A_RESULT_FAILED will be returned if one of the cameras is not running.
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_device_start_imu(k4a_device_t device_handle);
/** Stops the IMU capture.
*
* \param device_handle
* Handle obtained by k4a_device_open().
*
* \relates k4a_device_t
*
* \remarks
* The streaming of the IMU stops as a result of this call. Once called, k4a_device_start_imu() may
* be called again to resume sensor streaming, so long as the cameras are running.
*
* \remarks
* This function may be called while another thread is blocking in k4a_device_get_imu_sample().
* Calling this function while another thread is in that function will result in that function returning a failure.
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT void k4a_device_stop_imu(k4a_device_t device_handle);
/** Get the Azure Kinect device serial number.
*
* \param device_handle
* Handle obtained by k4a_device_open().
*
* \param serial_number
* Location to write the serial number to. If the function returns ::K4A_BUFFER_RESULT_SUCCEEDED, this will be a NULL
* terminated string of ASCII characters. If this input is NULL \p serial_number_size will still be updated to return
* the size of the buffer needed to store the string.
*
* \param serial_number_size
* On input, the size of the \p serial_number buffer if that pointer is not NULL. On output, this value is set to the
* actual number of bytes in the serial number (including the null terminator).
*
* \returns
* A return of ::K4A_BUFFER_RESULT_SUCCEEDED means that the \p serial_number has been filled in. If the buffer is too
* small the function returns ::K4A_BUFFER_RESULT_TOO_SMALL and the size of the serial number is
* returned in the \p serial_number_size parameter. All other failures return ::K4A_BUFFER_RESULT_FAILED.
*
* \relates k4a_device_t
*
* \remarks
* Queries the device for its serial number. If the caller needs to know the size of the serial number to allocate
* memory, the function should be called once with a NULL \p serial_number to get the needed size in the \p
* serial_number_size output, and then again with the allocated buffer.
*
* \remarks
* Only a complete serial number will be returned. If the caller's buffer is too small, the function will return
* ::K4A_BUFFER_RESULT_TOO_SMALL without returning any data in \p serial_number.
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_buffer_result_t k4a_device_get_serialnum(k4a_device_t device_handle,
char *serial_number,
size_t *serial_number_size);
/** Get the version numbers of the device's subsystems.
*
* \param device_handle
* Handle obtained by k4a_device_open().
*
* \param version
* Location to write the version info to.
*
* \returns A return of ::K4A_RESULT_SUCCEEDED means that the version structure has been filled in.
* All other failures return ::K4A_RESULT_FAILED.
*
* \relates k4a_device_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_device_get_version(k4a_device_t device_handle, k4a_hardware_version_t *version);
/** Get the Azure Kinect color sensor control capabilities.
*
* \param device_handle
* Handle obtained by k4a_device_open().
*
* \param command
* Color sensor control command.
*
* \param supports_auto
* Location to store whether the color sensor's control support auto mode or not.
* true if it supports auto mode, otherwise false.
*
* \param min_value
* Location to store the color sensor's control minimum value of /p command.
*
* \param max_value
* Location to store the color sensor's control maximum value of /p command.
*
* \param step_value
* Location to store the color sensor's control step value of /p command.
*
* \param default_value
* Location to store the color sensor's control default value of /p command.
*
* \param default_mode
* Location to store the color sensor's control default mode of /p command.
*
* \returns
* ::K4A_RESULT_SUCCEEDED if the value was successfully returned, ::K4A_RESULT_FAILED if an error occurred
*
* \relates k4a_device_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_device_get_color_control_capabilities(k4a_device_t device_handle,
k4a_color_control_command_t command,
bool *supports_auto,
int32_t *min_value,
int32_t *max_value,
int32_t *step_value,
int32_t *default_value,
k4a_color_control_mode_t *default_mode);
/** Get the Azure Kinect color sensor control
* value.
*
* \param device_handle
* Handle obtained by k4a_device_open().
*
* \param command
* Color sensor control command.
*
* \param mode
* Location to store the color sensor's control mode. This mode represents whether the command is in automatic or
* manual mode.
*
* \param value
* Location to store the color sensor's control value. This value is always written, but is only valid when the \p
* mode returned is ::K4A_COLOR_CONTROL_MODE_MANUAL for the current \p command.
*
* \returns
* ::K4A_RESULT_SUCCEEDED if the value was successfully returned, ::K4A_RESULT_FAILED if an error occurred
*
* \remarks
* Each control command may be set to manual or automatic. See the definition of \ref k4a_color_control_command_t on
* how to interpret the \p value for each command.
*
* \remarks
* Some control commands are only supported in manual mode. When a command is in automatic mode, the \p value for
* that command is not valid.
*
* \remarks
* Control values set on a device are reset only when the device is power cycled. The device will retain the
* settings even if the \ref k4a_device_t is closed or the application is restarted.
*
* \relates k4a_device_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_device_get_color_control(k4a_device_t device_handle,
k4a_color_control_command_t command,
k4a_color_control_mode_t *mode,
int32_t *value);
/** Set the Azure Kinect color sensor control value.
*
* \param device_handle
* Handle obtained by k4a_device_open().
*
* \param command
* Color sensor control command.
*
* \param mode
* Color sensor control mode to set. This mode represents whether the command is in automatic or manual mode.
*
* \param value
* Value to set the color sensor's control to. The value is only valid if \p mode
* is set to ::K4A_COLOR_CONTROL_MODE_MANUAL, and is otherwise ignored.
*
* \returns
* ::K4A_RESULT_SUCCEEDED if the value was successfully set, ::K4A_RESULT_FAILED if an error occurred
*
* \remarks
* Each control command may be set to manual or automatic. See the definition of \ref k4a_color_control_command_t on how
* to interpret the \p value for each command.
*
* \remarks
* Some control commands are only supported in manual mode. When a command is in automatic mode, the \p value for that
* command is not valid.
*
* \remarks
* Control values set on a device are reset only when the device is power cycled. The device will retain the settings
* even if the \ref k4a_device_t is closed or the application is restarted.
*
* \relates k4a_device_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_device_set_color_control(k4a_device_t device_handle,
k4a_color_control_command_t command,
k4a_color_control_mode_t mode,
int32_t value);
/** Get the raw calibration blob for the entire Azure Kinect device.
*
* \param device_handle
* Handle obtained by k4a_device_open().
*
* \param data
* Location to write the calibration data to. This field may optionally be set to NULL for the caller to query for
* the needed data size.
*
* \param data_size
* On passing \p data_size into the function this variable represents the available size of the \p data
* buffer. On return this variable is updated with the amount of data actually written to the buffer, or the size
* required to store the calibration buffer if \p data is NULL.
*
* \returns
* ::K4A_BUFFER_RESULT_SUCCEEDED if \p data was successfully written. If \p data_size points to a buffer size that is
* too small to hold the output or \p data is NULL, ::K4A_BUFFER_RESULT_TOO_SMALL is returned and \p data_size is
* updated to contain the minimum buffer size needed to capture the calibration data.
*
* \relates k4a_device_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_buffer_result_t k4a_device_get_raw_calibration(k4a_device_t device_handle,
uint8_t *data,
size_t *data_size);
/** Get the camera calibration for the entire Azure Kinect device.
*
* \param device_handle
* Handle obtained by k4a_device_open().
*
* \param depth_mode
* Mode in which depth camera is operated.
*
* \param color_resolution
* Resolution in which color camera is operated.
*
* \param calibration
* Location to write the calibration
*
* \returns
* ::K4A_RESULT_SUCCEEDED if \p calibration was successfully written. ::K4A_RESULT_FAILED otherwise.
*
* \remarks
* The \p calibration represents the data needed to transform between the camera views and may be
* different for each operating \p depth_mode and \p color_resolution the device is configured to operate in.
*
* \remarks
* The \p calibration output is used as input to all calibration and transformation functions.
*
* \see k4a_calibration_2d_to_2d()
* \see k4a_calibration_2d_to_3d()
* \see k4a_calibration_3d_to_2d()
* \see k4a_calibration_3d_to_3d()
*
* \relates k4a_device_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_device_get_calibration(k4a_device_t device_handle,
const k4a_depth_mode_t depth_mode,
const k4a_color_resolution_t color_resolution,
k4a_calibration_t *calibration);
/** Get the device jack status for the synchronization in and synchronization out connectors.
*
* \param device_handle
* Handle obtained by k4a_device_open().
*
* \param sync_in_jack_connected
* Upon successful return this value will be set to true if a cable is connected to this sync in jack.
*
* \param sync_out_jack_connected
* Upon successful return this value will be set to true if a cable is connected to this sync out jack.
*
* \returns
* ::K4A_RESULT_SUCCEEDED if the connector status was successfully read.
*
* \relates k4a_device_t
*
* \remarks
* If \p sync_out_jack_connected is true then \ref k4a_device_configuration_t wired_sync_mode mode can be set to \ref
* K4A_WIRED_SYNC_MODE_STANDALONE or \ref K4A_WIRED_SYNC_MODE_MASTER. If \p sync_in_jack_connected is true then \ref
* k4a_device_configuration_t wired_sync_mode mode can be set to \ref K4A_WIRED_SYNC_MODE_STANDALONE or \ref
* K4A_WIRED_SYNC_MODE_SUBORDINATE.
*
* \see k4a_device_start_cameras()
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_device_get_sync_jack(k4a_device_t device_handle,
bool *sync_in_jack_connected,
bool *sync_out_jack_connected);
/** Get the camera calibration for a device from a raw calibration blob.
*
* \param raw_calibration
* Raw calibration blob obtained from a device or recording. The raw calibration must be NULL terminated.
*
* \param raw_calibration_size
* The size, in bytes, of raw_calibration including the NULL termination.
*
* \param depth_mode
* Mode in which depth camera is operated.
*
* \param color_resolution
* Resolution in which color camera is operated.
*
* \param calibration
* Location to write the calibration.
*
* \returns
* ::K4A_RESULT_SUCCEEDED if \p calibration was successfully written. ::K4A_RESULT_FAILED otherwise.
*
* \remarks
* The \p calibration represents the data needed to transform between the camera views and is
* different for each operating \p depth_mode and \p color_resolution the device is configured to operate in.
*
* \remarks
* The \p calibration output is used as input to all transformation functions.
*
* \see k4a_calibration_2d_to_2d()
* \see k4a_calibration_2d_to_3d()
* \see k4a_calibration_3d_to_2d()
* \see k4a_calibration_3d_to_3d()
*
* \relates k4a_device_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_calibration_get_from_raw(char *raw_calibration,
size_t raw_calibration_size,
const k4a_depth_mode_t depth_mode,
const k4a_color_resolution_t color_resolution,
k4a_calibration_t *calibration);
/** Transform a 3D point of a source coordinate system into a 3D point of the target coordinate system
*
* \param calibration
* Location to read the camera calibration data.
*
* \param source_point3d_mm
* The 3D coordinates in millimeters representing a point in \p source_camera.
*
* \param source_camera
* The current camera.
*
* \param target_camera
* The target camera.
*
* \param target_point3d_mm
* Pointer to the output where the new 3D coordinates of the input point in the coordinate space of \p target_camera is
* stored in millimeters.
*
* \returns
* ::K4A_RESULT_SUCCEEDED if \p target_point3d_mm was successfully written. ::K4A_RESULT_FAILED if \p calibration
* contained invalid transformation parameters.
*
* \remarks
* This function is used to transform 3D points between depth and color camera coordinate systems. The function uses the
* extrinsic camera calibration. It computes the output via multiplication with a precomputed matrix encoding a 3D
* rotation and a 3D translation. If \p source_camera and \p target_camera are the same, then \p target_point3d_mm will
* be identical to \p source_point3d_mm.
*
* \relates k4a_calibration_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_calibration_3d_to_3d(const k4a_calibration_t *calibration,
const k4a_float3_t *source_point3d_mm,
const k4a_calibration_type_t source_camera,
const k4a_calibration_type_t target_camera,
k4a_float3_t *target_point3d_mm);
/** Transform a 2D pixel coordinate with an associated depth value of the source camera into a 3D point of the target
* coordinate system.
*
* \param calibration
* Location to read the camera calibration obtained by k4a_device_get_calibration().
*
* \param source_point2d
* The 2D pixel in \p source_camera coordinates.
*
* \param source_depth_mm
* The depth of \p source_point2d in millimeters. One way to derive the depth value in the color camera geometry is to
* use the function k4a_transformation_depth_image_to_color_camera().
*
* \param source_camera
* The current camera.
*
* \param target_camera
* The target camera.
*
* \param target_point3d_mm
* Pointer to the output where the 3D coordinates of the input pixel in the coordinate system of \p target_camera is
* stored in millimeters.
*
* \param valid
* The output parameter returns a value of 1 if the \p source_point2d is a valid coordinate, and will return 0 if
* the coordinate is not valid in the calibration model.
*
* \returns
* ::K4A_RESULT_SUCCEEDED if \p target_point3d_mm was successfully written. ::K4A_RESULT_FAILED if \p calibration
* contained invalid transformation parameters. If the function returns ::K4A_RESULT_SUCCEEDED, but \p valid is 0,
* the transformation was computed, but the results in \p target_point3d_mm are outside of the range of valid
* calibration and should be ignored.
*
* \remarks
* This function applies the intrinsic calibration of \p source_camera to compute the 3D ray from the focal point of the
* camera through pixel \p source_point2d. The 3D point on this ray is then found using \p source_depth_mm. If \p
* target_camera is different from \p source_camera, the 3D point is transformed to \p target_camera using
* k4a_calibration_3d_to_3d(). In practice, \p source_camera and \p target_camera will often be identical. In this
* case, no 3D to 3D transformation is applied.
*
* \remarks
* If \p source_point2d is not considered as valid pixel coordinate
* according to the intrinsic camera model, \p valid is set to 0. If it is valid, \p valid will be set to 1. The user
* should not use the value of \p target_point3d_mm if \p valid was set to 0.
*
* \relates k4a_calibration_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_calibration_2d_to_3d(const k4a_calibration_t *calibration,
const k4a_float2_t *source_point2d,
const float source_depth_mm,
const k4a_calibration_type_t source_camera,
const k4a_calibration_type_t target_camera,
k4a_float3_t *target_point3d_mm,
int *valid);
/** Transform a 3D point of a source coordinate system into a 2D pixel coordinate of the target camera.
*
* \param calibration
* Location to read the camera calibration obtained by k4a_device_get_calibration().
*
* \param source_point3d_mm
* The 3D coordinates in millimeters representing a point in \p source_camera
*
* \param source_camera
* The current camera.
*
* \param target_camera
* The target camera.
*
* \param target_point2d
* Pointer to the output where the 2D pixel in \p target_camera coordinates is stored.
*
* \param valid
* The output parameter returns a value of 1 if the \p source_point3d_mm is a valid coordinate in the \p target_camera
* coordinate system, and will return 0 if the coordinate is not valid in the calibration model.
*
* \returns
* ::K4A_RESULT_SUCCEEDED if \p target_point2d was successfully written. ::K4A_RESULT_FAILED if \p calibration
* contained invalid transformation parameters. If the function returns ::K4A_RESULT_SUCCEEDED, but \p valid is 0,
* the transformation was computed, but the results in \p target_point2d are outside of the range of valid calibration
* and should be ignored.
*
* \remarks
* If \p target_camera is different from \p source_camera, \p source_point3d_mm is transformed to \p target_camera using
* k4a_calibration_3d_to_3d(). In practice, \p source_camera and \p target_camera will often be identical. In this
* case, no 3D to 3D transformation is applied. The 3D point in the coordinate system of \p target_camera is then
* projected onto the image plane using the intrinsic calibration of \p target_camera.
*
* \remarks
* If \p source_point3d_mm does not map to a valid 2D coordinate in the \p target_camera coordinate system, \p valid is
* set to 0. If it is valid, \p valid will be set to 1. The user should not use the value of \p target_point2d if \p
* valid was set to 0.
*
* \relates k4a_calibration_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_calibration_3d_to_2d(const k4a_calibration_t *calibration,
const k4a_float3_t *source_point3d_mm,
const k4a_calibration_type_t source_camera,
const k4a_calibration_type_t target_camera,
k4a_float2_t *target_point2d,
int *valid);
/** Transform a 2D pixel coordinate with an associated depth value of the source camera into a 2D pixel coordinate of
* the target camera.
*
* \param calibration
* Location to read the camera calibration obtained by k4a_device_get_calibration().
*
* \param source_point2d
* The 2D pixel in \p source_camera coordinates.
*
* \param source_depth_mm
* The depth of \p source_point2d in millimeters. One way to derive the depth value in the color camera geometry is to
* use the function k4a_transformation_depth_image_to_color_camera().
*
* \param source_camera
* The current camera.
*
* \param target_camera
* The target camera.
*
* \param target_point2d
* The 2D pixel in \p target_camera coordinates.
*
* \param valid
* The output parameter returns a value of 1 if the \p source_point2d is a valid coordinate in the \p target_camera
* coordinate system, and will return 0 if the coordinate is not valid in the calibration model.
*
* \returns
* ::K4A_RESULT_SUCCEEDED if \p target_point2d was successfully written. ::K4A_RESULT_FAILED if \p calibration
* contained invalid transformation parameters. If the function returns ::K4A_RESULT_SUCCEEDED, but \p valid is 0,
* the transformation was computed, but the results in \p target_point2d are outside of the range of valid calibration
* and should be ignored.
*
* \remarks
* This function maps a pixel between the coordinate systems of the depth and color cameras. It is equivalent to calling
* k4a_calibration_2d_to_3d() to compute the 3D point corresponding to \p source_point2d and then using
* k4a_calibration_3d_to_2d() to map the 3D point into the coordinate system of the \p target_camera.
*
* \remarks
* If \p source_camera and \p target_camera are identical, the function immediately sets \p target_point2d to \p
* source_point2d and returns without computing any transformations.
*
* \remarks
* If \p source_point2d does not map to a valid 2D coordinate in the \p target_camera coordinate system, \p valid is set
* to 0. If it is valid, \p valid will be set to 1. The user should not use the value of \p target_point2d if \p valid
* was set to 0.
*
* \relates k4a_calibration_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_calibration_2d_to_2d(const k4a_calibration_t *calibration,
const k4a_float2_t *source_point2d,
const float source_depth_mm,
const k4a_calibration_type_t source_camera,
const k4a_calibration_type_t target_camera,
k4a_float2_t *target_point2d,
int *valid);
/** Transform a 2D pixel coordinate from color camera into a 2D pixel coordinate of
* the depth camera.
*
* \param calibration
* Location to read the camera calibration obtained by k4a_device_get_calibration().
*
* \param source_point2d
* The 2D pixel in \p color camera coordinates.
*
* \param depth_image
* Handle to input depth image.
*
* \param target_point2d
* The 2D pixel in \p depth camera coordinates.
*
* \param valid
* The output parameter returns a value of 1 if the \p source_point2d is a valid coordinate in the \p target_camera
* coordinate system, and will return 0 if the coordinate is not valid in the calibration model.
*
* \returns
* ::K4A_RESULT_SUCCEEDED if \p target_point2d was successfully written. ::K4A_RESULT_FAILED if \p calibration
* contained invalid transformation parameters. If the function returns ::K4A_RESULT_SUCCEEDED, but \p valid is 0,
* the transformation was computed, but the results in \p target_point2d are outside of the range of valid calibration
* and should be ignored.
*
* \remarks
* This function represents an alternative to k4a_calibration_2d_to_2d() if the number of pixels that need to be
* transformed is small. This function searches along an epipolar line in the depth image to find the corresponding
* depth pixel. If a larger number of pixels need to be transformed, it might be computationally cheaper to call
* k4a_transformation_depth_image_to_color_camera() to get correspondence depth values for these color pixels, then call
* the function k4a_calibration_2d_to_2d().
*
* \remarks
* If \p source_point2d does not map to a valid 2D coordinate in the \p target_camera coordinate system, \p valid is set
* to 0. If it is valid, \p valid will be set to 1. The user should not use the value of \p target_point2d if \p valid
* was set to 0.
*
* \relates k4a_calibration_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_calibration_color_2d_to_depth_2d(const k4a_calibration_t *calibration,
const k4a_float2_t *source_point2d,
const k4a_image_t depth_image,
k4a_float2_t *target_point2d,
int *valid);
/** Get handle to transformation handle.
*
* \param calibration
* A calibration structure obtained by k4a_device_get_calibration().
*
* \returns
* A transformation handle. A NULL is returned if creation fails.
*
* \remarks
* The transformation handle is used to transform images from the coordinate system of one camera into the other. Each
* transformation handle requires some pre-computed resources to be allocated, which are retained until the handle is
* destroyed.
*
* \remarks
* The transformation handle must be destroyed with k4a_transformation_destroy() when it is no longer to be used.
*
* \relates k4a_calibration_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_transformation_t k4a_transformation_create(const k4a_calibration_t *calibration);
/** Destroy transformation handle.
*
* \param transformation_handle
* Transformation handle to destroy.
*
* \relates k4a_transformation_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT void k4a_transformation_destroy(k4a_transformation_t transformation_handle);
/** Transforms the depth map into the geometry of the color camera.
*
* \param transformation_handle
* Transformation handle.
*
* \param depth_image
* Handle to input depth image.
*
* \param transformed_depth_image
* Handle to output transformed depth image.
*
* \remarks
* This produces a depth image for which each pixel matches the corresponding pixel coordinates of the color camera.
*
* \remarks
* \p depth_image and \p transformed_depth_image must be of format ::K4A_IMAGE_FORMAT_DEPTH16.
*
* \remarks
* \p transformed_depth_image must have a width and height matching the width and height of the color camera in the mode
* specified by the \ref k4a_calibration_t used to create the \p transformation_handle with k4a_transformation_create().
*
* \remarks
* The contents \p transformed_depth_image will be filled with the depth values derived from \p depth_image in the color
* camera's coordinate space.
*
* \remarks
* \p transformed_depth_image should be created by the caller using k4a_image_create() or
* k4a_image_create_from_buffer().
*
* \returns
* ::K4A_RESULT_SUCCEEDED if \p transformed_depth_image was successfully written and ::K4A_RESULT_FAILED otherwise.
*
* \relates k4a_transformation_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_transformation_depth_image_to_color_camera(k4a_transformation_t transformation_handle,
const k4a_image_t depth_image,
k4a_image_t transformed_depth_image);
/** Transforms depth map and a custom image into the geometry of the color camera.
*
* \param transformation_handle
* Transformation handle.
*
* \param depth_image
* Handle to input depth image.
*
* \param custom_image
* Handle to input custom image.
*
* \param transformed_depth_image
* Handle to output transformed depth image.
*
* \param transformed_custom_image
* Handle to output transformed custom image.
*
* \param interpolation_type
* Parameter that controls how pixels in \p custom_image should be interpolated when transformed to color camera space.
* K4A_TRANSFORMATION_INTERPOLATION_TYPE_LINEAR if linear interpolation should be used.
* K4A_TRANSFORMATION_INTERPOLATION_TYPE_NEAREST if nearest neighbor interpolation should be used.
*
* \param invalid_custom_value
* Defines the custom image pixel value that should be written to \p transformed_custom_image in case the corresponding
* depth pixel can not be transformed into the color camera space.
*
* \remarks
* This produces a depth image and a corresponding custom image for which each pixel matches the corresponding
* pixel coordinates of the color camera.
*
* \remarks
* \p depth_image and \p transformed_depth_image must be of format ::K4A_IMAGE_FORMAT_DEPTH16.
*
* \remarks
* \p custom_image and \p transformed_custom_image must be of format ::K4A_IMAGE_FORMAT_CUSTOM8 or
* ::K4A_IMAGE_FORMAT_CUSTOM16.
*
* \remarks
* \p transformed_depth_image and \p transformed_custom_image must have a width and height matching the width and
* height of the color camera in the mode specified by the \ref k4a_calibration_t used to create the
* \p transformation_handle with k4a_transformation_create().
*
* \remarks
* \p custom_image must have a width and height matching the width and height of \p depth_image.
*
* \remarks
* The contents \p transformed_depth_image will be filled with the depth values derived from \p depth_image in the color
* camera's coordinate space.
*
* \remarks
* The contents \p transformed_custom_image will be filled with the values derived from \p custom_image in the color
* camera's coordinate space.
*
* \remarks
* \p transformed_depth_image and \p transformed_custom_image should be created by the caller using k4a_image_create()
* or k4a_image_create_from_buffer().
*
* \remarks
* Using ::K4A_TRANSFORMATION_INTERPOLATION_TYPE_LINEAR for \p interpolation_type could create new values to \p
* transformed_custom_image which do no exist in \p custom_image. Using ::K4A_TRANSFORMATION_INTERPOLATION_TYPE_NEAREST
* will prevent this from happenning but will result in a less smooth image.
*
* \returns
* ::K4A_RESULT_SUCCEEDED if \p transformed_depth_image and \p transformed_custom_image were successfully written and
* ::K4A_RESULT_FAILED otherwise.
*
* \relates k4a_transformation_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t
k4a_transformation_depth_image_to_color_camera_custom(k4a_transformation_t transformation_handle,
const k4a_image_t depth_image,
const k4a_image_t custom_image,
k4a_image_t transformed_depth_image,
k4a_image_t transformed_custom_image,
k4a_transformation_interpolation_type_t interpolation_type,
uint32_t invalid_custom_value);
/** Transforms a color image into the geometry of the depth camera.
*
* \param transformation_handle
* Transformation handle.
*
* \param depth_image
* Handle to input depth image.
*
* \param color_image
* Handle to input color image.
*
* \param transformed_color_image
* Handle to output transformed color image.
*
* \remarks
* This produces a color image for which each pixel matches the corresponding pixel coordinates of the depth camera.
*
* \remarks
* \p depth_image and \p color_image need to represent the same moment in time. The depth data will be applied to the
* color image to properly warp the color data to the perspective of the depth camera.
*
* \remarks
* \p depth_image must be of type ::K4A_IMAGE_FORMAT_DEPTH16. \p color_image must be of format
* ::K4A_IMAGE_FORMAT_COLOR_BGRA32.
*
* \remarks
* \p transformed_color_image image must be of format ::K4A_IMAGE_FORMAT_COLOR_BGRA32. \p transformed_color_image must
* have the width and height of the depth camera in the mode specified by the \ref k4a_calibration_t used to create
* the \p transformation_handle with k4a_transformation_create().
*
* \remarks
* \p transformed_color_image should be created by the caller using k4a_image_create() or
* k4a_image_create_from_buffer().
*
* \returns
* ::K4A_RESULT_SUCCEEDED if \p transformed_color_image was successfully written and ::K4A_RESULT_FAILED otherwise.
*
* \relates k4a_transformation_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_transformation_color_image_to_depth_camera(k4a_transformation_t transformation_handle,
const k4a_image_t depth_image,
const k4a_image_t color_image,
k4a_image_t transformed_color_image);
/** Transforms the depth image into a single image with voxels representing
* X, Y and Z-coordinates in millimeters of corresponding 3D points.
*
* \param transformation_handle
* Transformation handle.
*
* \param depth_image
* Handle to input depth image.
*
* \param camera
* Geometry in which depth map was computed.
*
* \param xyz_image
* Handle to output xyz image.
*
* \remarks
* \p depth_image must be of format ::K4A_IMAGE_FORMAT_DEPTH16.
*
* \remarks
* The \p camera parameter tells the function what the perspective of the \p depth_image is. If the \p depth_image was
* captured directly from the depth camera, the value should be ::K4A_CALIBRATION_TYPE_DEPTH. If the \p depth_image is
* the result of a transformation into the color camera's coordinate space using
* k4a_transformation_depth_image_to_color_camera(), the value should be ::K4A_CALIBRATION_TYPE_COLOR.
*
* \remarks
* The format of \p xyz_image must be ::K4A_IMAGE_FORMAT_CUSTOM. The width and height of \p xyz_image must match the
* width and height of \p depth_image. \p xyz_image must have a stride in bytes of at least 6 times its width in pixels.
*
* \remarks
* Each pixel of the \p xyz_image consists of three int16_t values, totaling 6 bytes. The three int16_t values are the
* X, Y, and Z values of the point.
*
* \remarks
* \p xyz_image should be created by the caller using k4a_image_create() or k4a_image_create_from_buffer().
*
* \returns
* ::K4A_RESULT_SUCCEEDED if \p xyz_image was successfully written and ::K4A_RESULT_FAILED otherwise.
*
* \relates k4a_transformation_t
*
* \xmlonly
* <requirements>
* <requirement name="Header">k4a.h (include k4a/k4a.h)</requirement>
* <requirement name="Library">k4a.lib</requirement>
* <requirement name="DLL">k4a.dll</requirement>
* </requirements>
* \endxmlonly
*/
K4A_EXPORT k4a_result_t k4a_transformation_depth_image_to_point_cloud(k4a_transformation_t transformation_handle,
const k4a_image_t depth_image,
const k4a_calibration_type_t camera,
k4a_image_t xyz_image);
/**
* @}
*/
#ifdef __cplusplus
}
#endif
#endif /* K4A_H */