處理測量結果 (Stereo ace)#
總覽#
Basler Stereo ace 相機使用校正後的立體影像對來計算視差、誤差與信賴度影像。
經過校正後,物體點保證會被投影到左右兩張影像的相同列中。然而,該點在右側影像中所投影的行,總是位於左側影像中該點同行的左側,即小於或等於左側影像中的行。視差是指右側與左側影像中行之間的差異,並表示物體點相對於相機的深度或距離。視差影像會儲存左側相機影像中所有像素的視差值。視差越大,表示物體點越近。視差為 0 表示物體點的投影位於相同的影像行中,且物體點位於無限遠處。
有些因素會妨礙視差的可靠計算:
- 遮蔽 (Occlusions): 遮蔽是指物體左側右側相機無法看見的區域。這些區域在視野中被「隱藏」,因此無法決定視差。
- 缺乏紋理 (Lack of texture): 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 是視差影像中位於行 i 與列 k 的 16 位元視差值,則以像素為單位的浮點視差 dik 給定如下公式:
$$ 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 參數新增至每個影像中。若要啟用 chunk data,請將 ChunkModeActive 參數設為 true設為啟用。在讀取這些 chunk data 之前,您必須將 ChunkComponentSelector 參數設為 Disparity.
計算距離#
給定一個點的座標 (x,y,z) (以 mm 為單位),該點到相機光學中心的距離可以使用以下公式計算:
$$ d = sqrt( x * x + y * y + z * z ) $$