Compartilhar via


Usar transformações de imagem do SDK do sensor do Azure Kinect

Siga as funções específicas para usar e transformar imagens entre os sistemas de câmera coordenada no Azure Kinect DK.

Funções k4a_transformation

Todas as funções prefixadas com k4a_transformation operam em imagens inteiras. Elas exigem o identificador de transformação k4a_transformation_t obtido via k4a_transformation_create() e não são alocadas via k4a_transformation_destroy(). Você também pode consultar o exemplo de transformação do SDK que demonstra como usar as três funções neste tópico.

As seguintes funções são cobertas:

k4a_transformation_depth_image_to_color_camera

Visão geral

A função k4a_transformation_depth_image_to_color_camera() transforma o mapa de profundidade do ponto de vista da câmera de profundidade no ponto de vista da câmera colorida. Essa função foi projetada para produzir as chamadas imagens RGB-D, em que D representa um canal de imagem adicional registrando o valor de profundidade. Como visto na figura abaixo, a imagem colorida e a saída de k4a_transformation_depth_image_to_color_camera() parecem como se tivessem sido tiradas do mesmo ponto de vista, ou seja, o ponto de vista da câmera colorida.

Transformação da imagem

Implementação

Essa função de transformação é mais complexa do que simplesmente chamar k4a_calibration_2d_to_2d() para cada pixel. Ela distorce uma malha de triângulo da geometria da câmera de profundidade para a geometria da câmera colorida. A malha de triângulo é usada para evitar a geração de espaços na imagem de profundidade transformada. Um buffer Z garante que as oclusões sejam manipuladas corretamente. A aceleração de GPU está habilitada para essa função por padrão.

Parâmetros

Os parâmetros de entrada são o identificador de transformação e uma imagem de profundidade. A resolução da imagem de profundidade deve corresponder a depth_mode especificado na criação do identificador de transformação. Por exemplo, se o identificador de transformação foi criado usando o modo K4A_DEPTH_MODE_WFOV_UNBINNED 1024x1024, a resolução da imagem de profundidade deve ser 1024x1024 pixels. A saída é uma imagem de profundidade transformada que precisa ser alocada pelo usuário por meio da chamada de k4a_image_create(). A resolução da imagem de profundidade transformada deve corresponder a color_resolution especificado na criação do identificador de transformação. Por exemplo, se a resolução de cor foi definida como K4A_COLOR_RESOLUTION_1080P, a resolução da imagem de saída deve ser 1920x1080 pixels. O stride da imagem de saída é definido como width * sizeof(uint16_t), pois a imagem armazena valores de profundidade de 16 bits.

k4a_transformation_depth_image_to_color_camera_custom

Visão geral

A função k4a_transformation_depth_image_to_color_camera_custom() transforma o mapa de profundidade do ponto de vista da câmera de profundidade no ponto de vista da câmera colorida. Como uma extensão de k4a_transformation_depth_image_to_color_camera(), essa função foi projetada para produzir uma imagem personalizada correspondente para a qual cada pixel corresponde às coordenadas de pixel correspondentes da câmera colorida adicionais à imagem de profundidade transformada.

Implementação

Essa função de transformação produz a imagem de profundidade transformada da mesma maneira que k4a_transformation_depth_image_to_color_camera(). Para transformar a imagem personalizada, essa função fornece opções de uso de interpolação linear ou interpolação de vizinho mais próximo. O uso de interpolação linear pode criar valores na imagem personalizada transformada. O uso da interpolação de vizinho mais próximo impedirá que os valores não presentes na imagem original apareçam na imagem de saída, mas resultarão em imagens menos suaves. A imagem personalizada deve ser um canal único de 8 ou 16 bits. A aceleração de GPU está habilitada para essa função por padrão.

Parâmetros

Os parâmetros de entrada são o identificador de transformação, uma imagem de profundidade, uma imagem personalizada e o tipo de interpolação. A resolução da imagem de profundidade e da imagem personalizada deve corresponder a depth_mode especificado na criação do identificador de transformação. Por exemplo, se o identificador de transformação foi criado usando o modo K4A_DEPTH_MODE_WFOV_UNBINNED 1024x1024, a resolução da imagem de profundidade e da imagem personalizada deve ser 1024x1024 pixels. O interpolation_type deve ser K4A_TRANSFORMATION_INTERPOLATION_TYPE_LINEAR ou K4A_TRANSFORMATION_INTERPOLATION_TYPE_NEAREST. A saída é uma imagem de profundidade transformada e uma imagem personalizada transformada que precisa ser alocada pelo usuário por meio da chamada de k4a_image_create(). A resolução da imagem de profundidade transformada e da imagem personalizada transformada deve corresponder a color_resolution especificado na criação do identificador de transformação. Por exemplo, se a resolução de cor foi definida como K4A_COLOR_RESOLUTION_1080P, a resolução da imagem de saída deve ser 1920x1080 pixels. O stride da imagem de profundidade de saída é definido como width * sizeof(uint16_t), pois a imagem armazena valores de profundidade de 16 bits. A imagem personalizada de entrada e a imagem personalizada transformada devem ser do formato K4A_IMAGE_FORMAT_CUSTOM8 ou K4A_IMAGE_FORMAT_CUSTOM16; o stride da imagem correspondente deve ser definido adequadamente.

k4a_transformation_color_image_to_depth_camera

Visão geral

A função k4a_transformation_color_image_to_depth_camera() transforma a imagem em cores do ponto de vista da câmera colorida no ponto de vista da câmera de profundidade (veja a figura acima). Ela pode ser usada para gerar imagens RGB-D.

Implementação

Para cada pixel do mapa de profundidade, a função usa o valor de profundidade do pixel para calcular a coordenada de subpixel correspondente na imagem colorida. Em seguida, pesquisamos o valor da cor nessa coordenada na imagem colorida. A interpolação bilinear é executada na imagem colorida para obter o valor da cor na precisão de subpixel. Um pixel que não tem uma leitura de profundidade associada é atribuído a um valor de BGRA de [0,0,0,0] na imagem de saída. A aceleração de GPU está habilitada para essa função por padrão. Como esse método produz espaços na imagem colorida transformada e não trata oclusões, é recomendável usar a função k4a_transformation_depth_image_to_color_camera().

Parâmetros

Os parâmetros de entrada são o identificador de transformação e uma imagem colorida. As resoluções de imagens de profundidade e cor devem corresponder a depth_mode e color_resolution especificados na criação do identificador de transformação. A saída é uma imagem colorida transformada que precisa ser alocada pelo usuário por meio da chamada de k4a_image_create(). A resolução da imagem colorida transformada deve corresponder a depth_resolution especificado na criação do identificador de transformação. A imagem de saída armazena quatro valores de 8 bits que representam BGRA para cada pixel. Portanto, o stride da imagem é width * 4 * sizeof(uint8_t). A ordem dos dados é de pixel intercalado, ou seja, valor azul – pixel 0, valor verde – pixel 0, valor vermelho – pixel 0, valor alfa – pixel 0, valor azul – pixel 1 e assim por diante.

k4a_transformation_depth_image_to_point_cloud

Visão geral

A função k4a_transformation_depth_image_to_point_cloud() converte um mapa de profundidade 2D tirado por uma câmera em uma nuvem de ponto 3D no sistema de coordenadas da mesma câmera. Portanto, a câmera pode ser de profundidade ou colorida.

Implementação

A função fornece resultados equivalentes à execução de k4a_calibration_2d_to_2d() para cada pixel, mas é computacionalmente mais eficiente. Ao chamar k4a_transformation_create(), pré-calculamos uma tabela de pesquisa XY que armazena os fatores de escala X e Y para cada pixel da imagem. Ao chamar k4a_transformation_depth_image_to_point_cloud(), obtemos a coordenada X 3D de um pixel multiplicando o fator de escala X do pixel pela coordenada Z do pixel. De maneira análoga, a coordenada Y 3D é calculada pela multiplicação com o fator de escala Y. O exemplo de nuvem de ponto rápido do SDK demonstra como a tabela XY é computada. Os usuários podem seguir o código de exemplo para implementar a própria versão dessa função, por exemplo, para acelerar o pipeline de GPU.

Parâmetros

Os parâmetros de entrada são o identificador de transformação, um especificador de câmera e uma imagem de profundidade. Se o especificador de câmera for definido como profundidade, a resolução da imagem de profundidade precisará corresponder ao depth_mode especificado na criação do identificador de transformação. Caso contrário, se o especificador for definido como a câmera colorida, a resolução precisará corresponder à resolução do color_resolution escolhido. O parâmetro de saída é uma imagem XYZ que precisa ser alocada pelo usuário por meio da chamada de k4a_image_create(). A resolução da imagem XYZ precisa corresponder à resolução do mapa de profundidade de entrada. Armazenamos três valores de coordenadas de 16 bits assinados em milímetros para cada pixel. Portanto, o stride da imagem XYZ é definido como width * 3 * sizeof(int16_t). A ordem dos dados é de pixel intercalado, ou seja, coordenada X – pixel 0, coordenada Y – pixel 0, coordenada Z – pixel 0, coordenada X – pixel 1 e assim por diante. Se um pixel não puder ser convertido em 3D, a função atribuirá os valores [0,0,0] ao pixel.

Exemplos

Exemplo de transformação

Próximas etapas

Agora que você sabe como usar as funções de transformação de imagem do SDK do sensor do Azure Kinect, também pode aprender sobre

Além disso, você pode examinar

Sistemas de coordenadas