2D+3D捕获策略
如果您的应用同时需要2D和3D数据,那么您可以参考本教程。
我们解释并强调了不同的2D-3D捕获方法的优缺点,阐明了一些限制,并解释了它们如何影响循环时间。我们也谈到了使用外部光源和使用内部投影仪来拍摄2D图像的区别。
- 2D数据
RGB图像
- 3D数据
获取2D数据有两种不同的方式:
单独通过
camera.capture(Zivid::Settings2D).imageRGBA()
获取,请参阅 2D图像捕获流程 。作为3D捕获的一部分
camera.capture(Zivid::Settings).pointCloud.copyImageRGBA()
,请参阅 点云捕获过程 。
使用哪一种方式来获取2D数据取决于您的要求。
不同的场景会导致不同的权衡。我们首先根据您需要的数据对其进行细分。然后我们将讨论不同场景下捕获速度与图像质量的权衡。
关于外部光源
在我们讨论不同的策略之前,我们需要讨论外部光源。2D捕获的理想光源是强漫射光,因为这会限制 光晕效果 。使用内部投影仪作为光源时,光晕效果几乎是不可避免的。 以一定角度安装相机 可显着降低这种影响,但外部漫射光源仍然会提供更好的效果。外部光源会导致3D数据中出现额外噪声,因此最好在3D采集期间关闭外部光源。
除了减少光晕效应外,高照度的外部光源还可以消除由环境光变化引起的曝光变化。环境光变化的典型来源有:
日光变化(白天/黑夜、云等)
开门和关门
顶灯打开和关闭
这些曝光变化对3D和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捕获。
以下代码示例展示了您可以如何:
捕获2D图像
使用2D数据和并行执行3D捕获
如果工作周期允许:可以在不影响整体表现的情况下执行虚拟捕获,避免切换带来的时间损失。
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();
下表列出了不同场景的预期性能。
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捕获。
快速 |
较快速 |
慢速 |
|||
---|---|---|---|---|---|
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 毫秒 |
使用适用于Zivid 2 M70的快速消费品设置( Z2 M70 Fast
)。
使用适用于Zivid 2 M70的快速消费品设置 ( Z2 M70 Fast
) 以及一个额外的使用或不使用投影仪的2D采集项。我们将2D采集放置到第一个采集项的位置,并将颜色设置更改为 UseFirstAcquisition
。
2D数据在使用3D数据之后
作为3D采集的一部分,您总是能够获得2D数据。下表展示了3D捕获时间的示例。
消费品设置 |
Intel UHD i5G1 |
NVIDIA 4070 |
Intel UHD 770 |
---|---|---|---|
Low-end [6] |
High-end [7] |
||
No data available. |
Low-end machine with GPU: Intel UHD Graphics i5 G1 (ID:0x8A56) and CPU: Intel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz, 1GbE
High-end machine with GPU: Intel UHD Graphics 770 and CPU: 13th Gen Intel(R) Core(TM) i9-13900K, 10GbE
消费品设置 |
Intel UHD 750 |
Intel UHD i3G1 |
NVIDIA 3070 |
---|---|---|---|
High-end [8] |
Low-end [9] |
High-end [10] |
|
757 (±15) ms |
1186 (±11) ms |
305 (±5) ms |
|
746 (±13) ms |
1184 (±11) ms |
305 (±6) ms |
搭载了GPU:Intel UHD Graphics 750 (ID:0x4C8A) 和 CPU:11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz, 10GbE 的高端机器
Low-end machine with GPU: Intel UHD Graphics i3 G1 (ID:0x8A56) and CPU: Intel(R) Core(TM) i3-1005G1 CPU @ 1.20GHz, 1GbE
搭载了GPU:NVIDIA GeForce RTX 3070 和 CPU:11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz, 10GbE 的高端机器
消费品设置 |
Intel UHD 750 |
Intel UHD i3G1 |
NVIDIA 3070 |
---|---|---|---|
High-end [11] |
Low-end [12] |
High-end [13] |
|
868 (±6) ms |
1299 (±4) ms |
358 (±2) ms |
|
867 (±6) ms |
1296 (±4) ms |
359 (±1) ms |
搭载了GPU:Intel UHD Graphics 750 (ID:0x4C8A) 和 CPU:11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz, 10GbE 的高端机器
Low-end machine with GPU: Intel UHD Graphics i3 G1 (ID:0x8A56) and CPU: Intel(R) Core(TM) i3-1005G1 CPU @ 1.20GHz, 1GbE
搭载了GPU:NVIDIA GeForce RTX 3070 和 CPU:11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz, 10GbE 的高端机器
然而,对3D图像质量进行的设置优化并不总是对2D图像质量有效。因此,在3D捕获之后进行单独的2D捕获可能是个好主意。下表列出了对于不同场景的预期表现。
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捕获时,对于One+相机有350毫秒的2D➞3D切换时间延迟,具体请参阅 在2D和3D捕获调用之间切换时按顺序执行捕获的限制 。
当使用投影仪进行2D捕获时,对于One+相机有650毫秒的3D➞2D切换时间延迟,具体请参阅 在2D和3D捕获调用之间切换时按顺序执行捕获的限制 。
备注
在同一相机上任何正在进行的捕获(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 ➞ 3D |
最快 |
最快 |
良好 |
当使用投影仪进行2D捕获时,对于One+相机有350毫秒的2D➞3D切换时间延迟,具体请参阅 在2D和3D捕获调用之间切换时按顺序执行捕获的限制 。
当使用投影仪进行2D捕获时,对于One+相机有650毫秒的3D➞2D切换时间延迟,具体请参阅 在2D和3D捕获调用之间切换时按顺序执行捕获的限制 。
(适用于 One+)对于低占空比的应用,我们可以附加一个虚拟2D/3D捕获,以将3D➞2D/2D➞3D切换带来的延迟从关键环节移除。
将2D采集置于第一项的3D捕获,并将颜色模式设置为 UseFirstAcquisition
,请参阅 Color Mode 。
Following is a table showing actual measurements on different hardware. For the 3D capture we use the Fast Consumer Goods settings.
- Zivid 2+
- Zivid 2
- Zivid One+
2D+3D 捕获 |
Intel UHD i5G1 |
NVIDIA 4070 |
Intel UHD 770 |
||
---|---|---|---|---|---|
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 |
使用了投影仪进行2D捕获。
背靠背捕获或者捕获循环之间存在延迟。这允许消除潜在的初始切换的时间损失。
Low-end machine with GPU: Intel UHD Graphics i5 G1 (ID:0x8A56) and CPU: Intel(R) Core(TM) i5-1035G1 CPU @ 1.00GHz, 1GbE
High-end machine with GPU: Intel UHD Graphics 770 and CPU: 13th Gen Intel(R) Core(TM) i9-13900K, 10GbE
2D+3D 捕获 |
Intel UHD 750 |
Intel UHD i3G1 |
NVIDIA 3070 |
||
---|---|---|---|---|---|
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 |
使用了投影仪进行2D捕获。
背靠背捕获或者捕获循环之间存在延迟。这允许消除潜在的初始切换的时间损失。
搭载了GPU:Intel UHD Graphics 750 (ID:0x4C8A) 和 CPU:11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz, 10GbE 的高端机器
Low-end machine with GPU: Intel UHD Graphics i3 G1 (ID:0x8A56) and CPU: Intel(R) Core(TM) i3-1005G1 CPU @ 1.20GHz, 1GbE
搭载了GPU:NVIDIA GeForce RTX 3070 和 CPU:11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz, 10GbE 的高端机器
2D+3D 捕获 |
Intel UHD 750 |
Intel UHD i3G1 |
NVIDIA 3070 |
||
---|---|---|---|---|---|
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 |
使用了投影仪进行2D捕获。
背靠背捕获或者捕获循环之间存在延迟。这允许消除潜在的初始切换的时间损失。
搭载了GPU:Intel UHD Graphics 750 (ID:0x4C8A) 和 CPU:11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz, 10GbE 的高端机器
Low-end machine with GPU: Intel UHD Graphics i3 G1 (ID:0x8A56) and CPU: Intel(R) Core(TM) i3-1005G1 CPU @ 1.20GHz, 1GbE
搭载了GPU:NVIDIA GeForce RTX 3070 和 CPU:11th Gen Intel(R) Core(TM) i9-11900K @ 3.50GHz, 10GbE 的高端机器
小技巧
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.