2D+3D捕获策略

如果您的应用同时需要2D和3D数据,那么您可以参考本教程。

我们解释并强调了不同的2D-3D捕获方法的优缺点,阐明了一些限制,并解释了它们如何影响循环时间。我们也谈到了使用外部光源和使用内部投影仪来拍摄2D图像的区别。

2D数据

RGB图像

3D数据

点云

获取2D数据有两种不同的方式:

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

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

使用哪一种方式来获取2D数据取决于您的要求。

不同的场景会导致不同的权衡。我们首先根据您需要的数据对其进行细分。然后我们将讨论不同场景下捕获速度与图像质量的权衡。

关于外部光源

在我们讨论不同的策略之前,我们需要讨论外部光源。2D捕获的理想光源是强漫射光,因为这会限制光晕效果。使用内部投影仪作为光源时,光晕效果几乎是不可避免的。以一定角度安装相机可显着降低这种影响,但外部漫射光源仍然会提供更好的效果。外部光源会导致3D数据中出现额外噪声,因此最好在3D采集期间关闭外部光源。

In addition to the reduction in blooming effects, strong external light can smooth out variations in exposure due to variations in ambient light. Typical sources for variations in ambient light:

  • 日光变化(白天/黑夜、云等)

  • 开门和关门

  • 顶灯打开和关闭

Such variations in exposure impact 3D and 2D data differently. The impact of exposure variations in the 2D data depends on the detection algorithm used. If segmentation is performed in 2D, then these variations may or may not impact segmentation performance. For the point cloud, you may find variations in point cloud completeness due to variations in noise.

这就引出了一个问题:我们是否应该使用相机的投影仪来捕获2D图像?

How to decide whether or not to use the projector as the light for 2D capture.

查看 优化彩色图像 了解有关该主题的更多信息。

对于Zivid One+,一个重要的问题是要注意在2D捕获期间投影仪打开时发生的切换限制。具体请参阅 在2D和3D捕获调用之间切换时按顺序执行捕获的限制

如果每个捕获周期之间有足够的时间预算,则可以减轻切换限制。我们可以在系统做其他事情时进行该切换动作。例如,当机器人在相机前方移动时。在本教程中,我们将其称为虚拟捕获(dummy capture)。

2D数据先于3D数据

如果您在2D中执行分割,然后确定您的抓取位姿,那么您需要在获取3D之前得到2D数据。获取2D数据的最快方法是使用单独的2D捕获。因此,如果您在使用3D数据之前就需要使用2D数据,那么您应该先执行单独的2D捕获。

以下代码示例展示了您可以如何:

  1. 捕获2D图像

  2. 使用2D数据和并行执行3D捕获

  3. 如果工作周期允许:可以在不影响整体表现的情况下执行虚拟捕获,避免切换带来的时间损失。

跳转到源

source

auto camera = zivid.connectCamera();
dummyCapture2D(camera, settings2D);
const auto frame2dAndCaptureTime = captureAndMeasure<Zivid::Frame2D>(camera, settings2D);
std::cout
    << "Starting 3D capture in current thread and using 2D data in separate thread, such that the two happen in parallel"
    << std::endl;
std::future<void> userThread =
    std::async(std::launch::async, useFrame<Zivid::Frame2D>, std::ref(frame2dAndCaptureTime.frame));
const auto frameAndCaptureTime = captureAndMeasure<Zivid::Frame>(camera, settings);
useFrame(frameAndCaptureTime.frame);
std::cout << "Wait for usage of 2D frame to finish" << std::endl;
userThread.get();
printCaptureFunctionReturnTime(frame2dAndCaptureTime.captureTime, frameAndCaptureTime.captureTime);

Following is a table with the expected performance for the different scenarios.

使用的硬件平台:11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz 和 NVIDIA GeForce RTX 3070

3D捕获后立即执行2D捕获,背靠背执行捕获

3D捕获后执行2D捕获,有延迟 [1]

使用投影仪进行2D采集

不使用投影仪进行2D采集

使用投影仪进行2D采集

不使用投影仪进行2D采集

One+

2D

~400 ms [3]

~30 ms

~30 ms

~30 ms

3D

~700 ms [2]

~130 ms

~700 ms [2]

~130 ms

Two

2D

~50 毫秒

~35 ms

~30 ms

~25 ms

3D

~140 ms

~130 ms

~140 ms

~130 ms

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

在这种情况下,我们不必在使用3D数据之前获取2D数据。作为3D采集的一部分,您始终会获得2D数据。因此,我们只需要关心整体捕获速度和图像质量。

速度

为了获得最佳速度,我们仅依靠3D采集来获取良好的2D数据。2D数据无需额外采集或单独采集。

2D图像质量

为获得最佳的2D图像质量,建议使用一个单独的采集项。这可以通过上一节中讨论的单独的2D捕获来实现,也可以通过 使用UseFirstAcquisition的HDR捕获 来实现。为了获取更好的颜色数据而在3D HDR捕获中添加一个单独的采集项,在速度方面可能代价高昂。这是因为曝光需要乘以投影数量,投影数量由 Vision Engine(视觉引擎) 决定。该限制可能会在未来的SDK更新中移除。

下面的表格是不同配置下的预估数据。您可以在文章末尾的部分找到一张表格,里面包含了不同硬件上的实际测量值,其相机设置参数为适用于Zivid Two M70的快速单品拣选拾取设置(Fast Piece Picking settings)( Z2 M70 Fast )。

快速

使用来自3D捕获中的2D数据。无需特殊的2D采集或设置。

较快速

单独的2D捕获,紧接着执行3D捕获。

慢速

添加了一个专为获得最佳2D数据而进行特殊设置的额外采集项的3D捕获。

使用的硬件平台:11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz 和 NVIDIA GeForce RTX 3070

快速

较快速

慢速

3D [4]

2D使用投影仪 + 3D

2D不使用投影仪 + 3D

3D(+1 for 2D) [5]

One+

2D

N/A

~400 毫秒

~50 毫秒

N/A

3D

~120 毫秒

~120 毫秒

~120 毫秒

~800 毫秒

Two

2D

N/A

~95 毫秒

~90 毫秒

N/A

3D

~120 毫秒

~120 毫秒

~120 毫秒

~450 毫秒

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

You always get 2D data as part of a 3D acquisition. The table below shows 3D capture time examples.

以毫秒为单位的预期中位数 (±stddev)

单品拣选应用的设置

Zivid One+

Zivid Two

Intel UHD 750

Intel UHD G1

NVIDIA 3070

Intel UHD 750

Intel UHD G1

NVIDIA 3070

High-end [6]

Low-end [7]

High-end [8]

High-end [6]

Low-end [7]

High-end [8]

Z2 M70 Fast

N/A

N/A

N/A

233 (±3) ms

421 (±274) ms

112 (±0.7) ms

Z2 L100 Fast

N/A

N/A

N/A

230 (±3) ms

428 (±291) ms

112 (±0.7) ms

Z1+ M Fast

231 (±3) ms

329 (±2) ms

112 (±2) ms

N/A

N/A

N/A

Z1+ L Fast

230 (±3) ms

328 (±1) ms

112 (±0.7) ms

N/A

N/A

N/A

However, optimizing for 3D quality does not always optimize for 2D quality. Thus, it might be a good idea to have a separate 2D capture after the 3D capture. Following is a table with the expected performance for the different scenarios.

使用的硬件平台:11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz 和 NVIDIA GeForce RTX 3070

3D followed by 2D, back-to-back

3D followed by 2D, with delay [9]

使用投影仪进行2D采集

不使用投影仪进行2D采集

使用投影仪进行2D采集

不使用投影仪进行2D采集

One+

3D

~700 ms [10]

~120 毫秒

~120 毫秒

~120 毫秒

2D

~400 ms [11]

~30 ms

~400 ms [11]

~30 ms

Two

3D

~140 ms

~140 ms

~120 毫秒

~120 毫秒

2D

~50 毫秒

~35 ms

~50 毫秒

~35 ms

总结

下表列出了不同的2D+3D捕获的配置,并列出了这些不同配置在速度和图像质量方面的相对表现。我们将应用分为两种情况:

  • 循环时间非常快,每个捕获循环都需要紧接着上一个捕获循环发生。

  • 循环时间足够慢,允许在每个捕获循环之间进行额外的虚拟捕获。在最坏的情况下,额外的捕获最多可能需要800毫秒。从经验来看,对于循环时间大于2秒的应用,虚拟捕获可以节省时间。

背靠背捕获

捕获循环(循环之间无等待时间)

速度

2D质量

One+

Two

3D ➞ 2D [13]

最慢

快速

最好

2D ➞ 3D [12]

慢速

快速

最好

3D (w/2D [15])

快速

快速

较好

3D

最快

最快

良好

对于背靠背捕获的场景,除非投影仪亮度的设置相同,否则无法避免切换带来的延迟。在这种情况下,最好将颜色模式设置为 UseFirstAcquisition ,请参阅 Color Mode

低占空比捕获

捕获循环(等待下一个循环的时间)

速度

2D质量

One+

Two

3D ➞ 2D [13] ➞ 3D ([14])

慢速

快速

最好

2D ➞ 3D [12] ➞ 2D ([14])

良好

快速

最好

3D (w/2D [15]) ➞ 3D (w/2D [15])

快速

快速

最好

3D ➞ 3D

最快

最快

良好

下表展示了使用适用于Zivid Two M70的快速单品拣选设置 ( Z2 M70 Fast ) 在不同硬件上的实际测量值。

备注

我们使用了快速单品拣选设置,这些设置分别适用于Zivid Two ( Z2 M70 Fast )和Zivid One+ ( Z1+ M Fast ) 。

以毫秒为单位的预期中位数 (±stddev)

2D+3D 捕获

Zivid One+

Zivid Two

Intel UHD 750

Intel UHD G1

NVIDIA 3070

Intel UHD 750

Intel UHD G1

NVIDIA 3070

[16]

[17]

High-end [18]

Low-end [19]

High-end [20]

High-end [18]

Low-end [19]

High-end [20]

先捕获2D图像,再捕获3D图像

2D

385 (±2) ms

392 (±0.9) ms

378 (±2) ms

54 (±4) ms

77 (±4) ms

48 (±6) ms

3D

787 (±7) ms

886 (±5) 毫秒

665 (±6) ms

257 (±3) ms

456 (±286) ms

137 (±0.8) ms

2D

32 (±1) ms

41 (±0.7) ms

28 (±2) ms

37 (±5) ms

57 (±5) 毫秒

28 (±3) ms

3D

784 (±10) ms

884 (±5) ms

671 (±5) 毫秒

258 (±3) ms

457 (±308) ms

137 (±0.4) ms

2D

37 (±0.5) ms

46 (±0.5) ms

31 (±0.9) ms

40 (±2) ms

65 (±5) ms

35 (±5) ms

3D

240 (±3) ms

343 (±2) ms

121 (±1) ms

252 (±3) ms

452 (±328) ms

132 (±0.7) ms

2D

31 (±1) ms

42 (±0.6) ms

30 (±3) ms

28 (±4) ms

51 (±4) ms

23 (±2) ms

3D

240 (±3) ms

342 (±2) ms

129 (±1) ms

252 (±3) ms

452 (±309) ms

132 (±0.4) ms

先捕获3D图像,再捕获2D图像

2D

386 (±2) ms

392 (±0.8) ms

377 (±2) ms

50 (±1) ms

77 (±71) ms

49 (±6) ms

3D

787 (±6) ms

886 (±5) 毫秒

666 (±8) ms

253 (±3) ms

456 (±285) ms

138 (±0.8) ms

2D

385 (±2) ms

392 (±0.8) ms

379 (±2) ms

50 (±3) ms

75 (±4) ms

45 (±5) ms

3D

239 (±3) ms

339 (±3) ms

120 (±1) ms

242 (±3) ms

443 (±206) ms

119 (±0.4) ms

2D

37 (±0.6) 毫秒

47 (±0.4) ms

31 (±1) ms

42 (±3) ms

65 (±99) ms

36 (±5) ms

3D

239 (±3) ms

344 (±2) ms

121 (±1) ms

253 (±3) ms

451 (±307) ms

132 (±0.4) ms

2D

37 (±0.4) ms

46 (±0.6) ms

31 (±0.9) ms

40 (±2) ms

63 (±71) ms

35 (±5) ms

3D

238 (±3) 毫秒

340 (±4) ms

120 (±2) 毫秒

238 (±3) 毫秒

445 (±280) ms

119 (±0.5) ms

捕获包含2D数据的3D图像

2D

0 (±0.0) 毫秒

0 (±0.0) 毫秒

0 (±0.0) 毫秒

0 (±0.0) 毫秒

0 (±0.0) 毫秒

0 (±0.0) 毫秒

3D

810 (±6) ms

960 (±8) ms

671 (±3) ms

354 (±5) ms

701 (±344) ms

209 (±1) ms

2D

0 (±0.0) 毫秒

0 (±0.0) 毫秒

0 (±0.0) 毫秒

0 (±0.0) 毫秒

0 (±0.0) 毫秒

0 (±0.0) 毫秒

3D

812 (±9) ms

962 (±8) ms

675 (±8) ms

358 (±5) ms

705 (±368) ms

212 (±1) ms

小技巧

如果您想在您的PC上测试不同的2D-3D策略,您可以从YML文件加载设置并运行 Capture2D+3D.cpp 示例。您可以打开 示例 页面,然后选择C++标题来阅读相关说明。