如果使用 FLIR 机器视觉相机构建您自己的立体视觉<

适用产品

所有 FLIR 机器视觉相机

应用说明简介

本技术应用指南旨在为您提供示例——如何利用两个 FLIR 机器视觉相机与 OpenCV 算法和 Spinnaker API 构建您自己的立体视觉。

概述

立体视觉是一种可以在非结构化的动态环境中提供全视场 3D 测量的成像技术。 数码相机图像中的每一个像素都在收集到达相机的光线和 3D 射线。 如果世界上有一种特征可以可标识为图像中的一个像素位置,我们知道这项特征就在与该像素相关的 3D 射线上。 如果我们使用多台相机,那么我们可以获得多个射线。 这些射线相交处就是该特征的 3D 位置。

在这个例子中,固定了两个相机,拍摄已知标定目标的图像。 消除这些图像的镜头畸变,校正这些图像。 对于密集立体算法,相机的图像通常必须重新映射到适合针孔相机模型的图像。 这种重新映射的图像被称为校正图像。 随后,通过一个算法发现图像中像素和特征的匹配,以确定视差。

视差是指左侧校正图像中的特征或像素块与右侧图像之间的像素差距。 视差越大意味着特征或物体越接近相机(成像平面),视差越小意味着物体越远离相机。 立体视觉利用视差计算距一个物体的距离。

PC 配置

  • Windows 7(64 位)
  • ASUS Z97-PRO 主板
  • Intel Core i7-4790 CPU @ 3.60Hz
  • 8 GB RAM

硬件设置

本应用指南中,在 THORLABS 支架上固定安装了两台相机,使用 Dovetail 轨道和 SLIK 三脚架确保两相机保持水平。 相机需牢固地固定在彼此相对的位置上。 微小的变化,特别是在纵轴中,将会偏离算法用于查找匹配的扫描线。 这种偏离可能导致质量较差的视差图。

相机:

  • 2 x BFS-U3-50S5C-C (固件版本1803.0.167.0)

镜头:

  • Fujinon DF6HA-1B 6 mm 镜头

安装固定设备:

  • THORLABS: https://www.thorlabs.com
    • AB90 和 AB90A/M 安装在 ACC-01-0011 三脚架接座上
    • 组合等效于使用的固定夹:
      • XT34C2 – 3 x
      • XT34D2-30 – 3 x
    • XT34DP-500 轨道(切短至 200 mm)
    • 相机通过 ACC-01-0003 适配器安装在 XT34D2-30 上
  • SLIK 450G 三脚架

使用的基线:7.88 cm(两个相机传感器中心间的距离)image001.png

软件要求

Visual Studio 2015

Spinnaker SDK 1.21.0.61 或以上版本

OpenCV 3.4(最低 3.4.3)https://org/releases.html

1. 下载 Win 包,然后将 OpenCV 安装到 “C:\OpenCV\build\x64\vc15”

2 环境变量

  • 添加/设置 “OPENCV_DIR” 为 “C:\OpenCV\build\x64\vc15”
  • 添加 “%OPENCV_DIR%\bin” 至路径

3. 在 Visual Studio 中配置 OpenCV

标定模板

本技术应用指南中,为立体标定打印出了一个棋盘模板。 OpenCV 插入每个角落的位置至亚像素水平。 然后,它使用这些位置来计算内部畸变、外部旋转以及相机相对彼此的平移的矩阵。 理想情况下,该模板应保存到位。 为了获得最大的标定视场范围,移近模板,或使用更大的模板。

棋盘模板下载:https://markhedleyjones.com/projects/calibration-checkerboard-collection.

使用棋盘模板的平方尺寸:3.0 cm x 3.0 cm.

image002.png

镜头调节

要实现立体视觉,图像需要有足够的细节,以便在校正图像中找到对应的像素。 镜头应聚焦在您的应用所需的大部分距离范围中。 靠近光圈可会增加视场的深度,因此焦点内有更大的距离范围,但是会降低达到传感器的光量。

为了在标定过程中获得满意结果,在 SpinView 中将 Exposure Auto(自动曝光)设置为 Off(关闭), 更改设置,使棋盘模板清晰显示,且白色方块不会过分曝光。 C++ 控制台应用程序生成标定文件后,可将 SpinView 中的增益和曝光设置为自动。

image003.png

配置好首选的曝光设置后,拧紧镜头上的调节钮保持对焦和光圈固定。

image004.jpg

如何显示实时视差图

1. 下载 opencv_stereo_vision.zip.

应将 opencv_stereo_vision 文件夹存放在与其他 Spinnaker 示例相同的文件夹位置。 此为 Spinnaker SDK 的 src 文件夹(源文件夹的默认位置为 C:\Program Files\Point Grey Research\Spinnaker\src)。

2 确认成功创建了 Stereo_Acquisition_vs2015.sln 文件,文件位于 opencv_stereo_vision\Example Code\src\Stereo_Acquisition 下。

3. 运行 opencv_stereo_vision.zip 文件中提供的Stereo_Acquisition_v140.exe。

image005.png

4 成功创建 Stereo_Acquisition_vs2015.sln 后,打开命令提示符,导航至 opencv_stereo_vision\Example Code\bin64\vs2015 文件夹。

5 输入命令:Stereo_Acquisition_v140.exe –帮助查看如何运行此程序的说明。

image006.png

注册获取更多类似文章

即刻注册

Calibrate Gather Images Mode(标定采集图像模式)

此模式用于采集相机标定需要的图像。 本程序中,用户输入时,每个相机都会由软件触发采集 6 张图像(共 12 张图像)。 这些图像之后会用于标定。 您可以使用以下命令设置图像将会存储的路径:

image007.png

image008.png

为了使 OpenCV 算法能够找到这些图像中的像素匹配或特征,务必要在 ROI(感兴趣区域)内的不同位置采集目标图像。

image009.png image010.png image011.png

 image012.png image013.png image014.png

注:这些是 6 张未修剪、未处理的示例图像,在运行 calibrate_gather_images 过程中直接由两台相机之一拍摄,将在 calibrate_calculate 中由 opencv 算法使用。

Calibrate Calculate Mode(标定计算模式)

此模式旨在对之前采集的图像进行计算,并生成标定数据。 执行 “calibrate_calculate” 模式时,会生成 3 个 .yml(标定)文件 - 2 个内部文件和 1 个外部文件。 这些标定文件的路径必须与标定图像保存的路径相同。 外部文件(约 3 KB)包含两台相机必需的矩阵和物理参数,以用于 OpenCV 中的立体视觉。

image015.png

Real Time Disparity Mode(实时视差模式)

此模式旨在创建和显示实时的视差图。

DepthMapping.cpp 中的 DepthMapping() 函数被调用(位置: C:\Program Files\Point Grey Research\Spinnaker\src\opencv_stereo_vision\Example Code\src\Stereo_Acquisition)以加载 calibrate_calculate 创建的外部文件,并显示视差图,如下所示:

image016.png

标定的物理特性

除了要采集用于计算视差深度的图像外,还需要一些物理特性。 Stereo_Acquisition_vs2015.sln 中使用的数据集为:

  • 模板尺寸(棋盘方块的尺寸):3 cm
  • 模板宽度(棋盘纵向内部方块边缘的数量):8
  • 模板高度(棋盘横向内部方块边缘的数量):6
  • 基线:7.88 cm(两个相机传感器中心间的距离)
  • 传感器宽度和高度 可使用传感器分辨率和像素大小找出。 例如,BFS-U3-50S5C-C 的分辨率为 2448 x 2048,像素大小为 3.45 um。 传感器宽度 = 0.00000345 * 2448 = 0.0084456 m = 0.84456 cm
  • image017.png

当建立您自己的立体视觉系统时,您需要根据自己相机的设置,更改这些值。 例如,这个例子中使用的基线时 7.88 cm。 但是,如果您的应用需要不同的基线,则可以在执行 Stereo_Acquisition_v140.exe mode = calibrate_calculate 时更改该值,如上所示。

注:示例中所有物理长度均使用厘米为单位。

显示视差图像

DepthMapping.cpp 文件中的 OpenCV StereoBM 和 StereoSGBM 算法用于提供 16 位的视差。 最后 4 位为小数,因此视差精确到 1/16 像素。 为了得到实际的浮点值,您需要将输出(短整型)分割为小数部分和整数部分,视作浮点数,并最终将其相加。

image018.png

分辨率特性

高分辨率不适用于 Stereo Block Matching(立体块匹配)算法,因为它们会大大增加处理的时间,无法实现实时视差计算。 高分辨率还需要更精准的标定。 1000 x 700 去掉 ¼ 像素并不明显。 但是,如果是 2400 x 2000 将会去掉近 1 个像素,则标定的精确度会大不相同。

理论上,较高的分辨率会得到较高精度的视差图,但实践上很难实现。 可以通过 Binning 降低分辨率,无需修改传感器尺寸计算。

标定序列

可通过 Stereo_Acquisition_vs2015.sln 完成标定序列:

1. 内部标定需首先完成,这涉及各个单独的相机。 其也被称为相机矩阵。 内部参数特定于一台相机,它们包含焦距和光学中心等信息。

image019.png

使用 Calib3d.cpp 中的 findCheckerboardCorners() 和 cornerSubPix() 进行内部标定。

2 随后,使用内部标定完成 stereoCalibration(),提供相关的外部信息。

最优化

标定设置默认为 Acquisition_vs2015.sln 中的硬编码 (C:\Program Files\Point Grey Research\Spinnaker\src\opencv_stereo_vision\Example Code\src\Stereo_Acquisition),以便在约 1000 x 800 分辨率顺利运行。 视差图中的立体掩膜尺寸和 ndisparitie 是最大的因素。 在“real_time_disparity”模式中执行 Stereo_Acquisition_v140.exe 时,通过滑块更改这些设置。

更改立体掩膜尺寸改变了像素块的大小,其在影像与 ndisparitie 间匹配,是视差值的范围。 物体越近需要的视差范围越大。

image020.png

结果

2 x BFS-U3-50S5C

2 x 6 mm 镜头 (Fujinon DF6HA-1B)

  • 7.88 cm 的基线
  • 棋盘方块的尺寸为 3.0 cm
  • 计算得到的传感器宽度和高度:0.84456 cm x 0.70656 cm

该设置可在 1.2 米远处检测精确到 2 毫米的变化。

注:示例中提供的默认值假设您准确地使用了此处记录的设置。