2D+3D捕获策略
请注意,如果您不关心颜色信息,请直接跳过本章节,查看下一章节: 根据捕获速度选择 3D 和 2D 的设置 。
单品拣选(piece-picking)应用中常用的许多检测算法依赖于 2D 数据来识别要拾取的对象。在本文中,我们将深入探讨获取 2D 信息的不同方法、它们的优缺点以及外部照明条件。我们还会讨论各种 2D-3D 方法、它们的数据质量以及它们如何影响周期时间。
获取2D数据有两种方法:
通过
camera.capture(Zivid::Settings2D).imageRGBA()
进行单独的 2D 捕获,请参阅 2D图像捕获流程 。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 捕获 |
Zivid 2 |
Zivid 2+ |
---|---|---|
全分辨率 |
1944×1200 |
2448×2048 |
2x2 子采样 |
972×600 |
1224×1024 |
4x4 子采样 |
不支持 |
612×512 |
3D 捕获 |
Zivid 2 |
Zivid 2+ |
---|---|---|
全分辨率 [1] |
1944×1200 |
2448×2048 |
2x2 子采样 [1] |
972×600 |
1224×1024 |
4x4 子采样 [1] |
不支持 |
612×512 |
2D 和 3D 捕获的输出分辨率是由 Sampling::Pixel
和 Processing::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 |
添加了对 |