天天看點

從深度圖到點雲

從深度圖到點雲

如何将 RGBD 圖像轉換為 3D 空間中的點

本教程介紹了内在矩陣,并引導您了解如何使用它來将 RGBD(紅色、藍色、綠色、深度)圖像轉換為 3D 空間。RGBD 圖像可以通過多種方式獲得。例如,來自使用基于紅外線的飛行時間檢測的 Kinect 這樣的系統。但也有傳言稱 iPhone 12 在其相機系統中內建了 LiDAR。對于自動駕駛汽車來說最重要的是:來自汽車移動裝置的 LiDAR 資料可以與标準 RGB 攝像頭結合以獲得 RGBD 資料。我們不會在本文中詳細介紹如何擷取資料。

從深度圖到點雲

圖 1:(左)u、v 坐标中的圖像平面。每個像素都有指定的顔色和深度。(右)笛卡爾坐标 x、y、z 中的 3D 視圖。

如果您想了解 3D 環境中每個像素對應的内容,了解您的相機的屬性非常重要。最重要的參數是焦距。它告訴我們如何将像素坐标轉換為長度。您可能已經見過像“28 mm”這樣的焦距。這是鏡頭和膠片/傳感器之間的實際距離。

從一個簡單的幾何參數(“相似三角形”),我們可以很容易地從每個像素的 u 和 d 推導出位置 x。下圖隻是檢視 x 和 u,但我們可以對 y 和 v 做完全相同的操作。對于針孔相機模型,x 和 y 方向的焦距相同。對于帶鏡頭的相機,情況并非總是如此,我們将在以後的文章中讨論這一點。

從深度圖到點雲

圖 2:顯示 xz 平面的投影(頂視圖)。在左邊,一個針孔相機,在相機前面有一個物體(從上面看同一個藍色球)并在螢幕上顯示。世界坐标系與相機對齊,以便 z 軸延伸到相機正在觀察的方向。在右側,為了更清晰起見,将左側的兩個部分重疊的三角形分開。

從相似三角形方法我們立即得到:

從深度圖到點雲

通常 fₓ 和 fᵧ 是相同的。它們可能不同,例如對于圖像傳感器的非矩形像素、鏡頭失真或圖像後處理。

綜上所述,我們可以編寫一段非常短的 Python 代碼,僅使用幾何參數将螢幕坐标系轉換為笛卡爾坐标系。

def convert_from_uvd(self, u, v, d):
    d *= self.pxToMetre
    x_over_z = (self.cx - u) / self.focalx
    y_over_z = (self.cy - v) / self.focaly
    z = d / np.sqrt(1. + x_over_z**2 + y_over_z**2)
    x = x_over_z * z
    y = y_over_z * z
    return x, y, z      

在代碼中 (cₓ, cᵧ) 是相機傳感器的中心。請注意常量 pxToMetre,這是一個相機屬性,您可以确定焦距是否以米和像素為機關已知。即使沒有它,圖檔也能準确地以 3D 表示,達到一定的比例因子。

當然,還有一種更通用的方法可以做到這一切。輸入内在矩陣!一個單一的矩陣,它結合了之前讨論的相機屬性(焦距和相機傳感器的中心以及偏斜)。閱讀這篇關于它的優秀文章以擷取更多資訊。在這裡,我們想讨論一下如何使用它來為我們做上述轉換。下面我們将使用大寫粗體表示矩陣,小寫粗體表示向量,普通腳本表示标量。

從深度圖到點雲

接下來,我們介紹齊次坐标。齊次坐标将幫助我們将變換(平移、旋轉和傾斜)寫成具有相同次元的矩陣。

這樣想。在圖 2 中,我們可以将圖像平面移動到任何其他距離,例如從 fₓ → 2fₓ 并注意我們将其移動的因子 h=2。移位引入了一個簡單的縮放,我們總是可以通過将 u 和 v 除以 h 來回到原來的狀态。

從深度圖到點雲

現在我們可以對齊次坐标進行任何操作,而我們保持最後一個次元不變。所有操作都被定義為最後一個元件不變。

旋轉矩陣R、平移向量t和内在矩陣K構成了相機投影矩陣。它被定義為從世界坐标轉換為螢幕坐标:

從深度圖到點雲

等式 4:将世界坐标轉換為用齊次坐标寫入的圖像平面坐标。

請注意 [ R | t ] 指的是塊符号,這意味着我們将R和列向量t =transpose{t₀,t₁,t₂} 連接配接起來,或者換句話說,将它添加到R的右側。

如果我們想以相反的方式進行轉換,我們就會遇到問題。我們無法反轉 3x4 矩陣。在文獻中,您會發現方陣的擴充,它允許我們求逆。為此,我們必須在左側添加 1/z(視差)以滿足等式。4x4 矩陣稱為滿秩内部/外部矩陣。

從深度圖到點雲

讓我們用最簡單的情況來驗證我們上面所說的:相機原點和世界原點對齊,即R和t可以忽略,偏斜S為0,圖像傳感器居中。現在相機矩陣的逆很簡單:

從深度圖到點雲

等式 6:投影矩陣最簡單的情況

僅檢視第一行就會得出與我們在開頭(等式 1)中發現的完全相同的結論。同樣适用于使用方程的第二行和第三行的 y 和 z。6、分别。對于更複雜的内在矩陣,您需要在進行此轉換之前計算逆矩陣。由于它是一個上三角矩陣,是以有一個簡單的解析解:

從深度圖到點雲

公式7:逆Ø ˚F ķ所有元件。

現在您擁有了将深度圖或 RGBD 圖像轉換為 3D 場景的所有工具,其中每個像素代表一個點(圖 3)。我們在此過程中做出了一些假設。其中之一是簡化的相機模型:針孔相機。然而,您在現實世界中使用的相機使用鏡頭,并且通常隻能通過針孔模型來近似。在本系列的下一篇文章中,我們将探讨鏡頭對這種轉換的差異和影響。

從深度圖到點雲

圖 3:根據深度圖(灰階)計算的點雲(綠色)