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

處理量測結果 (Stereo ace)#

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

概覽#

Basler Stereo ace 相機使用校正後的立體影像對來計算視差、誤差與信賴度影像。

校正後,可以確保物件點會投影至左側與右側影像中的相同列。然而,該點在右側影像中投影的行,總是會更靠左,亦即小於或等於左側影像中該點的行。視差是指右側與左側影像中行之間的差值,表示物件點距離相機的深度或距離。視差影像會儲存左側相機影像中所有像素的視差值。視差越大,表示物件點越近。視差為 0 表示物件點的投影位於相同的影像行,且物件點位於無限遠處。

有些因素會妨礙可靠地計算視差:

  • 遮擋: 遮擋是指右側相機無法看見的物件左側區域。這些區域處於「隱藏」狀態,因此無法判定視差。
  • 缺乏紋理: Stereo ace 的投射器可讓您建立紋理,但在極端情況下則例外,例如完全不反射任何光的全黑物件。

無法判定視差的像素會被指派 0 的視差值,藉此標記為無效。為了區分無效的視差量測與距離無限遠的物件之 0 視差量測,後者的視差值會設為大於 0 的最小可能視差值。

為了計算視差值,立體匹配演算法必須在左側與右側相機影像中尋找對應的物件點。這些點代表場景中的同一個物件點。為了進行立體匹配,Basler Stereo ace 使用了 SGM (Semi-Global Matching)。

計算深度影像與點雲#

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

資訊

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

假設 d16ik 是第 X 欄的 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 的值,即可將視差影像轉換為深度影像。

提示

您可以使用 chunk data,而不必直接讀取參數。這樣一來,3D 計算所需的資訊就會由 ChunkScan3dCoordinateScale, ChunkScan3dFocalLength, ChunkScan3dBaseline, ChunkScan3dPrincipalPointU的狀態,以及 ChunkScan3dPrincipalPointV chunk parameters 新增至每個影像中。若要啟用 chunk data,請設定 ChunkModeActive 參數設為 true。在讀取這些 chunk data 之前,您必須設定 ChunkComponentSelector 參數設為 Disparity.

計算距離#

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

$$ d = sqrt( x * x + y * y + z * z ) $$