跳转到内容
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 参数至 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 参数至 true设置为。在读取这些 chunk data 之前,您必须将 ChunkComponentSelector 参数至 Disparity.

计算距离#

给定点的坐标 (x,y,z) (单位:毫米),该点到相机光学中心的距离可以使用以下公式计算:

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