跳转到内容
STAGING SERVER
DEVELOPMENT SERVER

处理测量结果 (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 acquisition mode 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 parameters 添加到每个图像中。若要启用 chunk data,请将 ChunkModeActive acquisition mode true。在读取这些 chunk data 之前,您必须设置 ChunkComponentSelector acquisition mode Disparity.

计算距离#

给定一个点的坐标 (x,y,z) (单位为 mm),该点到相机光学中心的距离可以通过以下公式计算:

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