2D+3D 捕获策略
Many detection algorithms commonly used in piece-picking applications rely on 2D data to identify which object to pick. This article explains the different ways to acquire that 2D data, their tradeoffs in data quality and cycle time, and how external lighting affects the result.
If you do not care about color information, skip ahead to selecting 3D and 2D settings based on capture speed.
获取 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 分割和检测,通常需要高分辨率 2D 数据。例如,我们推荐的 Consumer Goods(消费品) Z2+ MR130 Quality 预设使用的 Settings::Sampling::Pixel 设置为 by2x2 。在这种情况下,可以:
对 3D 数据进行上采样,以恢复 1:1 对应关系,或
将二维索引映射到子采样三维数据中的索引,或者
通过
frame.pointCloud().copyImageRGBA_SRGB()从点云获取 2D 数据
重采样(Resampling)
为了匹配 2D 捕获的分辨率,应用上采样(upsampling)以抵消子采样(subsampling)带来的分辨率变化。这样可以保留子采样捕获的速度优势。例如:
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 捕获具有不同的分辨率,请确保正确地使用它们。请参阅 相机内参 了解更多信息。
关于外部光源的考量
对于 2D 捕获而言,理想的光源应当是强光,因为它能降低环境光变化带来的影响;同时也应当是漫射光,因为这样可以限制 泛光效应(blooming effects)。
使用内置投影仪作为光源时,可能会出现泛光效应。倾斜相机、更换背景或调整 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++ 选项查看说明。
Next, see selecting 3D and 2D settings based on capture speed.
Version History
SDK |
变更 |
|---|---|
2.12.0 |
对于 Zivid 2+,2D 捕获的采集时间最多可减少 50%,3D 捕获的采集时间最多可减少 5%。请注意,Zivid One+ 已达到其生命周期终点,不再提供支持。 |
2.11.0 |
添加了对 |