处理测量结果 (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 ) $$