跳至內容
測試伺服器
開發伺服器

處理測量結果(Stereo ace )#

本主題將說明如何處理BaslerStereo ace相機的測量結果。

總覽#

Basler 的Stereo ace 相機利用經校正的立體影像對,來計算視差、誤差及可信度影像。

經校正後,可確保物體點在左、右兩張影像中皆投影至同一行。然而,該點在右側影像中所投影的列位置,總是比左側影像中該點的列位置更靠左,也就是說,其列位置低於或等於左側影像中該點的列位置。視差即是左右兩張影像中列位置之間的差異,用以表示物體點與相機之間的深度或距離。 視差圖儲存了左側相機影像中所有像素的視差值。視差值越大,物體點就越靠近相機。視差值為 0 表示物體點的投影位於同一影像欄中,且該物體點位於無限遠處。

有幾個因素會妨礙對差異進行可靠的計算:

  • 遮擋:遮擋是指物體左側那些右側相機無法看見的區域。這些區域在視線中被「遮蔽」,因此無法計算其視差。
  • 缺乏紋理: Stereo ace 的投影機可讓您呈現紋理,但極特殊的情況除外,例如完全黑色的物體,此類物體已無法反射任何光線。

對於無法確定視差的像素,會將其視差值設為 0,並標記為無效。為了區分無效的視差測量值與位於無限遠處物體的視差測量值(其值為 0),後者的視差值會設為大於 0 的最小可能視差值。

為了計算視差值,立體配對演算法必須在左、右相機影像中找出對應的物體點。這些點代表場景中同一個物體點。在立體配對方面,Basler 的Stereo ace 採用 SGM(半全局配對)演算法。

深度影像與點雲的計算#

差異圖包含 16 位元無符號整數值。這些值必須乘以在 Scan3dCoordinateScale 用於取得視差值的參數 d 以像素為單位。要根據視差值計算 3D 物體的座標,需要焦距、基線以及主點。這些參數可在 Scan3dFocalLength, Scan3dBaseline, Scan3dPrincipalPointU以及 Scan3dPrincipalPointV 特性。焦距與主點取決於所選元件的影像解析度。只要知道這些數值,即可將像素座標與視差轉換為相機座標系中的 3D 物體座標。

資訊

閱讀前 Scan3dFocalLength, Scan3dBaseline, Scan3dPrincipalPointU以及 Scan3dPrincipalPointV, 您必須設定 ComponentSelector 參數設為 Disparity 因為這些數值取決於元件。

假設 d16ik 是第 列處的 16 位元視差值 i 以及行 k 視差圖中的浮點數視差值 d(單位為像素)ik 由以下公式給出:

$$ d_{ik}=d16_{ik} \cdot \mathrm{Scan3dCoordinateScale} $$

以公尺為單位的 3D 重建可透過以下參數來表示:

$$ P_x=\left(i+0.5-\mathrm{Scan3dPrincipalPointU}\right) \frac{\mathrm{Scan3dBaseline}}{d_{ik}}\ $$

$$ P_y=\left(k+0.5-\mathrm{Scan3dPrincipalPointV}\right) \frac{\mathrm{Scan3dBaseline}}{d_{ik}}\ $$

$$ P_z=\mathrm{Scan3dFocalLength} \frac{\mathrm{Scan3dBaseline}}{d_{ik}} $$

由視差圖計算出的所有物體點所構成的集合即為點雲,可用於 3D 建模應用。透過將每個像素中的視差值替換為Pz 的值,即可將視差圖轉換為深度圖。

提示

與其直接讀取參數,您也可以使用區塊資料。這樣一來,3D 運算所需的資訊就會由 ChunkScan3dCoordinateScale, ChunkScan3dFocalLength, ChunkScan3dBaseline, ChunkScan3dPrincipalPointU以及 ChunkScan3dPrincipalPointV 區塊參數。若要啟用區塊資料,請設定 ChunkModeActive 參數設為 true. 在讀取這些區塊資料之前,您必須設定 ChunkComponentSelector 參數設為 Disparity.

計算距離#

給定一個點的座標 (x,y,z) (以 mm 為單位),該點到相機光學中心的距離可以使用以下公式計算:

$$ d = \sqrt{x \cdot x + y \cdot y + z \cdot z} $$