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