社群計算機視覺課程文件

引言

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

介紹

本節解釋了立體視覺的工作原理以及如何使用它來找到周圍物體的三維結構。立體視覺涉及從不同的位置和視角捕獲同一場景的兩張或更多影像。這些影像可以使用多個攝像頭或透過重新定位同一攝像頭獲得。

問題陳述

讓我們透過理解影像形成的幾何原理來理解尋找物體三維結構的問題。如圖1所示,我們有一個三維空間中的點P,其座標為x、y、z。點P透過針孔投影到相機的影像平面上。這也可以看作是將一個三維點投影到一個二維影像平面上。

現在,假設我們給定這個二維影像以及點P在該影像中的畫素座標位置。我們想找到點P的三維座標。這可能嗎?點P是唯一的嗎,或者是否有其他三維點也對映到與點P相同的畫素座標?答案是,所有位於連線點P和針孔的線上的三維點都將對映到二維影像平面中的相同畫素座標。

我們的目標是解決確定物體三維結構的問題。在我們的問題陳述中,我們可以將三維物體表示為一組三維點。找到這些點的三維座標有助於我們確定物體的三維結構。

Figure 1: Image formation using single camera

圖1:使用單個相機進行影像形成

解決方案

我們假設給定以下資訊:

  1. 場景點P的單張影像
  2. 影像中點P的畫素座標
  3. 用於捕獲影像的相機的位置和方向。為了簡單起見,我們也可以在針孔位置放置一個XYZ座標系,Z軸垂直於影像平面,X軸和Y軸平行於影像平面,如圖1所示。
  4. 相機的內部引數,例如焦距和主點位置。主點是光軸與影像平面的交點。其在影像平面中的位置通常表示為 (Ox,Oy)。

有了以上資訊,我們可以找到一條三維直線,該直線源於點P的畫素座標(點P在影像平面上的投影),穿過針孔,並延伸到無窮遠。根據影像形成幾何的原理,我們可以得出結論,點P必須存在於這條線上。

  1. 最初(沒有影像),點 P 可能存在於三維空間中的任何位置。
  2. 使用單張影像,我們將點 P 的可能位置縮小到三維空間中的一條直線。
  3. 現在,讓我們考慮是否可以進一步縮小潛在位置,以精確定位點 P 在這條三維直線上的位置。
  4. 想象將相機移動到不同的位置。讓座標系保持在先前的位置固定。我們發現的三維線也保持不變,點 P 仍然位於這條線上的某個位置。
  5. 從這個新的相機位置,捕獲同一場景點P的另一張影像。再次利用這張新影像中點P的畫素座標,並考慮更新後的相機針孔位置,找到點P必須位於其上的三維線。
  6. 現在我們有兩條三維線,點 P 位於這兩條線上的某個位置。因此,點 P 必然位於這兩條線的交點上。

給定三維空間中的兩條直線,它們的交點有三種可能性:

  1. 恰好相交於1點
  2. 相交於無限多個點
  3. 不相交

如果兩張影像(原始和新相機位置)都包含點P,我們可以得出結論,這兩條三維線必須至少相交一次,並且交點就是點P。此外,只有當兩條線共線時,我們才能設想有無限個點相交。這種情況發生在新相機位置的針孔位於原始三維線上。對於新相機位置的所有其他位置和方向,這兩條三維線必須精確地相交於一個點,即點P所在的位置。

因此,使用同一場景點P的兩張影像、已知的相機位置和方向以及已知的相機內部引數,我們可以精確地找到點P在三維空間中的位置。

簡化解決方案

由於相機位置和方向有許多不同的選擇,我們可以選擇一個能使數學更簡單、更不復雜、並減少在計算機或嵌入式裝置上執行時計算處理的位置。一種流行且常用的配置如圖2所示。在此配置中,我們使用2個相機,這相當於使用單個相機從2個不同位置捕獲2張影像。

Figure 2: Image formation using 2 cameras

圖2:使用2個相機進行影像形成

  1. 座標系的原點放置在第一個相機(通常是左相機)的針孔處。
  2. 座標系的Z軸垂直於影像平面。
  3. 座標系的X軸和Y軸平行於影像平面。
  4. 我們還有一個二維影像中的X和Y方向。X是水平方向,Y是垂直方向。我們將影像平面中的這些方向分別稱為u和v。因此,一個點的畫素座標用(u,v)值表示。
  5. 座標系的X軸定義為影像平面中的u方向/水平方向。
  6. 類似地,座標系的Y軸定義為影像平面中的v方向/垂直方向。
  7. 第二個相機(更確切地說是第二個相機的針孔)放置在距離第一個相機右側的x正方向上,距離為b,稱為基線。因此,第二個相機針孔的x、y、z座標為(b,0,0)。
  8. 第二個相機的影像平面與第一個相機的影像平面平行。
  9. 第二/右相機的影像平面中的 u 和 v 方向與第一/左相機的影像平面中的 u 和 v 方向對齊。
  10. 左右相機均假定具有相同的內部引數,例如焦距和主點位置。

在上述配置下,我們有以下方程式將三維空間中的點對映到二維影像平面。

  1. 左相機
    1. u_left=f_xxz+O_xu\_left = f\_x * \frac{x}{z} + O\_x
    2. v_left=f_yyz+O_yv\_left = f\_y * \frac{y}{z} + O\_y
  2. 右相機
    1. u_right=f_xxbz+O_xu\_right = f\_x * \frac{x-b}{z} + O\_x
    2. v_right=f_yyz+O_yv\_right = f\_y * \frac{y}{z} + O\_y

上述方程中使用的不同符號定義如下:

  • u_leftu\_left,v_leftv\_left指點P在左圖中的畫素座標。
  • u_rightu\_right, v_rightv\_right指點P在右圖中的畫素座標。
  • f_xf\_x指在X方向上的焦距(以畫素為單位),f_yf\_y指的是Y方向上的焦距(以畫素為單位)。實際上,相機只有一個焦距,它是針孔(透鏡的光學中心)到影像平面的距離。然而,畫素可能是矩形的,而不是完美的正方形,這導致當我們以畫素表示f時,fx和fy的值不同。
  • x、y、z 是點 P 的三維座標(可以使用任何單位,如釐米、英尺等)。
  • O_xO\_xO_yO\_y指主點的畫素座標。
  • b 稱為基線,指左右相機之間的距離。b 和 x,y,z 座標使用相同的單位(任何單位,如釐米、英尺等)。

我們有上面4個方程和3個未知數——3D點P的x、y、z座標。內參相機引數——焦距和主點被認為是已知的。方程1.2和2.2表明,左右影像中的v座標值是相同的。

  1. v_left=v_rightv\_left = v\_right

使用公式1.1、1.2和2.1,我們可以推匯出點P的x、y、z座標。

  1. x=b(u_leftO_x)u_leftu_rightx = \frac{b * (u\_left - O\_x)}{u\_left - u\_right}
  2. y=bf_x(v_leftO_y)f_y(u_leftu_right)y = \frac{b * f\_x * (v\_left - O\_y)}{ f\_y * (u\_left - u\_right)}
  3. z=bf_xu_leftu_rightz = \frac{b * f\_x}{u\_left - u\_right}

請注意,由於座標系原點與左相機對齊,因此上述 x 和 y 值與左相機相關。上述方程式表明,我們可以使用從兩個不同相機位置捕獲的點 P 的兩張影像來找到其三維座標。z 值也稱為深度值。透過這種技術,我們可以找到影像中不同畫素的深度值以及它們在真實世界中的 x 和 y 座標。我們還可以找到影像中不同點之間的真實世界距離。

演示

設定

我們將透過一個例子進行操作,捕獲一些影像,並進行一些計算,以確定我們的假設和數學是否成立!為了捕獲影像,我們將使用名為 OAK-D Lite(OAK 代表 OpenCV AI Kit)的硬體裝置。該裝置有3個攝像頭——左右單色(黑白)和中央彩色攝像頭。我們將使用左右單色攝像頭進行實驗。普通的智慧手機攝像頭也可以使用,但 OAK-D Lite 具有以下優勢。

  • OAK-D Lite 的相機內部引數,如焦距和主點位置是已知的,因為該裝置出廠前已預校準,並且這些引數可以透過其 Python API 讀取。對於智慧手機相機,內部引數需要確定,可以透過相機校準或有時存在於智慧手機捕獲影像的元資料中。
  • 上述主要假設之一是左右相機的位置和方向是已知的。使用智慧手機相機,可能難以確定此資訊或需要額外的校準。另一方面,對於 OAK-D Lite 裝置,左右相機的位置和方向是固定的、已知的、預校準的,並且與上述簡化解決方案的幾何形狀非常相似。儘管如此,仍需要對原始影像進行一些後處理/影像校正,詳見下文。

原始左右影像

OAK-D Lite 中的左右攝像頭定向與上述簡化解決方案的幾何結構相似。左右攝像頭之間的基線距離為 7.5 釐米。使用該裝置捕獲的場景左右影像如下所示。圖中還顯示了這些影像水平堆疊,並繪製了一條恆定高度(即 v 值恆定)的紅線。我們將水平 x 軸稱為 u,垂直 y 軸稱為 v。

原始左圖

Raw Left Image

原始右圖

Raw Right Image

原始堆疊左右影像

Raw Stacked Left and Right Images

讓我們關注一個點——筆記型電腦的左上角。根據上述公式 3,v_left=v_rightv\_left = v\_right左右影像中的相同點。但是,請注意,紅色線條(其 v 值恆定)在左影像中觸及筆記型電腦的左上角,但在右影像中卻偏離該點幾個畫素。造成這種差異的原因有兩個:

  • 左右相機的固有引數不同。左相機的主點位於 (319.13, 233.86),而右相機的主點位於 (298.85, 245.52)。左相機的焦距為 450.9,而右相機的焦距為 452.9。左右相機的 fx 值都等於 fy。這些固有引數是從裝置透過其 Python API 讀取的,不同的 OAK-D Lite 裝置可能有所不同。
  • 左右相機方向與上述簡化方案的幾何形狀略有不同。

校正後的左右影像

我們可以進行影像校正/後處理來糾正左右相機固有引數和方向的差異。這個過程涉及執行 3x3 矩陣變換。在 OAK-D Lite API 中,立體節點執行這些計算並輸出校正後的左右影像。詳細資訊和原始碼可以在此處檢視。在此特定實現中,固有引數的校正使用固有相機矩陣執行,方向的校正使用左右相機的旋轉矩陣(校準引數的一部分)執行。校正後的左影像被變換,就好像左相機具有與右相機相同的固有引數一樣。因此,在我們隨後的所有計算中,我們將使用右相機的固有引數,即焦距 452.9,主點位於 (298.85, 245.52)。在下面的校正和堆疊影像中,請注意恆定 v 處的紅線同時觸及左右影像中筆記型電腦的左上角。

校正後的左影像

Rectified Left Image

校正後的右影像

Rectified Right Image

校正並堆疊後的左右影像

Rectified and Stacked Left and Right Images

我們再將校正後的左右影像疊加,看看它們之間的差異。我們可以看到,左右影像中不同點的 v 值基本保持不變。但是,u 值發生了變化,這種 u 值的差異有助於我們根據上述公式 6 找到場景中不同點的深度資訊。這種“u”值的差異u_leftu_rightu\_left - u\_right被稱為視差,我們可以注意到,相機附近點的視差比遠處的點更大。深度 z 和視差u_leftu_rightu\_left - u\_right如公式 6 所示,它們成反比。

校正和重疊的左右影像

Rectified and Overlapped Left and Right Images

帶註釋的左右校正影像

我們來找出場景中某些點的三維座標。如圖所示,一些點被選中並手動標註了它們的 (u,v) 值。除了手動標註,我們還可以使用基於模板的匹配、SIFT 等特徵檢測演算法來查詢左右影像中的對應點。

帶註釋的左影像

Annotated Left Image

帶註釋的右影像

Annotated Right Image

3D 座標計算

選擇了場景中的十二個點,並在下表中列出了它們在左右影像中的 (u,v) 值。使用公式4、5和6,這些點的 (x,y,z) 座標也已計算並列在下表中。X和Y座標與左相機有關,原點位於左相機的針孔(或透鏡的光學中心)處。因此,針孔左側和上方的3D點分別具有負的X和Y值。

u_leftu\_left v_leftv\_left u_rightu\_right v_rightv\_right 深度/z(釐米) x_wrt_leftx\_wrt\_left y_wrt_lefty\_wrt\_left
點1 138 219 102 219 94.36 -33.51 -5.53
點2 264 216 234 217 113.23 -8.72 -7.38
點3 137 320 101 321 94.36 -33.72 15.52
點4 263 303 233 302 113.23 -8.97 14.37
點5 307 211 280 211 125.81 2.26 -9.59
點6 367 212 339 212 121.32 18.25 -8.98
點7 305 298 278 298 125.81 1.71 14.58
點8 365 299 338 299 125.81 18.37 14.86
點9 466 225 415 225 66.61 24.58 -3.02
點10 581 225 530 226 66.61 41.49 -3.02
點11 464 387 413 388 66.61 24.29 20.81
點12 579 388 528 390 66.61 41.2 20.95

尺寸計算和精度

我們還可以使用公式計算不同點之間的三維距離:distance=(x_2x_1)2+(y_2y_1)2+(z_2z_1)2distance = \sqrt{(x\_2 - x\_1)^2 + (y\_2 - y\_1)^2 + (z\_2 - z\_1)^2}. 下表列出了計算出的某些點之間的距離以及它們的實際測量值。百分比誤差((actualmeasured)100actual( \frac{(actual-measured) * 100}{actual}) 也已計算並列出。請注意,計算值與實際值非常吻合,百分比誤差為 1.2% 或更小。

維度 計算值 (釐米) 實際值 (釐米) % 誤差
d1(1-2) 31.2 31.2 0
d2(1-3) 21.1 21.3 0.94
d3(5-6) 16.6 16.7 0.6
d4(5-7) 24.2 24 0.83
d5(9-10) 16.9 16.7 1.2
d6(9-11) 23.8 24 0.83

計算尺寸結果
Calculated Dimension Results

結論

  1. 總而言之,我們學習了立體視覺的工作原理,用於找到給定點 P 的兩個不同視角影像的真實世界座標 (x, y, z) 的方程,並將理論值與實驗結果進行了比較。
  2. 我們假設相機內部引數——焦距和主點——以及它們的位置和方向資訊都是已知的。這也被稱為校準立體視覺。
  3. 有趣的是,即使相機的位置和方向未知,也可以找到點P的三維座標。實際上,相機之間相對位置和方向可以透過影像本身來確定。這被稱為未校準立體視覺!

參考文獻

  1. 三維重建 - 多視角 Coursera
  2. 使用OpenCV AI Kit進行立體視覺和深度估計 LearnOpenCV
  3. OAK-D Lite Luxonics
< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.