從深度圖到點云的構(gòu)建方式
點擊上方“小白學(xué)視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達
本期我們將一起討論如何將RGBD圖像轉(zhuǎn)換為3D空間中的點

我們將介紹什么是相機的內(nèi)參矩陣,以及如何使用它將RGBD(紅色、藍色、綠色、深度)圖像轉(zhuǎn)換為3D空間。獲取RGBD圖像的方式有很多種,例如Kinect相機之類的系統(tǒng),這些系統(tǒng)通過測量紅外光的飛行時間來計算深度信息。但也有傳聞稱iPhone 12將LiDAR集成到其相機系統(tǒng)中。對于無人駕駛汽車而言,最重要的數(shù)據(jù)來源與汽車上的LiDAR以及標準RGB攝像頭。在本文中,我們不會詳細介紹如何獲取數(shù)據(jù)。

圖1 :(左)以u,v坐標表示的圖像平面。每個像素都有指定的顏色和深度。(右)笛卡爾坐標x,y,z中的3D視圖。
如果要了解3D環(huán)境中每個像素對應(yīng)的內(nèi)容,那么了解相機的屬性就非常重要。相機的關(guān)鍵參數(shù)之一是焦距,它幫助我們將像素坐標轉(zhuǎn)換為實際長度。大家可能看到過像“ 28 mm”這樣的焦距,這其實是鏡頭與膠片/傳感器之間的實際距離。
通過簡單的幾何關(guān)系(“相似的三角形”),我們可以輕松地從每個像素的u和d得出位置x。下圖僅顯示了x和u,但對y和v可以完全相同。對于針孔相機模型,x和y方向的焦距相同。對于帶鏡頭的相機這個結(jié)論可能就不一定成立了,我們將在以后的文章中對此進行討論。

圖2:顯示xz平面的投影(頂視圖)。左側(cè)是針孔照相機,鏡頭前有一個物體(從上方是相同的藍色球),并在屏幕上顯示。世界坐標系與照相機對齊,因此z軸延伸到照相機所看的方向。在右側(cè),從左側(cè)開始的兩個部分重疊的三角形分開以更加清楚。
從類似的三角方法中,我們立即獲得:

通常f?和f?是相同的。但是對于例如圖像傳感器的非矩形像素,鏡頭變形或圖像的后處理,它們可能會有所不同。
綜上所述,我們可以僅使用幾何參數(shù)編寫一段很短的Python代碼,以將屏幕的坐標系轉(zhuǎn)換為笛卡爾坐標系。
def convert_from_uvd(self, u, v, d):d *= self.pxToMetrex_over_z = (self.cx - u) / self.focalxy_over_z = (self.cy - v) / self.focalyz = d / np.sqrt(1. + x_over_z**2 + y_over_z**2)x = x_over_z * zy = y_over_z * zreturn x, y, z
在代碼中(c?,c?)是攝像機傳感器的中心。請注意相機屬性pxToMetre常數(shù),利用這些參數(shù)可以在一定比例尺下以3D形式精確地顯示圖片。
當(dāng)然,有一種更通用的方法可以完成所有這些操作。輸入內(nèi)參矩陣!這是一個包含先前討論的相機屬性(相機傳感器的焦距和中心以及偏斜)的單個矩陣。在這里,我們要討論如何使用它為我們完成上述轉(zhuǎn)換。在下文中,我們將大寫粗體字用于矩陣,將小寫粗體字用于矢量,將普通腳本用于標量。

接下來,我們介紹齊次坐標。齊次坐標有助于我們將各種不同變換(平移,旋轉(zhuǎn)和傾斜)編寫為具有相同維數(shù)的矩陣。
以這種方式考慮它。在圖2中,我們可以將圖像平面移動到任何其他距離,例如從f?→2f?,并注意我們將其平移的因子h = 2。移位引入了簡單的縮放比例,我們總是可以通過將u和v除以h作為返回值。

現(xiàn)在我們可以在齊次坐標上定義各種不同的操作,但是這些操作都保持最后一個維度值不變。
旋轉(zhuǎn)矩陣R,平移矢量t和本征矩陣K組成了相機投影矩陣。它定義為從世界坐標轉(zhuǎn)換為屏幕坐標:

注意[?R?|?t?]表示塊符號,表示我們將R和列向量t?= transpose {t?,t?,t 2}連接起來,或者換句話說,將其添加到R的右側(cè)。如果我們想以另一種方式進行轉(zhuǎn)換,則會遇到問題。我們對3x4矩陣求逆。但是大家會發(fā)現(xiàn)該矩陣的方陣擴展是可以求逆的。為此,我們必須在左側(cè)增加1 / z(視差)才能滿足方程式。4x4矩陣稱為滿秩本征/非本征矩陣。

讓我們用最簡單的情況驗證上面所說的:相機原點和世界原點對齊,即R和t可以忽略,偏斜S為0,圖像傳感器居中?,F(xiàn)在,相機矩陣的逆就是:

只看第一行就可以得出與開始時(方程1)完全相同的結(jié)論。使用等式的第二行和第三行對y和z同樣適用。對于更復(fù)雜的內(nèi)在矩陣,大家需要在進行此轉(zhuǎn)換之前計算逆。由于它是一個上三角矩陣,因此有很多簡單的辦法可以處理這個問題:

現(xiàn)在,我們擁有了將深度圖或RGBD圖像轉(zhuǎn)換為3D場景的所有工具,每個像素代表一個點(圖3)。我們在此過程中有一些假設(shè)。其中之一是簡化的相機模型:針孔相機。但是在現(xiàn)實世界中使用的相機會使用鏡頭,并且通常只能通過針孔模型進行估算。

圖3:根據(jù)深度圖(灰度)計算出的點云(綠色)
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~
