本文內容
● k4a_transformation 函數
● 示例
● 后續步驟
本文完全復用Azure Kinect DK的圖像轉換功能,主要實(shí)現D2C,C2D,深度轉點(diǎn)云的功能。
k4a_transformation 函數
k4a_transformation 是 Azure Kinect DK 用于協(xié)調相機系統之間去使用和轉換圖像。所有帶有 k4a_transformation 前綴的函數針對整個(gè)圖像運行。 它們需要通過(guò) k4a_transformation_create() 獲取轉換句柄 k4a_transformation_t,并通過(guò) k4a_transformation_destroy() 釋放句柄。 你還可以參考 SDK 轉換示例,演示了如何使用這幾個(gè)函數。
本文將介紹以下函數:
● k4a_transformation_depth_image_to_color_camera()
● k4a_transformation_depth_image_to_color_camera_custom()
● k4a_transformation_color_image_to_depth_camera()
● k4a_transformation_depth_image_to_point_cloud()
k4a_transformation_depth_image_to_color_camera
概述
函數 k4a_transformation_depth_image_to_color_camera() 將深度圖從深度相機的視點(diǎn)轉換為彩色相機的視點(diǎn)。 此函數旨在生成所謂的 RGB-D 圖像,其中,D 表示錄制深度值的附加圖像通道。 在下圖中可以看到,k4a_transformation_depth_image_to_color_camera() 輸出的深度圖像與彩色圖像如同它們取自同一視點(diǎn)(即,彩色相機的視點(diǎn))。
實(shí)現
此轉換函數比單純針對每個(gè)像素調用 k4a_calibration_2d_to_2d() 更為復雜。 它將深度相機幾何結構中的三角網(wǎng)格扭曲成彩色相機的幾何結構。 使用三角網(wǎng)格可以避免轉換的深度圖像出現孔洞。 Z 緩沖區確保正確處理遮擋物。 默認已為此函數啟用 GPU 加速。
參數
輸入參數是轉換句柄和深度圖像。 深度圖像的分辨率必須與創(chuàng )建轉換句柄時(shí)指定的 depth_mode 相匹配。 例如,如果轉換句柄是使用 1024x1024 K4A_DEPTH_MODE_WFOV_UNBINNED 模式創(chuàng )建的,則深度圖像的分辨率必須是 1024x1024 像素。 輸出是需要由用戶(hù)調用 k4a_image_create() 分配的已轉換深度圖像。 已轉換的深度圖像的分辨率必須與創(chuàng )建轉換句柄時(shí)指定的 color_resolution 相匹配。 例如,如果彩色分辨率設置為 K4A_COLOR_RESOLUTION_1080P,則輸出圖像的分辨率必須是 1920x1080 像素。 輸出圖像步幅設置為 width * sizeof(uint16_t),因為圖像存儲 16 位深度值。
k4a_transformation_depth_image_to_color_camera_custom
概述
函數 k4a_transformation_depth_image_to_color_camera_custom() 將深度圖和自定義圖像從深度相機的視點(diǎn)轉換為彩色相機的視點(diǎn)。 作為 k4a_transformation_depth_image_to_color_camera() 的擴展,此函數旨在能生成對應的自定義圖像,其每個(gè)像素與彩色相機的相應像素坐標相匹配。
實(shí)現
此轉換函數生成轉換的深度圖像的方式與 k4a_transformation_depth_image_to_color_camera() 相同。 若要轉換自定義圖像,此函數提供了使用線(xiàn)性?xún)炔寤蜃罱泥徲騼炔宓倪x項。 使用線(xiàn)性?xún)炔蹇梢栽谵D換后的自定義圖像中創(chuàng )建新值。 使用最近的鄰域內插將防止原始圖像中不存在的值出現在輸出圖像中,但會(huì )導致圖像不太平滑。 自定義圖像應為單通道 8 位或 16 位。 默認已為此函數啟用 GPU 加速。
參數
輸入參數為轉換句柄、深度圖像、自定義圖像和內插類(lèi)型。 深度圖像和自定義圖像的分辨率必須與創(chuàng )建轉換句柄時(shí)指定的 depth_mode 相匹配。 例如,如果轉換句柄是使用 1024x1024 K4A_DEPTH_MODE_WFOV_UNBINNED 模式創(chuàng )建的,則深度圖像和自定義圖像的分辨率必須是 1024x1024 像素。 interpolation_type 應為 K4A_TRANSFORMATION_INTERPOLATION_TYPE_LINEAR 或 K4A_TRANSFORMATION_INTERPOLATION_TYPE_NEAREST。 輸出是轉換后的深度圖像和轉換后的自定義圖像,需要由用戶(hù)通過(guò)調用 k4a_image_create() 來(lái)分配。 轉換后的深度圖像和轉換后的自定義圖像的分辨率必須與創(chuàng )建轉換句柄時(shí)指定的 color_resolution 相匹配。 例如,如果彩色分辨率設置為 K4A_COLOR_RESOLUTION_1080P,則輸出圖像的分辨率必須是 1920x1080 像素。 輸出深度圖像步幅設置為 width * sizeof(uint16_t),因為該圖像存儲 16 位深度值。 輸入的自定義圖像和轉換后的自定義圖像的格式必須為 K4A_IMAGE_FORMAT_CUSTOM8 或 K4A_IMAGE_FORMAT_CUSTOM16,應相應設置對應的圖像步幅。
k4a_transformation_color_image_to_depth_camera
概述
函數 k4a_transformation_color_image_to_depth_camera() 將彩色圖像從彩色相機的視點(diǎn)轉換為深度相機的視點(diǎn)(參閱上圖)。 使用此函數可以生成 RGB-D 圖像。
實(shí)現
對于深度圖的每個(gè)像素,該函數使用像素的深度值來(lái)計算彩色圖像中的相應子像素坐標。 然后,我們將在彩色圖像中的此坐標處查找顏色值。 在彩色圖像中執行雙線(xiàn)性?xún)炔?,以獲取子像素精度的顏色值。 沒(méi)有關(guān)聯(lián)的深度讀數的像素將分配到輸出圖像中的 BGRA 值 [0,0,0,0]。 默認已為此函數啟用 GPU 加速。 由于此方法會(huì )在轉換的彩色圖像中產(chǎn)生孔洞,并且不會(huì )處理遮擋物,因此我們建議改用函數 k4a_transformation_depth_image_to_color_camera()。
參數
輸入參數是轉換句柄、深度圖像和彩色圖像。 深度圖像和彩色圖像的分辨率必須與創(chuàng )建轉換句柄時(shí)指定的 depth_mode 和 color_resolution 相匹配。 輸出是需要由用戶(hù)調用 k4a_image_create() 分配的已轉換彩色圖像。 已轉換的彩色圖像的分辨率必須與創(chuàng )建轉換句柄時(shí)指定的 depth_resolution 相匹配。 輸出圖像存儲四個(gè) 8 位值(表示每個(gè)像素的 BGRA)。 因此,圖像的步幅為 width * 4 * sizeof(uint8_t)。 數據順序為像素交錯式,即,藍色值 - 像素 0,綠色值 - 像素 0,紅色值 - 像素 0,alpha 值 - 像素 0,藍色值 - 1,依此類(lèi)推。
k4a_transformation_depth_image_to_point_cloud
概述
函數 k4a_transformation_depth_image_to_point_cloud() 將相機拍攝的 2D 深度圖轉換為同一相機的坐標系中的 3D 點(diǎn)云。 因此,相機可以是深度相機或彩色相機。
實(shí)現
該函數的結果與針對每個(gè)像素運行 k4a_calibration_2d_to_2d() 的結果相同,不過(guò)計算效率更高。 調用 k4a_transformation_create() 時(shí),我們會(huì )預先計算一個(gè)所謂的 xy 查找表,用于存儲每個(gè)圖像像素的 x 和 y 比例因子。 調用 k4a_transformation_depth_image_to_point_cloud() 時(shí),我們會(huì )通過(guò)將像素的 x 比例因子與像素的 Z 坐標相乘,來(lái)獲取像素的 3D X 坐標。 類(lèi)似地,與 y 比例因子相乘可以計算出 3D Y 坐標。 SDK 的快速點(diǎn)云示例 演示了如何計算 xy 表。 例如,用戶(hù)可以遵循示例代碼實(shí)現其自有版本的此函數,以加速其 GPU 管道。
參數
輸入參數是轉換句柄、相機說(shuō)明符和深度圖像。 如果相機說(shuō)明符設置為深度,則深度圖像的分辨率必須與創(chuàng )建轉換句柄時(shí)指定的 depth_mode 相匹配。 否則,如果說(shuō)明符設置為彩色相機,則分辨率必須與所選 color_resolution 的分辨率相匹配。 輸出參數是需要由用戶(hù)調用 k4a_image_create() 分配的 XYZ 圖像。 該 XYZ 圖像的分辨率必須與輸入的深度圖的分辨率相匹配。 我們將為每個(gè)像素存儲三個(gè)帶符號的 16 位坐標值(以毫米為單位)。 因此,XYZ 圖像步幅設置為 width * 3 * sizeof(int16_t)。 數據順序為像素交錯式,即,X 坐標 – 像素 0,Y 坐標 – 像素 0,Z 坐標 – 像素 0,X 坐標 – 像素 1,依此類(lèi)推。 如果無(wú)法將某個(gè)像素轉換為 3D,該函數將為該像素分配值 [0,0,0]。
示例
后續步驟
了解如何使用 Femto Bolt 3D 相機SDK 圖像轉換函數后,接下來(lái)還可以了解校準函數。