2D+3D 捕获策略
请注意,如果您不关心颜色信息,请直接跳过本章节,查看下一章节: 根据捕获速度选择 3D 和 2D 的设置 。
单品拣选(piece-picking)应用中常用的许多检测算法依赖于 2D 数据来识别要拾取的对象。在本文中,我们将深入探讨获取 2D 信息的不同方法、它们的优缺点以及外部照明条件。我们还会讨论各种 2D-3D 方法、它们的数据质量以及它们如何影响周期时间。
获取2D数据有两种方法:
通过
camera.capture2D(Zivid::Settings).imageRGBA()进行单独的 2D 捕获,请参阅 2D图像捕获流程 。3D 捕获
camera.capture2D3D(Zivid::Settings).pointCloud().copyImageRGBA()中的一部分,请参阅 点云捕获过程 。
使用哪种方法取决于您的要求和机器视觉流程。我们通常建议使用单独的 2D 捕获,因为它可以利用多线程和优化调度。利用 3D 捕获中的 2D 数据更简单,但您可能需要牺牲速度才能获得所需的 2D 质量。
小技巧
当您单独捕获 2D 时,您应该在 3D 捕获中禁用 RGB。这可以节省采集和处理时间。通过将 Sampling::Color 设置为 disabled 来禁用 3D 捕获中的 RGB。
- 我们的建议:
单独的全分辨率 2D 捕获并打开投影仪。
不包含颜色数据的子采样 3D 捕获。
相机分辨率和一对一映射
对于精确的 2D 分割和检测,高分辨率彩色图像很有帮助。 Zivid 3 配备了 800 万像素成像传感器,Zivid 2+ 配备了 500 万像素传感器,而 Zivid 2 则配备了 230 万像素传感器。下表显示了不同相机的 2D 和 3D 捕获的分辨率输出。
2D 捕获 |
Zivid 3 |
Zivid 2+ |
Zivid 2 |
|---|---|---|---|
全分辨率 |
2816 x 2816 |
2448×2048 |
1944×1200 |
2x2 子采样 |
1408 x 1408 |
1224×1024 |
972×600 |
4x4 子采样 |
704 x 704 |
612×512 |
不支持 |
3D 捕获 |
Zivid 3 |
Zivid 2+ |
Zivid 2 |
|---|---|---|---|
全分辨率 |
2816 x 2816 |
2448×2048 |
1944×1200 |
2x2 子采样 |
1408 x 1420 |
1224×1024 |
972×600 |
4x4 子采样 |
704 x 704 |
612×512 |
不支持 |
执行 capture2D3D() 捕获时,结果是包含 2D 和 3D 数据的 frame 。
2D 数据可以通过两种方式提取:
frame.frame2D().imageRGBA_SRGB()这与您单独捕获 2D 是一样的。
frame.pointCloud().copyImageRGBA_SRGB()这可以确保即使将 2D 和 3D 设置为具有不同分辨率的情况下,它们也是 1:1 映射的。
2D 捕获的输出分辨率通过 Settings2D::Sampling::Pixel 控制,3D 捕获的输出分辨率通过 Settings::Sampling::Pixel 和 Settings::Processing::Resampling 的设置组合来控制。请参阅 像素采样 (2D) 、 像素采样 (3D) 和 Resampling(重采样) 。
如上所述,分割和检测通常需要高分辨率 2D 数据。例如,我们推荐的 Consumer Goods(消费品) Z2+ MR130 Quality 预设使用的 Sampling::Pixel 设置为 by2x2 。在这种情况下,我们应该:
对 3D 数据进行上采样,以恢复 1:1 对应关系,或
将二维索引映射到子采样三维数据中的索引,或者
通过
frame.pointCloud().copyImageRGBA_SRGB()从点云获取 2D 数据
重采样(Resampling)
为了匹配 2D 捕获的分辨率,只需应用上采样即可抵消子采样。这样操作仍保留了子采样捕获的速度优势。例如:
auto settings2D = Zivid::Settings2D{
Zivid::Settings2D::Acquisitions{ Zivid::Settings2D::Acquisition{} },
Zivid::Settings2D::Sampling::Pixel::all,
};
auto settings = Zivid::Settings{
Zivid::Settings::Engine::stripe,
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 = "stripe"
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 捕获具有不同的分辨率,请确保正确地使用它们。请参阅 相机内参 了解更多信息。
关于外部光源的考量
The ideal light source for a 2D capture is strong, because it reduces the influence of varying ambient light, and diffuse, because this limits the blooming effects. For Zivid cameras, this light source comes from the internal projector. Therefore, you do not need any additional lighting in your robot cell.
使用内置投影仪作为光源时,可能会出现光晕现象。倾斜相机、更换背景或调整 2D 采集设置可以减轻光晕效应。
环境光变化(例如从白天到夜晚的过渡、门的打开和关闭或屋顶照明的变化)引起的曝光变化对 2D 和 3D 数据的影响不同。对于 2D 数据,它们会影响分割性能,尤其是在特定数据集上进行训练时。对于 3D 数据,由于噪声水平不同,曝光变化可能会影响点云的完整性。Zivid 相机对此类曝光变化非常稳健。
下表总结了使用 Zivid 相机在 2D 质量方面的优缺点。
内置投影仪 |
|
|---|---|
机器人单元设置 |
简单 |
对环境光变化的适应能力 |
强 |
2D图像出现光晕现象 |
可能 |
需要设置 2D 白平衡 |
否 |
捕获策略
根据您首先需要哪种数据(2D 或 3D),有三种捕获策略。
2D数据先于3D数据
2D数据作为如何使用3D数据的一部分
2D数据在使用3D数据之后
您应该采用哪种策略取决于您的机器视觉算法和流程。我们建议先处理 2D 数据,然后再处理 3D 数据(先进行 2D 捕获,然后禁用颜色信息进行 3D 捕获)。这种方法允许您在捕获 3D 数据的同时处理彩色图像(例如分割),从而实现系统级的最佳拾取率。
下面我们总结了不同策略的表现。如需更深入地了解和全面的 ZividBenchmarks,请参阅 2D+3D捕获策略 。
下表显示了不同硬件上的实际测量结果。
- Zivid 3
(
Z3 XL250 Fast)- Zivid 2+
(
Z2+ LR110 Fast)(
Z2+ L110 Fast)- Zivid 2
(
Z2 M70 Matte)
小技巧
如需在 PC 上测试不同的 2D-3D 策略,您可以运行 ZividBenchmark.cpp 示例,并使用从 YML 文件加载的设置。您可以在 示例 页面选择 C++ 选项查看说明。
在下一章节中,我们将介绍如何 基于捕获速度选择3D和2D设置 。
版本历史
SDK |
变更 |
|---|---|
2.12.0 |
对于 Zivid 2+,2D 捕获的采集时间最多可减少 50%,3D 捕获的采集时间最多可减少 5%。请注意,Zivid One+已达到其生命周期终点,不再提供支持。 |
2.11.0 |
添加了对 |