2D+3D捕获策略

请注意,如果您不关心颜色信息,请直接跳过本章节,查看下一章节: 根据捕获速度选择 3D 和 2D 的设置

单品拣选(piece-picking)应用中常用的许多检测算法依赖于 2D 数据来识别要拾取的对象。在本文中,我们将深入探讨获取 2D 信息的不同方法、它们的优缺点以及外部照明条件。我们还会讨论各种 2D-3D 方法、它们的数据质量以及它们如何影响周期时间。

获取2D数据有两种方法:

  1. 通过 camera.capture(Zivid::Settings2D).imageRGBA() 进行单独的 2D 捕获,请参阅 2D图像捕获流程

  2. 3D 捕获 camera.capture(Zivid::Settings).pointCloud.copyImageRGBA() 中的一部分,请参阅 点云捕获过程

使用哪一种方法取决于您的要求和机器视觉流程。我们通常建议使用单独的 2D 捕获,因为它可以更好地控制 2D 设置以实现颜色优化,并且可以利用多线程和优化调度。它还使您可以更加灵活地配置所需的相机分辨率和投影仪设置。利用 3D 捕获中的 2D 数据更简单,但您可能需要牺牲速度才能获得所需的 2D 质量。

小技巧

当您单独捕获 2D 时,您应该在 3D 捕获中禁用 RGB。这可以节省采集和处理时间。通过将 Sampling::Color 设置为 disabled 来禁用 3D 捕获中的 RGB。

我们的建议:
  • 单独的全分辨率 2D 捕获并打开投影仪。

  • 不包含颜色数据的子采样 3D 捕获。

相机分辨率和一对一映射

对于精确的 2D 分割和检测,高分辨率彩色图像很有帮助。 Zivid 2+ 具有 5 MPx 成像传感器,而 Zivid 2 具有 2.3 MPx 传感器。下表显示了不同相机的 2D 和 3D 捕获的分辨率输出。

2D 捕获辨率

2D 捕获

Zivid 2

Zivid 2+

全分辨率

1944×1200

2448×2048

2x2 子采样

972×600

1224×1024

4x4 子采样

不支持

612×512

3D 捕获分辨率

3D 捕获

Zivid 2

Zivid 2+

全分辨率 [1]

1944×1200

2448×2048

2x2 子采样 [1]

972×600

1224×1024

4x4 子采样 [1]

不支持

612×512

2D 和 3D 捕获的输出分辨率是由 Sampling::PixelProcessing::Resampling 设置的组合进行控制,详细内容请参阅 像素采样Resampling(重采样) 。这意味着 2D 像素和 3D 点之间可能不再具有 1:1 的对应关系。因此,从 2D 图像中的分割掩模中提取 3D 数据变得更加具有挑战性。

如上所述,分割和检测通常需要高分辨率 2D 数据。例如,我们推荐的 Consumer Goods(消费品) Z2+ M130 Quality 预设使用的 Sampling::Pixel 设置为 blueSubsample2x2 。在这种情况下,我们应该:

  • 对 3D 数据进行上采样,以恢复 1:1 对应关系,或

  • 将二维索引映射到子采样三维数据中的索引。

重采样(Resampling)

为了匹配 2D 捕获的分辨率,只需应用取消子采样的上采样即可。这样操作仍保留了子采样捕获的速度优势。例如:

auto settings2D = Zivid::Settings2D{
    Zivid::Settings2D::Acquisitions{ Zivid::Settings2D::Acquisition{} },
    Zivid::Settings2D::Sampling::Pixel::all,
};
auto settings = Zivid::Settings{
    Zivid::Settings::Engine::phase,
    Zivid::Settings::Acquisitions{ Zivid::Settings::Acquisition{} },
    Zivid::Settings::Sampling::Pixel::blueSubsample2x2,
    Zivid::Settings::Sampling::Color::disabled,
    Zivid::Settings::Processing::Resampling::Mode::upsample2x2,
};
settings_2d = zivid.Settings2D()
settings_2d.acquisitions.append(zivid.Settings2D.Acquisition())
settings_2d.sampling.pixel = zivid.Settings2D.Sampling.Pixel.all
settings = zivid.Settings()
settings.engine = "phase"
settings.acquisitions.append(zivid.Settings.Acquisition())
settings.sampling.pixel = zivid.Settings.Sampling.Pixel.blueSubsample2x2
settings.sampling.color = zivid.Settings.Sampling.Color.disabled
settings.processing.resampling.mode = zivid.Settings.Processing.Resampling.Mode.upsample2x2

更多相关的详细信息,请参阅 Resampling(重采样)

另一种选择是将 2D 索引映射到子采样 3D 数据中的索引。此方法稍微复杂一些,但可能更高效。点云可以保持子采样,因此消耗更少的内存和处理能力。

为了建立全分辨率 2D 图像与子采样点云之间的关联,需要一种特定的映射技术。此过程涉及从与拜耳网格中的蓝色或红色像素相对应的像素中提取 RGB 值。

Zivid::Experimental::Calibration::pixelMapping(camera, settings); 可用于获取执行此映射所需的参数。以下是使用此函数的示例。

const auto pixelMapping = Zivid::Experimental::Calibration::pixelMapping(camera, settings);
std::cout << "Pixel mapping: " << pixelMapping << std::endl;
cv::Mat mappedBGR(
    fullResolutionBGR.rows / pixelMapping.rowStride(),
    fullResolutionBGR.cols / pixelMapping.colStride(),
    CV_8UC3);
std::cout << "Mapped width: " << mappedBGR.cols << ", height: " << mappedBGR.rows << std::endl;
for(size_t row = 0; row < static_cast<size_t>(fullResolutionBGR.rows - pixelMapping.rowOffset());
    row += pixelMapping.rowStride())
{
    for(size_t col = 0; col < static_cast<size_t>(fullResolutionBGR.cols - pixelMapping.colOffset());
        col += pixelMapping.colStride())
    {
        mappedBGR.at<cv::Vec3b>(row / pixelMapping.rowStride(), col / pixelMapping.colStride()) =
            fullResolutionBGR.at<cv::Vec3b>(row + pixelMapping.rowOffset(), col + pixelMapping.colOffset());
    }
}
return mappedBGR;
pixel_mapping = calibration.pixel_mapping(camera, settings)
return rgba[
    int(pixel_mapping.row_offset) :: pixel_mapping.row_stride,
    int(pixel_mapping.col_offset) :: pixel_mapping.col_stride,
    0:3,
]

备注

如果您使用内部函数并且 2D 和 3D 捕获具有不同的分辨率,请确保正确地使用它们。请参阅 相机内参 了解更多信息。

关于外部光源的考量

2D 捕获的理想光源是强光源,因为它可以减少环境光的影响,并且最好是漫射光源,因为这会限制 光晕现象 。您可以使用内部投影仪或外部光源作为2D捕获的光源。第三种选择是不使用任何光源。

无论你选择什么,你都可能会遇到光晕现象。当使用内部投影仪作为光源时,倾斜相机、改变背景或调整 2D 采集设置可以减轻光晕效应。另一方面,如果使用外部光源,确保它是漫射光源或倾斜安装可能会有所帮助。请务必注意,外部光源会在 3D 数据中引入噪声,您应该在 3D 捕获期间停用它们。因此,使用外部光源会增加系统设置和机器视觉流程的复杂性

环境光变化(例如从白天到夜晚的过渡、门的打开和关闭或天花板照明的变化)引起的曝光变化对 2D 和 3D 数据的影响不同。对于 2D 数据,它们可能会影响分割性能,尤其是在特定数据集上进行训练时。对于 3D 数据,由于噪声水平不同,曝光变化可能会影响点云完整性。使用内部投影仪或外部漫射光有助于减少这些变化。

下表总结了不同选项在 2D 质量方面的优缺点。

内置投影仪

外部光源 [2]

环境光

机器人单元设置

简单的

复杂的

简单的

对环境光变化的适应能力

可以接受

良好

不良

2D图像出现光晕现象

可能

不太可能

可能

需要设置 2D 白平衡

可能

我们的建议:
  • 在打开内部投影仪的情况下进行单独的 2D 捕获

捕获策略

优化 3D 质量并不一定能为您带来满意的 2D 质量。因此,如果您依赖颜色信息,我们建议您进行单独的 2D 捕获。我们可以将其分解为您首先需要哪些数据。这为我们提供了以下三种策略:

  • 2D数据先于3D数据

  • 2D数据作为如何使用3D数据的一部分

  • 2D数据在使用3D数据之后

您应该采用哪种策略取决于您的机器视觉算法和流程。下面我们总结了不同策略的表现。如需更深入的了解和全面的 ZividBenchmarks,请参阅 2D+3D捕获策略

下表列出了不同的 2D+3D 捕获配置。它显示了它们在速度和质量方面的相对表现。

捕获周期

速度

2D质量

Zivid 2

Zivid 2+

较快

快速

最好

3D ➞ 2D / 2D ➞ 3D

快速

快速

最好

3D(启用 w/RGB)

最快

最快

良好

下表列出了不同硬件上的实际测量结果。这里我们使用了Fast Consumer Goods的预设设置进行3D捕获。

Zivid 2+

( Z2+ M130 Fast )

Zivid 2

( Z2 M70 Fast )

小技巧

如需在 PC 上测试不同的 2D-3D 策略,您可以运行 ZividBenchmark.cpp 示例,并使用从 YML 文件加载的设置。您可以在 示例 页面选择 C++ 选项查看说明。

在下一章节中,我们将介绍如何 基于捕获速度选择3D和2D设置

版本历史

SDK

变更

2.12.0

对于 Zivid 2+,2D 捕获的采集时间最多可减少 50%,3D 捕获的采集时间最多可减少 5%。请注意,Zivid One+已达到其生命周期终点,不再提供支持。

2.11.0

添加了对 redSubsample4x4blueSubsample4x4 的支持。