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采集期间关闭外部光源。

除了减少光晕效应外,高照度的外部光源还可以消除由环境光变化引起的曝光变化。环境光变化的典型来源有:

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

  • 开门和关门

  • 顶灯打开和关闭

这些曝光变化对3D和2D数据的影响不同。2D数据中曝光变化的影响取决于所使用的检测算法。如果在2D中执行分割,这些变化可能会,也可能不会影响分割性能。对于点云,您可能会发现由于噪声的变化而导致点云完整性的变化。

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

如何决定是否使用投影仪作为2D捕获的光源。

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

On Zivid One+ it is important to be aware of the switching penalty that occurs when the projector is on during 2D capture. This time-penalty only happens if the 2D capture settings use brightness > 0. For more information, see 在2D和3D捕获调用之间切换时按顺序执行捕获的限制.

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

2D数据先于3D数据

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

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

  1. 捕获2D图像

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

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

跳转到源码

source

const auto frame2dAndCaptureTime = captureAndMeasure<Zivid::Frame2D>(camera, settings2D);
std::future<Duration> userThread =
    std::async(std::launch::async, useFrame<Zivid::Frame2D>, std::ref(frame2dAndCaptureTime.frame));
const auto frameAndCaptureTime = captureAndMeasure<Zivid::Frame>(camera, settings);
const auto processTime = useFrame(frameAndCaptureTime.frame);
const auto processTime2D = userThread.get();

下表列出了不同场景的预期性能。

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

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

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

使用投影仪进行2D采集

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

使用投影仪进行2D采集

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

Zivid One+

2D

~400 毫秒 [3]

~30 毫秒

~30 毫秒

~30 毫秒

3D

~700 毫秒 [2]

~130 毫秒

~700 毫秒 [2]

~130 毫秒

Zivid 2

2D

~50 毫秒

~35 毫秒

~30 毫秒

~25 毫秒

3D

~140 毫秒

~130 毫秒

~140 毫秒

~130 毫秒

备注

在同一相机上任何正在进行的捕获(2D 或 3D)的所有处理完成之前,不会开始新的捕获。当使用同一台相机连续调用两个捕获时,这会影响事件的进程。如需了解更多相关信息,请参阅 使用同一台相机进行连续拍照的性能限制

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

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

速度

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

2D图像质量

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

Following is a table that shows what you can expect from the different configurations. At the end you will find a table showing actual measurements on different hardware.

快速

使用来自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]

Zivid One+

2D

N/A

~400 毫秒

~50 毫秒

N/A

3D

~120 毫秒

~120 毫秒

~120 毫秒

~800 毫秒

Zivid 2

2D

N/A

~95 毫秒

~90 毫秒

N/A

3D

~120 毫秒

~120 毫秒

~120 毫秒

~450 毫秒

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

作为3D采集的一部分,您总是能够获得2D数据。下表展示了3D捕获时间的示例。

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

消费品设置

Intel UHD i5G1

NVIDIA 4070

Intel UHD 770

Low-end [6]

High-end [7]

No data available.

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

消费品设置

Intel UHD 750

Intel UHD i3G1

NVIDIA 3070

High-end [8]

Low-end [9]

High-end [10]

Z2 M70 Fast

757 (±15) ms

1186 (±11) ms

305 (±5) ms

Z2 L100 Fast

746 (±13) ms

1184 (±11) ms

305 (±6) ms

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

消费品设置

Intel UHD 750

Intel UHD i3G1

NVIDIA 3070

High-end [11]

Low-end [12]

High-end [13]

Z1+ M Fast

868 (±6) ms

1299 (±4) ms

358 (±2) ms

Z1+ L Fast

867 (±6) ms

1296 (±4) ms

359 (±1) ms

然而,对3D图像质量进行的设置优化并不总是对2D图像质量有效。因此,在3D捕获之后进行单独的2D捕获可能是个好主意。下表列出了对于不同场景的预期表现。

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

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

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

使用投影仪进行2D采集

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

使用投影仪进行2D采集

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

Zivid One+

3D

~700 毫秒 [15]

~120 毫秒

~120 毫秒

~120 毫秒

2D

~400 毫秒 [16]

~30 毫秒

~400 毫秒 [16]

~30 毫秒

Zivid 2

3D

~140 毫秒

~140 毫秒

~120 毫秒

~120 毫秒

2D

~50 毫秒

~35 毫秒

~50 毫秒

~35 毫秒

备注

在同一相机上任何正在进行的捕获(2D 或 3D)的所有处理完成之前,不会开始新的捕获。当使用同一台相机连续调用两个捕获时,这会影响事件的进程。如需了解更多相关信息,请参阅 使用同一台相机进行连续拍照的性能限制

总结

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

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

  • Cycle time is slow enough to allow an additional dummy capture between each capture cycle (only relevant for Zivid One+). An additional capture can take up to 800ms in the worst case. A rule of thumb is that for cycle time greater than 2 seconds a dummy capture saves time.

背靠背捕获

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

速度

2D质量

Zivid One+

Zivid 2

3D ➞ 2D [18]

最慢

快速

最好

2D ➞ 3D [17]

慢速

较快

最好

3D (w/2D [20])

快速

快速

较好

3D

最快

最快

良好

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

低占空比捕获

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

速度

2D质量

Zivid One+

Zivid 2

3D ➞ 2D [18] ➞ 3D ([19])

慢速

快速

最好

2D ➞ 3D [17] ➞ 2D ([19])

良好

较快

最好

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

快速

快速

最好

3D ➞ 3D

最快

最快

良好

Following is a table showing actual measurements on different hardware. For the 3D capture we use the Fast Consumer Goods settings.

Zivid 2+

(Z2+ M130 Fast)

Zivid 2

(Z2 M70 Fast)

Zivid One+

(Z1+ M Fast)

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

2D+3D 捕获

Intel UHD i5G1

NVIDIA 4070

Intel UHD 770

[21]

[22]

Low-end [23]

High-end [24]

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

2D

74 (±7) ms

73 (±1) ms

75 (±0.3) ms

3D

1951 (±198) ms

605 (±2) ms

1301 (±2) ms

2D

81 (±23) ms

81 (±0.4) ms

81 (±0.4) ms

3D

1980 (±9) ms

634 (±5) ms

1334 (±3) ms

2D

74 (±0.4) ms

73 (±1) ms

74 (±0.3) ms

3D

1968 (±151) ms

605 (±2) ms

1302 (±2) ms

2D

43 (±20) ms

43 (±0.4) 毫秒

43 (±0.5) ms

3D

1966 (±8) ms

606 (±3) ms

1307 (±3) ms

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

2D

74 (±0.4) ms

74 (±1) ms

75 (±0.3) ms

3D

1944 (±257) ms

605 (±2) ms

1303 (±2) ms

2D

85 (±16) ms

83 (±0.3) ms

86 (±0.4) ms

3D

1817 (±540) ms

593 (±2) ms

1251 (±2) ms

2D

73 (±7) ms

73 (±1) ms

74 (±0.3) ms

3D

1963 (±192) ms

606 (±5) ms

1303 (±2) ms

2D

74 (±76) ms

71 (±0.3) ms

74 (±0.3) ms

3D

1780 (±500) ms

554 (±2) ms

1212 (±2) ms

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

2D

0 (±0.0) 毫秒

0 (±0.0) 毫秒

0 (±0.0) 毫秒

3D

3997 (±269) ms

1741 (±3) ms

2516 (±2) ms

2D

0 (±0.0) 毫秒

0 (±0.0) 毫秒

0 (±0.0) 毫秒

3D

3948 (±269) ms

1741 (±8) ms

2516 (±8) ms

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

2D+3D 捕获

Intel UHD 750

Intel UHD i3G1

NVIDIA 3070

[25]

[26]

High-end [27]

Low-end [28]

High-end [29]

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

2D

52 (±1) ms

52 (±0.4) ms

50 (±1) ms

3D

814 (±7) ms

1259 (±8) ms

363 (±5) ms

2D

25 (±0.5) ms

25 (±0.3) ms

25 (±0.5) ms

3D

813 (±7) ms

1261 (±8) ms

361 (±3) ms

2D

50 (±1) ms

51 (±0.5) ms

49 (±1) ms

3D

815 (±7) ms

1257 (±6) ms

363 (±5) ms

2D

13 (±0.2) ms

13 (±0.2) ms

13 (±0.2) ms

3D

813 (±6) ms

1256 (±8) ms

361 (±4) ms

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

2D

51 (±1) ms

52 (±0.4) ms

50 (±1) ms

3D

800 (±4) ms

1242 (±8) ms

363 (±5) ms

2D

47 (±0.3) ms

48 (±0.5) ms

46 (±0.3) ms

3D

779 (±2) ms

1228 (±9) ms

353 (±3) ms

2D

50 (±1) ms

51 (±0.4) ms

49 (±1) ms

3D

799 (±4) ms

1242 (±6) ms

362 (±5) ms

2D

40 (±0.3) ms

43 (±0.3) ms

40 (±0.3) ms

3D

739 (±3) ms

1189 (±72) ms

312 (±4) ms

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

2D

0 (±0.0) 毫秒

0 (±0.0) 毫秒

0 (±0.0) 毫秒

3D

817 (±3) ms

1345 (±9) ms

395 (±2) ms

2D

0 (±0.0) 毫秒

0 (±0.0) 毫秒

0 (±0.0) 毫秒

3D

822 (±7) ms

1374 (±331) ms

397 (±5) ms

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

2D+3D 捕获

Intel UHD 750

Intel UHD i3G1

NVIDIA 3070

[30]

[31]

High-end [32]

Low-end [33]

High-end [34]

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

2D

419 (±0.7) ms

421 (±0.6) ms

418 (±0.6) ms

3D

1381 (±7) ms

1829 (±9) ms

880 (±5) ms

2D

24 (±0.5) ms

24 (±0.3) ms

24 (±0.5) ms

3D

1380 (±7) ms

1829 (±6) ms

880 (±5) ms

2D

73 (±0.7) ms

75 (±0.6) ms

73 (±0.5) ms

3D

856 (±8) ms

1291 (±4) ms

339 (±2) ms

2D

24 (±0.5) ms

24 (±0.4) ms

24 (±0.3) ms

3D

844 (±8) ms

1286 (±4) ms

337 (±1) ms

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

2D

419 (±0.6) ms

421 (±0.6) ms

418 (±0.6) ms

3D

1380 (±10) ms

1822 (±9) ms

878 (±5) ms

2D

419 (±0.6) ms

421 (±0.7) ms

418 (±0.5) ms

3D

876 (±7) ms

1271 (±4) ms

368 (±2) ms

2D

73 (±0.5) ms

75 (±0.6) ms

73 (±0.5) ms

3D

849 (±7) ms

1282 (±5) ms

338 (±2) ms

2D

73 (±0.5) ms

75 (±0.6) ms

73 (±0.5) ms

3D

876 (±6) ms

1269 (±4) ms

368 (±2) ms

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

2D

0 (±0.0) 毫秒

0 (±0.0) 毫秒

0 (±0.0) 毫秒

3D

1378 (±47) ms

1797 (±44) ms

924 (±42) ms

2D

0 (±0.0) 毫秒

0 (±0.0) 毫秒

0 (±0.0) 毫秒

3D

1389 (±48) ms

1824 (±44) ms

922 (±42) ms

小技巧

To test different 2D-3D strategies on your PC, you can run ZividBenchmark.cpp sample with settings loaded from YML files. Go to 示例, and select C++ for instructions.